ZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2U0YmY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmNfc3NlIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9hcGFjaGUveGVyY2VzLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvYXBhY2hlL3hhbGFuLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvYXBhY2hlL3htbC8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2FwYWNoZS94cGF0aC8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0iKm9yZy9lY2xpcHNlL3dzdC94c2wvKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY0ZjZkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1zcmNfeHBhdGgKLXhwYXRoZ3JhbW1hcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJjMjUyNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC54c2wuY29yZTwvbmFtZT4KLQk8Y29tbWVudD5KYXZhQ0MgTmF0dXJlPC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5zZi5lY2xpcHNlLmphdmFjYy5qYXZhY2NidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLmFwaS50b29scy5hcGlBbmFseXNpc0J1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+c2YuZWNsaXBzZS5qYXZhY2MuamF2YWNjbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLmFwaS50b29scy5hcGlBbmFseXNpc05hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2NiNGVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLSNUdWUgRmViIDEwIDA1OjM3OjUzIEdNVCAyMDA5Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmNvbXBhcmluZ0lkZW50aWNhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlYWRDb2RlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYXRhbE9wdGlvbmFsRXJyb3I9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSGFzaENvZGVNZXRob2Q9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXByb3RlY3RlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ0Rlc2NyaXB0aW9uPXJldHVybl90YWcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByb3RlY3RlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTeW5jaHJvbml6ZWRPbkluaGVyaXRlZE1ldGhvZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG90ZW50aWFsTnVsbFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50U3VwZXJpbnRlcmZhY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uRXhlbXB0RXhjZXB0aW9uQW5kVGhyb3dhYmxlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25JbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uSW5jbHVkZVVuY2hlY2tlZEV4Y2VwdGlvbnM9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJJbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI2NDVmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIE1hciAxOCAxMTozODowNSBHTVQgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04IiBzdGFuZGFsb25lXD0ibm8iPz48dGVtcGxhdGVzLz4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlMTU2ZmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLlhTTENvcmVQbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXI7YnVuZGxlLXZlcnNpb249IlsxLjEuMzAxLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjMwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMzAwLDIuMC4wKSIsCi0gb3JnLmFwYWNoZS5hbnQ7YnVuZGxlLXZlcnNpb249IlsxLjcuMCwyLjAuMCkiO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjEwMywyLjAuMCkiLAotIG9yZy5hcGFjaGUueGFsYW47YnVuZGxlLXZlcnNpb249IlsyLjcuMSwyLjguMCkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwueHBhdGguY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uub3NnaS51dGlsO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlO3VzZXM6PSJvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwubW9kZWwsb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIiwKLSBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzbC4qIiwKLSBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwuYW50O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLmVuY29kaW5nO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2wuKiIsCi0gb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNsLioiLAotIG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC5wYXJzZXI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzbC4qIiwKLSBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzbC4qIiwKLSBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzbC4qIiwKLSBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwucmVnaW9uczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNsLioiLAotIG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC50ZXh0O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2wuKiIsCi0gb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLnRleHQucnVsZXM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzbC4qIiwKLSBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwudXRpbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNsLioiLAotIG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2wuKiIsCi0gb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNsLioiLAotIG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC54aW5jbHVkZTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNsLioiLAotIG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5tb2RlbCwKLSBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUucmVzb2x2ZXI7Ci0gIHVzZXM6PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLAotICAgb3JnLnhtbC5zYXgsCi0gICBvcmcueG1sLnNheC5leHQsCi0gICBvcmcueG1sLnNheC5oZWxwZXJzLAotICAgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkxZDcxNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi0JCQotPGgzPlRoaXJkIFBhcnR5IENvbnRlbnQ8L2gzPgotPHA+VGhlIENvbnRlbnQgaW5jbHVkZXMgaXRlbXMgdGhhdCBoYXZlIGJlZW4gc291cmNlZCBmcm9tIHRoaXJkIHBhcnRpZXMgYXMgc2V0IG91dCBiZWxvdy4gSWYgeW91IAotZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBmb2xsb3dpbmcgaXMgcHJvdmlkZWQgCi1mb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5LCBhbmQgeW91IHNob3VsZCBsb29rIHRvIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSBmb3IgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UuPC9wPgotPHA+Ci08c3Ryb25nPlhTTFQgYW5kIFhJbmNsdWRlIFNjaGVtYTwvc3Ryb25nPiA8YnIvPjxici8+Ci0KLVRoZSBmb2xsb3dpbmcgWE1MIFNjaGVtYSBpbiB0aGUgcGx1Zy1pbiBhcmUgYmFzZWQgb24gVzNDIGNvZGUgYXZhaWxhYmxlIG9uIHRoZSBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtIHdlYnNpdGUKLWFuZCBzaGFsbCBiZSBkZWZpbmVkIGFzIHRoZSAiVzNDLURlcml2ZWQgV29yayI6PGJyLz48YnIvPgotCi14c2x0LXNjaGVtYXMveHNsdC0xLjAueHNkIChkZXJpdmVkIGZyb20gPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvWE1MLzIwMDAvMDRzY2hlbWEtaGFja2luZy94c2x0LnhzZCI+VzNDIFhTTFQgMS4wIFNjaGVtYTwvYT4pPGJyLz4KLXhzbHQtc2NoZW1hcy94c2x0LTIuMC54c2QgKGRlcml2ZWQgZnJvbSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzAyL3NjaGVtYS1mb3IteHNsdDIwLnhzZCI+VzNDIFhTTFQgMi4wIFNjaGVtYTwvYT4pPGJyLz4KLXhzbHQtc2NoZW1hcy94aW5jbHVkZS54c2QgKGNvcGllZCBmcm9tIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hpbmNsdWRlLyI+WEluY2x1ZGUgU2NoZW1hPC9hPik8YnIvPjxici8+Ci0KLVlvdXIgdXNlIG9mIHRoZSBXM0MtRGVyaXZlZCBXb3JrIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBXM0MgU29mdHdhcmUgTGljZW5zZS48YnIvPiAKLUEgY29weSBvZiB0aGUgbGljZW5zZSBpcyBjb250YWluZWQgaW4gdGhlIGZpbGUgPGEgaHJlZj0iYWJvdXRfZmlsZXMvVzNDU29mdHdhcmVMaWNlbnNlLmh0bWwiPlczQ1NvZnR3YXJlTGljZW5zZS5odG1sPC9hPiBhbmQgaXMgCi1hbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsLzIwMDIvY29weXJpZ2h0LXNvZnR3YXJlLTIwMDIxMjMxIj5odHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsLzIwMDIvY29weXJpZ2h0LXNvZnR3YXJlLTIwMDIxMjMxPC9hPi4gCi08L3A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL2Fib3V0X2ZpbGVzL1czQ1NvZnR3YXJlTGljZW5zZS5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvYWJvdXRfZmlsZXMvVzNDU29mdHdhcmVMaWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZmZlNTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvYWJvdXRfZmlsZXMvVzNDU29mdHdhcmVMaWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJpc28tODg1OS0xIj8+Ci08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotICA8dGl0bGU+VzNDIFNvZnR3YXJlIExpY2Vuc2U8L3RpdGxlPgotICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIvU3R5bGVTaGVldHMvYmFzZS5jc3MiIC8+Ci0gIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci0gPCEtLQotaDMjdmVyc2lvbiB7IG1hcmdpbi10b3A6IC0wLjhlbTt9ICAKLS0tPgotCi0KLQotCi0KLQotCi0KLQotICA8L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSB0ZXh0PSIjMDAwMDAwIiBiZ2NvbG9yPSIjRkZGRkZGIj4KLTxoMT5XM0M8c3VwPq48L3N1cD4gU09GVFdBUkUgTk9USUNFIEFORCBMSUNFTlNFPC9oMT4KLQotPGgzIGlkPSJ2ZXJzaW9uIj48YQotaHJlZj0iaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC8yMDAyL2NvcHlyaWdodC1zb2Z0d2FyZS0yMDAyMTIzMSI+aHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC8yMDAyL2NvcHlyaWdodC1zb2Z0d2FyZS0yMDAyMTIzMTwvYT48L2gzPgotCi08cD5UaGlzIHdvcmsgKGFuZCBpbmNsdWRlZCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiBzdWNoIGFzIFJFQURNRXMsIG9yIG90aGVyCi1yZWxhdGVkIGl0ZW1zKSBpcyBiZWluZyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgdW5kZXIgdGhlIGZvbGxvd2luZwotbGljZW5zZS4gQnkgb2J0YWluaW5nLCB1c2luZyBhbmQvb3IgY29weWluZyB0aGlzIHdvcmssIHlvdSAodGhlIGxpY2Vuc2VlKQotYWdyZWUgdGhhdCB5b3UgaGF2ZSByZWFkLCB1bmRlcnN0b29kLCBhbmQgd2lsbCBjb21wbHkgd2l0aCB0aGUgZm9sbG93aW5nCi10ZXJtcyBhbmQgY29uZGl0aW9ucy48L3A+Ci0KLTxwPlBlcm1pc3Npb24gdG8gY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKLWRvY3VtZW50YXRpb24sIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sJm5ic3A7Zm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0Ci1mZWUgb3Igcm95YWx0eSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB5b3UgaW5jbHVkZSB0aGUgZm9sbG93aW5nIG9uCi1BTEwgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSBhbmQgZG9jdW1lbnRhdGlvbiBvciBwb3J0aW9ucyB0aGVyZW9mLCBpbmNsdWRpbmcKLW1vZGlmaWNhdGlvbnM6PC9wPgotPG9sPgotICA8bGk+VGhlIGZ1bGwgdGV4dCBvZiB0aGlzIE5PVElDRSBpbiBhIGxvY2F0aW9uIHZpZXdhYmxlIHRvIHVzZXJzIG9mIHRoZQotICAgIHJlZGlzdHJpYnV0ZWQgb3IgZGVyaXZhdGl2ZSB3b3JrLjwvbGk+Ci0gIDxsaT5BbnkgcHJlLWV4aXN0aW5nIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBkaXNjbGFpbWVycywgbm90aWNlcywgb3IgdGVybXMKLSAgICBhbmQgY29uZGl0aW9ucy4gSWYgbm9uZSBleGlzdCwgdGhlIDxhCi0gICAgaHJlZj0iY29weXJpZ2h0LXNvZnR3YXJlLXNob3J0LW5vdGljZS0yMDAyMTIzMS5odG1sIj5XM0MgU29mdHdhcmUgU2hvcnQKLSAgICBOb3RpY2U8L2E+IHNob3VsZCBiZSBpbmNsdWRlZCAoaHlwZXJ0ZXh0IGlzIHByZWZlcnJlZCwgdGV4dCBpcyBwZXJtaXR0ZWQpCi0gICAgd2l0aGluIHRoZSBib2R5IG9mIGFueSByZWRpc3RyaWJ1dGVkIG9yIGRlcml2YXRpdmUgY29kZS48L2xpPgotICA8bGk+Tm90aWNlIG9mIGFueSBjaGFuZ2VzIG9yIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGZpbGVzLCBpbmNsdWRpbmcgdGhlIGRhdGUKLSAgICBjaGFuZ2VzIHdlcmUgbWFkZS4gKFdlIHJlY29tbWVuZCB5b3UgcHJvdmlkZSBVUklzIHRvIHRoZSBsb2NhdGlvbiBmcm9tCi0gICAgd2hpY2ggdGhlIGNvZGUgaXMgZGVyaXZlZC4pPC9saT4KLTwvb2w+Ci0KLTxwPlRISVMgU09GVFdBUkUgQU5EIERPQ1VNRU5UQVRJT04gSVMgUFJPVklERUQgIkFTIElTLCIgQU5EIENPUFlSSUdIVCBIT0xERVJTCi1NQUtFIE5PIFJFUFJFU0VOVEFUSU9OUyBPUiBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UCi1MSU1JVEVEIFRPLCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBTlkgUEFSVElDVUxBUgotUFVSUE9TRSBPUiBUSEFUIFRIRSBVU0UgT0YgVEhFIFNPRlRXQVJFIE9SIERPQ1VNRU5UQVRJT04gV0lMTCBOT1QgSU5GUklOR0UKLUFOWSBUSElSRCBQQVJUWSBQQVRFTlRTLCBDT1BZUklHSFRTLCBUUkFERU1BUktTIE9SIE9USEVSIFJJR0hUUy48L3A+Ci0KLTxwPkNPUFlSSUdIVCBIT0xERVJTIFdJTEwgTk9UIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIFNQRUNJQUwgT1IKLUNPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBBTlkgVVNFIE9GIFRIRSBTT0ZUV0FSRSBPUgotRE9DVU1FTlRBVElPTi48L3A+Ci0KLTxwPlRoZSBuYW1lIGFuZCB0cmFkZW1hcmtzIG9mIGNvcHlyaWdodCBob2xkZXJzIG1heSBOT1QgYmUgdXNlZCBpbgotYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4KLXByaW9yIHBlcm1pc3Npb24uIFRpdGxlIHRvIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGFuZCBhbnkgYXNzb2NpYXRlZAotZG9jdW1lbnRhdGlvbiB3aWxsIGF0IGFsbCB0aW1lcyByZW1haW4gd2l0aCBjb3B5cmlnaHQgaG9sZGVycy48L3A+Ci0KLTxwPjwvcD4KLQotPHA+X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fPC9wPgotCi08cD5UaGlzIGZvcm11bGF0aW9uIG9mIFczQydzIG5vdGljZSBhbmQgbGljZW5zZSBiZWNhbWUgYWN0aXZlIG9uIERlY2VtYmVyIDMxCi0yMDAyLiBUaGlzIHZlcnNpb24gcmVtb3ZlcyB0aGUgY29weXJpZ2h0IG93bmVyc2hpcCBub3RpY2Ugc3VjaCB0aGF0IHRoaXMKLWxpY2Vuc2UgY2FuIGJlIHVzZWQgd2l0aCBtYXRlcmlhbHMgb3RoZXIgdGhhbiB0aG9zZSBvd25lZCBieSB0aGUgVzNDLAotcmVmbGVjdHMgdGhhdCBFUkNJTSBpcyBub3cgYSBob3N0IG9mIHRoZSBXM0MsIGluY2x1ZGVzIHJlZmVyZW5jZXMgdG8gdGhpcwotc3BlY2lmaWMgZGF0ZWQgdmVyc2lvbiBvZiB0aGUgbGljZW5zZSwgYW5kIHJlbW92ZXMgdGhlIGFtYmlndW91cyBncmFudCBvZgotInVzZSIuIE90aGVyd2lzZSwgdGhpcyB2ZXJzaW9uIGlzIHRoZSBzYW1lIGFzIHRoZSA8YQotaHJlZj0iaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC9jb3B5cmlnaHQtc29mdHdhcmUtMTk5ODA3MjAiPnByZXZpb3VzCi12ZXJzaW9uPC9hPiBhbmQgaXMgd3JpdHRlbiBzbyBhcyB0byBwcmVzZXJ2ZSB0aGUgPGEKLWhyZWY9Imh0dHA6Ly93d3cuZ251Lm9yZy9waGlsb3NvcGh5L2xpY2Vuc2UtbGlzdC5odG1sI0dQTENvbXBhdGlibGVMaWNlbnNlcyI+RnJlZQotU29mdHdhcmUgRm91bmRhdGlvbidzIGFzc2Vzc21lbnQgb2YgR1BMIGNvbXBhdGliaWxpdHk8L2E+IGFuZCA8YQotaHJlZj0iaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9XM0MucGhwIj5PU0kncyBjZXJ0aWZpY2F0aW9uPC9hPgotdW5kZXIgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvZG9jcy9kZWZpbml0aW9uLnBocCI+T3BlbiBTb3VyY2UKLURlZmluaXRpb248L2E+LiBQbGVhc2Ugc2VlIG91ciA8YQotaHJlZj0iaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC9JUFItRkFRIj5Db3B5cmlnaHQgRkFRPC9hPiBmb3IKLWNvbW1vbiBxdWVzdGlvbnMgYWJvdXQgdXNpbmcgbWF0ZXJpYWxzIGZyb20gb3VyIHNpdGUsIGluY2x1ZGluZyBzcGVjaWZpYwotdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHBhY2thZ2VzIGxpa2UgbGlid3d3LCBBbWF5YSwgYW5kIEppZ3Nhdy4gT3RoZXIKLXF1ZXN0aW9ucyBhYm91dCB0aGlzIG5vdGljZSBjYW4gYmUgZGlyZWN0ZWQgdG8gPGEKLWhyZWY9Im1haWx0bzpzaXRlLXBvbGljeUB3My5vcmciPnNpdGUtcG9saWN5QHczLm9yZzwvYT4uPGJyIC8+Ci0mbmJzcDs8L3A+Ci08YWRkcmVzcz4KLSAgSm9zZXBoIFJlYWdsZSAmbHQ7PGEKLSAgaHJlZj0ibWFpbHRvOnNpdGUtcG9saWN5QHczLm9yZyI+c2l0ZS1wb2xpY3lAdzMub3JnJmd0OzwvYT4KLTwvYWRkcmVzcz4KLQotPHA+TGFzdCByZXZpc2VkICRJZDogVzNDU29mdHdhcmVMaWNlbnNlLmh0bWwsdiAxLjEgMjAwOC8wOC8wMiAxMzowMzoxMSBkc2F0Y2h3ZWwgRXhwICQ8L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMzYjQyZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvLFwKLSAgICAgICAgICAgc3JjX3NzZS8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICB4c2x0LXNjaGVtYXMvLFwKLSAgICAgICAgICAgICAgIGxpYi8sXAotICAgICAgICAgICAgICAgYmluLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0X2ZpbGVzLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvbGliLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9saWIvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRjNmRmOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9saWIvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYW50bHItcnVudGltZS0zLjAuMS5qYXIKLWNvbW1vbnMtanhwYXRoLTEuMi5qYXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL2xpYi94aW5jbHVkZS5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9saWIveGluY2x1ZGUuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzMyMDNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL2xpYi94aW5jbHVkZS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmM3NTE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotI1Byb3BlcnRpZXMgZmlsZSBmb3Igb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlCi1CdW5kbGUtTmFtZS4wID0gWFNMIENvcmUgKEluY3ViYXRpbmcpCi1CdW5kbGUtVmVuZG9yLjAgPUVjbGlwc2Uub3JnCi1YU0wuQ29udGVudFR5cGUuTmFtZT1YU0wgVGVtcGxhdGUKLURJVEFfQ29udGVudF9UeXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9RElUQQotRG9jYm9va19Db250ZW50X1R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1Eb2Nib29rCi1YU0wuVmFsaWRhdG9yLk5hbWU9WFNMIFZhbGlkYXRvcgotWFNMLlZhbGlkYXRvckRlbGVnYXRlLk5hbWU9WFNMIFZhbGlkYXRvciBkZWwKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLXBsdWdpbk5hbWUgPSBYU0wgQ29yZSAoSW5jdWJhdGluZykKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCi0KLVhTTFByb2JsZW0gPSBYU0wgUHJvYmxlbQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGNiOTVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0KLQk8IS0tIFRlYW0gcHJvdmlkZXIgaW5mbyAtLT4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnRlYW0uY29yZS5maWxlVHlwZXMiPgotCQk8ZmlsZVR5cGVzIHR5cGU9InRleHQiIGV4dGVuc2lvbj0ieHNsIiAvPgotCQk8ZmlsZVR5cGVzIHR5cGU9InRleHQiIGV4dGVuc2lvbj0ieHNsdCIgLz4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50VHlwZXMiPgotCQk8IS0tIGNvbnRlbnQtdHlwZQotCQkJZmlsZS1leHRlbnNpb25zPSJ4c2wseHNsdCIKLQkJCXByaW9yaXR5PSJub3JtYWwiCi0JCQluYW1lPSIlWFNMLkNvbnRlbnRUeXBlLk5hbWUiCi0JCQlpZD0ieHNsc291cmNlIgotCQkJYmFzZS10eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIgkJCQotCQkJZGVmYXVsdC1jaGFyc2V0PSJVVEYtOCI+Ci0JCQk8ZGVzY3JpYmVyIGNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5YTUxSb290RWxlbWVudENvbnRlbnREZXNjcmliZXIiPgotCQkJCTxwYXJhbWV0ZXIgbmFtZT0iZWxlbWVudCIgdmFsdWU9InN0eWxlc2hlZXQiLz4KLQkJCTwvZGVzY3JpYmVyPgotCQk8L2NvbnRlbnQtdHlwZSAtLT4KLSAgPGNvbnRlbnQtdHlwZQotICAgICAgICBiYXNlLXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiCi0gICAgICAgIGZpbGUtZXh0ZW5zaW9ucz0iZGl0YSxkaXRhbWFwIgotICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmNvbnRlbnQtdHlwZS5kaXRhc291cmNlIgotICAgICAgICBuYW1lPSIlRElUQV9Db250ZW50X1R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLSAgICAgICAgcHJpb3JpdHk9ImhpZ2giPgotICA8L2NvbnRlbnQtdHlwZT4KLSAgPGNvbnRlbnQtdHlwZQotICAgICAgICBiYXNlLXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiCi0gICAgICAgIGZpbGUtZXh0ZW5zaW9ucz0iZGJrIgotICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmNvbnRlbnQtdHlwZS5kb2Nib29rc291cmNlIgotICAgICAgICBuYW1lPSIlRG9jYm9va19Db250ZW50X1R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLSAgICAgICAgcHJpb3JpdHk9ImhpZ2giPgotICA8L2NvbnRlbnQtdHlwZT4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8IS0tIFRoZSBtYWdpYyB3aGljaCBkZXRlY3RzIFhTTFQgMS4wIG9yIDIuMCBzdHlsZXNoZWV0cyBhbmQgc3VwcGxpZXMgdGhlIGNvcnJlY3QgWFNEIC0tPgkKLSAJPGV4dGVuc2lvbgotICAgICAgIAlwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5yZXNvbHZlckV4dGVuc2lvbnMiPgotICAgIAk8cmVzb2x2ZXJFeHRlbnNpb24KLSAgICAgICAgICAJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5yZXNvbHZlci5SZXNvbHZlckV4dGVuc2lvbiIKLSAgICAgICAgCSAgc3RhZ2U9InByZW5vcm1hbGl6YXRpb24iPgotICAgIAk8L3Jlc29sdmVyRXh0ZW5zaW9uPgotCTwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0icHJvYmxlbSIKLSAgICAgICAgIG5hbWU9IiVYU0xQcm9ibGVtIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcmtlcnMiPgotCQk8c3VwZXIgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnZhbGlkYXRpb25NYXJrZXIiLz4KLQkJPHBlcnNpc3RlbnQgdmFsdWU9InRydWUiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuYW50LmNvcmUuYW50VGFza3MiPgotICAgICAgPGFudFRhc2sKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwuYW50LlhJbmNsdWRlVGFzayIKLSAgICAgICAgICAgIGhlYWRsZXNzPSJ0cnVlIgotICAgICAgICAgICAgbGlicmFyeT0ibGliL3hpbmNsdWRlLmphciIKLSAgICAgICAgICAgIG5hbWU9InhzbC54aW5jbHVkZSI+Ci0gICAgICA8L2FudFRhc2s+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDwhLS0gRXh0cmEgQ2xhc3NwYXRoIC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmFudC5jb3JlLmV4dHJhQ2xhc3NwYXRoRW50cmllcyI+Ci0gICAgICA8ZXh0cmFDbGFzc3BhdGhFbnRyeQotICAgICAgICAgICAgbGlicmFyeT0ibGliL3hpbmNsdWRlLmphciI+Ci0gICAgICA8L2V4dHJhQ2xhc3NwYXRoRW50cnk+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBpZD0ieHNsIiBuYW1lPSIlWFNMLlZhbGlkYXRvci5OYW1lIiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yVjIiPgotICAgICAgPHZhbGlkYXRvcgotICAgICAgICAgICAgYnVpbGQ9InRydWUiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZS5WYWxpZGF0b3IiCi0gICAgICAgICAgICBzb3VyY2VpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3JGb3JYU0wiCi0gICAgICAgICAgICBtYW51YWw9InRydWUiCi0gICAgICAgICAgICBtYXJrZXJJZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLnByb2JsZW0iCi0gICAgICAgICAgICB2ZXJzaW9uPSIyIj4KLSAgICAgICAgIDxpbmNsdWRlPgotICAgICAgICAgICAgPHJ1bGVzPgotICAgICAgICAgICAgICAgPGZpbGVleHQgY2FzZVNlbnNpdGl2ZT0iZmFsc2UiIGV4dD0ieHNsIi8+Ci0gCQkJCTxjb250ZW50VHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhzbHNvdXJjZSIvPgotICAgICAgICAgICAgPC9ydWxlcz4KLSAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgIDwvdmFsaWRhdG9yPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIAotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuZG9jdW1lbnRDcmVhdGlvbiIKLQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudGZhY3RvcmllcyIKLQkJbmFtZT0iJVN0cnVjdHVyZWRfWE1MX0RvY3VtZW50X0ZhY3RvcnlfRXh0ZW5zaW9uLm5hbWUiPgotCQk8ZmFjdG9yeQotCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhzbHNvdXJjZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZmlsZWJ1ZmZlcnMuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5IiAvPgotCTwvZXh0ZW5zaW9uPgotIAk8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLm1vZGVsSGFuZGxlciI+Ci0gICAgICA8bW9kZWxIYW5kbGVyCi0gICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuTW9kZWxIYW5kbGVyRm9yWFNMIgotICAgICAgICAgICAgYXNzb2NpYXRlZENvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS54c2xzb3VyY2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmhhbmRsZXIiPgotICAgICAgPC9tb2RlbEhhbmRsZXI+Ci0gICAgPC9leHRlbnNpb24+Ci0gIDxleHRlbnNpb24KLSAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5jYXRhbG9nQ29udHJpYnV0aW9ucyI+Ci0gICAgIDxjYXRhbG9nQ29udHJpYnV0aW9uPgotICAgICAgICA8dXJpCi0gICAgICAgICAgICAgIGlkPSJvcmcudzNjLnhpbmNsdWRlIgotICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIgotICAgICAgICAgICAgICB1cmk9InhzbHQtc2NoZW1hcy94aW5jbHVkZS54c2QiPgotICAgICAgICA8L3VyaT4KLSAgICAgPC9jYXRhbG9nQ29udHJpYnV0aW9uPgotICA8L2V4dGVuc2lvbj4KLSAgPGV4dGVuc2lvbgotICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIj4KLSAgICAgPGluaXRpYWxpemVyCi0gICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuUHJlZmVyZW5jZUluaXRpYWxpemVyIj4KLSAgICAgPC9pbml0aWFsaXplcj4KLSAgPC9leHRlbnNpb24+CQotICAgCi0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGY0MTk3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIEplc3BlciBTdGVlbiBN77+9bGxlciAtIGFkYXB0ZWQgZnJvbSBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmNvbnRlbnQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIEBhdXRob3IgSmVzcGVyIFN0ZWVuCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi0vLyBSdW50aW1lIHBsdWdpbiBtZXNzYWdlIGNhdGFsb2cKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUT0RPOiBBZGQgSmF2YURvYwotCSAqLwotCS8vIENvbnRlbnQgdHlwZSBtYW5hZ2VyCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWFNMQ29yZVBsdWdpbl9wYXJzZXJDb25maWd1cmF0aW9uOwotCi0JLyoqCi0JICogVE9ETzogQWRkIEphdmFEb2MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYU0xDb3JlUGx1Z2luX2JhZEluaXRpYWxpemF0aW9uRGF0YTsKLQotCS8qKgotCSAqIFRPRE86IEFkZCBKYXZhRG9jCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWFNMQ29yZVBsdWdpbl9jb3JlRXJyb3I7Ci0JCi0JLyoqCi0JICogVE9ETzogQWRkIEphdmFEb2MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYSW5jbHVkZVRhc2tfMDsKLQkvKioKLQkgKiBUT0RPOiBBZGQgSmF2YURvYwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhJbmNsdWRlVGFza18xOwotCQotCS8qKgotCSAqIFRPRE86IEFkZCBKYXZhRG9jCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWEluY2x1ZGVUYXNrXzI7Ci0JCi0JLyoqCi0JICogVE9ETzogQWRkIEphdmFEb2MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYSW5jbHVkZVRhc2tfMzsKLQkKLQkvKioKLQkgKiBUT0RPOiBBZGQgSmF2YURvYwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhJbmNsdWRlVGFza180OwotCQotCS8qKgotCSAqIFRPRE86IEFkZCBKYXZhRG9jCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWEluY2x1ZGVUYXNrXzU7Ci0JCi0JLyoqCi0JICogVE9ETzogQWRkIEphdmFEb2MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYSW5jbHVkZVRhc2tfNjsKLQkKLQkvKioKLQkgKiBUT0RPOiBBZGQgSmF2YURvYwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhJbmNsdWRlVGFza183OwotCQotCS8qKgotCSAqIFRPRE86IEFkZCBKYXZhRG9jCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWEluY2x1ZGVUYXNrXzg7Ci0JCi0JLyoqCi0JICogVE9ETzogQWRkIEphdmFEb2MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYSW5jbHVkZVRhc2tfOTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYU0xWYWxpZGF0b3JfMTsKLQkvKioKLQkgKiBTdHlsZXNoZWV0IGltcG9ydGluZyBpdHNlbGYKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYU0xWYWxpZGF0b3JfMTA7Ci0JLyoqCi0JICogVGVtcGxhdGUgY29uZmxpY3QgKGludGVybmFsKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhTTFZhbGlkYXRvcl8xMTsKLQkvKioKLQkgKiBUZW1wbGF0ZSBjb25mbGljdCAoaW5jbHVkZWQpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWFNMVmFsaWRhdG9yXzEyOwotCS8qKgotCSAqIFRlbXBsYXRlIGNvbmZsaWN0IChleHRlcm5hbCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYU0xWYWxpZGF0b3JfMTM7Ci0JLyoqCi0JICogUGFyYW1ldGVyIG1pc3NpbmcgbmFtZSBhdHRyaWJ1dGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYU0xWYWxpZGF0b3JfMTQ7Ci0JLyoqCi0JICogUGFyYW1ldGVyIHdpdGggZW1wdHkgbmFtZSBhdHRyaWJ1dGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYU0xWYWxpZGF0b3JfMTU7Ci0JLyoqCi0JICogRHVwbGljYXRlIHBhcmFtZXRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhTTFZhbGlkYXRvcl8xNjsKLQkvKioKLQkgKiBVbnJlc29sdmVkIG5hbWVkIHRlbXBsYXRlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWFNMVmFsaWRhdG9yXzE4OwotCS8qKgotCSAqIENpcmN1bGFyIHJlZmVyZW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhTTFZhbGlkYXRvcl8yOwotCS8qKgotCSAqIFBhcmFtZXRlciB3aXRob3V0IGRlZmF1bHQgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYU0xWYWxpZGF0b3JfMjA7Ci0JLyoqCi0JICogUGFyYW1ldGVyIGRvZXMgbm90IGV4aXN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWFNMVmFsaWRhdG9yXzIyOwotCS8qKgotCSAqIGhyZWYgYXR0cmlidXRlIGlzIHJlcXVpcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWFNMVmFsaWRhdG9yXzIzOwotCS8qKgotCSAqIE1pc3NpbmcgcGFyYW1ldGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWFNMVmFsaWRhdG9yXzM7Ci0JLyoqCi0JICogVW5yZXNvbHZlZCBpbmNsdWRlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWFNMVmFsaWRhdG9yXzQ7Ci0JLyoqCi0JICogU3R5bGVzaGVldCBpbmNsdWRlcyBpdHNlbGYKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYU0xWYWxpZGF0b3JfNjsKLQkvKioKLQkgKiAgVW5yZXNvbHZlZCBpbXBvcnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYU0xWYWxpZGF0b3JfODsKLQkKLQkKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlyZWxvYWRNZXNzYWdlcygpOwotCX0KLQotCS8qKgotCSAqIFRPRE86IEFkZCBKYXZhRG9jCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbG9hZE1lc3NhZ2VzKCkgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBNZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvVmFsaWRhdGlvblByZWZlcmVuY2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL1ZhbGlkYXRpb25QcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTZmYmQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvVmFsaWRhdGlvblByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlOwotCi0vKioKLSAqIFByZWZlcmVuY2UgY29uc3RhbnRzIHNwZWNpZmljIHRvIHRoZSBYU0wgdmFsaWRhdG9yLgotICogCi0gKiBAYXV0aG9yIERvdWcgU2F0Y2h3ZWxsCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXIKLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRpb25QcmVmZXJlbmNlcwotewotCQotCS8qKgotCSAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBlcnJvcnMgYWxsb3dlZCBwZXIgWFNMIGZpbGUuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5JbnRlZ2VyPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFYX0VSUk9SUyA9ICJNQVhfRVJST1JTIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFRoZSBsZXZlbCBhdCB3aGljaCBhIG1pc3NpbmcgcGFyYW1ldGVyIGlzIHJlcG9ydGVkLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9uZSBvZiA8Y29kZT5JTWFya2VyLlNFVkVSSVRZX0VSUk9SLCBJTWFya2VyLlNFVkVSSVRZX1dBUk5JTkcsIElNYXJrZXIuU0VWRVJJVFlfSU5GTzwvY29kZT4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlTU0lOR19QQVJBTSA9ICJNSVNTSU5HX1BBUkFNIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFRoZSBsZXZlbCBhdCB3aGljaCBhbiBpbnZhbGlkIFhQYXRoIGlzIHJlcG9ydGVkLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9uZSBvZiA8Y29kZT5JTWFya2VyLlNFVkVSSVRZX0VSUk9SLCBJTWFya2VyLlNFVkVSSVRZX1dBUk5JTkcsIElNYXJrZXIuU0VWRVJJVFlfSU5GTzwvY29kZT4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFBBVEhTID0gIkNIRUNLX1hQQVRIUyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBUaGUgbGV2ZWwgYXQgd2hpY2ggYW4gdW5yZXNvbHZlZCBjYWxsZWQgdGVtcGxhdGUgaXMgcmVwb3J0ZWQuIAotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9uZSBvZiA8Y29kZT5JTWFya2VyLlNFVkVSSVRZX0VSUk9SLCBJTWFya2VyLlNFVkVSSVRZX1dBUk5JTkcsIElNYXJrZXIuU0VWRVJJVFlfSU5GTzwvY29kZT4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FMTF9URU1QTEFURVMgPSAiQ0hFQ0tfQ0FMTF9URU1QTEFURVMiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVGhlIGxldmVsIGF0IHdoaWNoIGEgcGFyYW1ldGVyIHRoYXQgZG9lcyBub3QgaGF2ZSBhIGRlZmF1bHQgdmFsdWUgYW5kIGRvZXMgbm90IHNwZWNpZnkgYSB2YWx1ZSBpcyByZXBvcnRlZC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvbmUgb2YgPGNvZGU+SU1hcmtlci5TRVZFUklUWV9FUlJPUiwgSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HLCBJTWFya2VyLlNFVkVSSVRZX0lORk88L2NvZGU+Ci0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZX1BBUkFNID0gIkVNUFRZX1BBUkFNIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFRoZSBsZXZlbCBhdCB3aGljaCBhbiB1bnJlc29sdmVkIGltcG9ydCBvciBpbmNsdWRlZCBpcyByZXBvcnRlZC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvbmUgb2YgPGNvZGU+SU1hcmtlci5TRVZFUklUWV9FUlJPUiwgSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HLCBJTWFya2VyLlNFVkVSSVRZX0lORk88L2NvZGU+Ci0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JU1NJTkdfSU5DTFVERSA9ICJNSVNTSU5HX0lOQ0xVREUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVGhlIGxldmVsIGF0IHdoaWNoIGFuIGluY2x1ZGUvaW1wb3J0IGNpcmN1bGFyIHJlZmVyZW5jZXMgaXMgcmVwb3J0ZWQuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb25lIG9mIDxjb2RlPklNYXJrZXIuU0VWRVJJVFlfRVJST1IsIElNYXJrZXIuU0VWRVJJVFlfV0FSTklORywgSU1hcmtlci5TRVZFUklUWV9JTkZPPC9jb2RlPgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSVJDVUxBUl9SRUYgPSAiQ0lSQ1VMQVJfUkVGIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFRoZSBsZXZlbCBhdCB3aGljaCBhIHRlbXBsYXRlIGNvbmZsaWN0IGlzIHJlcG9ydGVkLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9uZSBvZiA8Y29kZT5JTWFya2VyLlNFVkVSSVRZX0VSUk9SLCBJTWFya2VyLlNFVkVSSVRZX1dBUk5JTkcsIElNYXJrZXIuU0VWRVJJVFlfSU5GTzwvY29kZT4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVNUExBVEVfQ09ORkxJQ1QgPSAiVEVNUExBVEVfQ09ORkxJQ1QiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVGhlIGxldmVsIGF0IHdoaWNoIGEgcGFyYW1ldGVyIHdpdGhvdXQgYSBuYW1lIGF0dHJpYnV0ZSBpcyByZXBvcnRlZC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvbmUgb2YgPGNvZGU+SU1hcmtlci5TRVZFUklUWV9FUlJPUiwgSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HLCBJTWFya2VyLlNFVkVSSVRZX0lORk88L2NvZGU+Ci0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfQVRUUklCVVRFX01JU1NJTkcgPSAiTkFNRV9BVFRSSUJVVEVfTUlTU0lORyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBUaGUgbGV2ZWwgYXQgd2hpY2ggYSBwYXJhbWV0ZXIgd2l0aCBhbiBlbXB0eSBuYW1lIGF0dHJpYnV0ZSBpcyByZXBvcnRlZC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvbmUgb2YgPGNvZGU+SU1hcmtlci5TRVZFUklUWV9FUlJPUiwgSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HLCBJTWFya2VyLlNFVkVSSVRZX0lORk88L2NvZGU+Ci0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfQVRUUklCVVRFX0VNUFRZID0gIk5BTUVfQVRUUklCVVRFX0VNUFRZIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFRoZSBsZXZlbCBhdCB3aGljaCBhIGR1cGxpY2F0ZSBwYXJhbWV0ZXIgaXMgcmVwb3J0ZWQuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb25lIG9mIDxjb2RlPklNYXJrZXIuU0VWRVJJVFlfRVJST1IsIElNYXJrZXIuU0VWRVJJVFlfV0FSTklORywgSU1hcmtlci5TRVZFUklUWV9JTkZPPC9jb2RlPgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVVBMSUNBVEVfUEFSQU1FVEVSID0gIkRVUExJQ0FURV9QQVJBTUVURVIiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL1hTTENvcmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvWFNMQ29yZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjIzOTI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvWFNMQ29yZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwuU3R5bGVzaGVldEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLnV0aWwuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLm1vZGVsLlN0eWxlc2hlZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLm1vZGVsLlN0eWxlc2hlZXRNb2RlbDsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgdG8gYWxsIGFzcGVjdHMgb2YgdGhlIFhTTCBjb3JlIGZ1bmN0aW9uYWxpdHkuCi0gKiA8cD4KLSAqIFRoaXMgaXMgcmVzcG9uc2libGUgZm9yIGJ1aWxkaW5nIGFuZCBtYWludGFpbmluZyB0aGUgY2FjaGUgb2YgYnVpbHQgWFNMIG1vZGVscy4KLSAqIDwvcD4KLSAqIAotICogQGF1dGhvciBEb3VnIFNhdGNod2VsbAotICovCi1wdWJsaWMgY2xhc3MgWFNMQ29yZQotewotCS8qKgotCSAqIFRoZSBYU0wgbmFtZXNwYWNlIFVSSSAoPSBodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0pCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNMX05BTUVTUEFDRV9VUkkgPSAiaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFRoZSBYU0wgY29udGVudCB0eXBlICg9IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS54c2xzb3VyY2UpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNMX0NPTlRFTlRfVFlQRSA9ICJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueHNsc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIFhTTENvcmUgaW5zdGFuY2U7Ci0JcHJpdmF0ZSBNYXA8SUZpbGUsIFN0eWxlc2hlZXRNb2RlbD4gc3R5bGVzaGVldHNDb21wb3NlZCA9IG5ldyBIYXNoTWFwPElGaWxlLCBTdHlsZXNoZWV0TW9kZWw+KCk7Ci0KLQlwcml2YXRlIFhTTENvcmUoKQotCXt9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGNhY2hlZCBzdHlsZXNoZWV0LCBvciBidWlsZCBpdCBpZiBpdCBoYXMgbm90IHlldCBiZWVuIGJ1aWx0LgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogQHJldHVybiBzb3VyY2UgZmlsZSwgb3IgbnVsbCBpZiBjb3VsZCBub3QgYmUgYnVpbHQKLQkgKiBAc2luY2UgMS4wCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBTdHlsZXNoZWV0TW9kZWwgZ2V0U3R5bGVzaGVldChJRmlsZSBmaWxlKQotCXsKLQkJU3R5bGVzaGVldE1vZGVsIHN0eWxlc2hlZXQgPSBzdHlsZXNoZWV0c0NvbXBvc2VkLmdldChmaWxlKTsKLQkJaWYgKHN0eWxlc2hlZXQgPT0gbnVsbCkKLQkJCXN0eWxlc2hlZXQgPSBidWlsZFN0eWxlc2hlZXQoZmlsZSk7Ci0JCXJldHVybiBzdHlsZXNoZWV0OwotCX0KLQotCS8qKgotCSAqIENvbXBsZXRlbHkgcmVidWlsZCB0aGUgc291cmNlIGZpbGUgZnJvbSBpdHMgRE9NCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAcmV0dXJuIHRoZSBzdHlsZXNoZWV0IG1vZGVsLCBvciBudWxsIGlmIGl0IGNvdWxkIG5vdCBiZSBjcmVhdGVkLgotCSAqIEBzaW5jZSAxLjAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIFN0eWxlc2hlZXRNb2RlbCBidWlsZFN0eWxlc2hlZXQoSUZpbGUgZmlsZSkKLQl7Ci0JCVN0eWxlc2hlZXQgc3R5bGVzaGVldCA9IFN0eWxlc2hlZXRCdWlsZGVyLmdldEluc3RhbmNlKCkuZ2V0U3R5bGVzaGVldChmaWxlLCB0cnVlKTsKLQkJaWYgKHN0eWxlc2hlZXQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHlsZXNoZWV0TW9kZWwgc3R5bGVzaGVldENvbXBvc2VkID0gbmV3IFN0eWxlc2hlZXRNb2RlbChzdHlsZXNoZWV0KTsJCQkKLQkJc3R5bGVzaGVldHNDb21wb3NlZC5wdXQoZmlsZSwgc3R5bGVzaGVldENvbXBvc2VkKTsKLQkJc3R5bGVzaGVldENvbXBvc2VkLmZpeCgpOwotCQlyZXR1cm4gc3R5bGVzaGVldENvbXBvc2VkOwotCX0KLQkKLQkvKioKLQkgKiBDbGVhbiBhbGwgb2YgdGhlIHN0eWxlc2hlZXRzIGZyb20gdGhlIGdpdmVuIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgdG8gYmUgY2xlYW5lZAotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciB0byB0cmFjayB0aGUgY2xlYW4gcHJvZ3Jlc3MKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2xlYW4oSVByb2plY3QgcHJvamVjdCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCXsKLQkJZm9yIChJdGVyYXRvcjxTdHlsZXNoZWV0TW9kZWw+IGl0ZXIgPSBzdHlsZXNoZWV0c0NvbXBvc2VkLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLQkJewotCQkJU3R5bGVzaGVldE1vZGVsIG1vZGVsID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAocHJvamVjdCA9PSBudWxsIHx8IHByb2plY3QuZXF1YWxzKG1vZGVsLmdldFN0eWxlc2hlZXQoKS5nZXRGaWxlKCkuZ2V0UHJvamVjdCgpKSkKLQkJCXsKLQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBzaW5nbGV0b24gPGNvZGU+WFNMQ29yZTwvY29kZT4gaW5zdGFuY2UuCi0JICogCi0JICogQHJldHVybiB0aGUgPGNvZGU+WFNMQ29yZTwvY29kZT4gaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBYU0xDb3JlIGdldEluc3RhbmNlKCkKLQl7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgWFNMQ29yZSgpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogTG9jYXRlcyBhIGZpbGUgZm9yIHRoZSBnaXZlbiBjdXJyZW50IGZpbGUgYW5kIFVSSS4KLQkgKiAKLQkgKiBAcGFyYW0gY3VycmVudEZpbGUgdGhlIGZpbGUgdG8gcmVzb2x2ZSByZWxhdGl2ZSB0bwotCSAqIEBwYXJhbSB1cmkgdGhlIHJlbGF0aXZlIFVSSSAKLQkgKiBAcmV0dXJuIHRoZSBmaWxlIGF0IHRoZSBVUkkgcmVsYXRpdmUgdG8gdGhpcyA8Y29kZT5jdXJyZW50RmlsZTwvY29kZT4KLQkgKi8KLQkvLyBUT0RPIGRlcGVuZHMgb24gaG93IHdlIHJlc29sdmUgVVJJcwkJCi0JcHVibGljIHN0YXRpYyBJRmlsZSByZXNvbHZlRmlsZShJRmlsZSBjdXJyZW50RmlsZSwgU3RyaW5nIHVyaSkKLQl7Ci0JCWlmICh1cmkgPT0gbnVsbCB8fCB1cmkudHJpbSgpLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVJlc291cmNlIHJlc291cmNlID0gY3VycmVudEZpbGUuZ2V0UGFyZW50KCkuZmluZE1lbWJlcihuZXcgUGF0aCh1cmkpKTsKLQkJaWYgKHJlc291cmNlID09IG51bGwgfHwgcmVzb3VyY2UuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GSUxFKQotCQkJcmV0dXJuIG51bGw7CQkKLQkJcmV0dXJuIChJRmlsZSlyZXNvdXJjZTsKLQl9Ci0JLyoqCi0JICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGdpdmVuIGZpbGUgaXMgYW4gWE1MIGZpbGUgYnkgaW5zcGVjdGluZyBpdHMgY29udGVudCB0eXBlcy4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZSB0aGUgZmlsZSB0byBpbnNwZWN0Ci0JICogQHJldHVybiB0cnVlIGlmIHRoaXMgZmlsZSBpcyBhbiBYTUwgZmlsZQotCSAqLwotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzWE1MRmlsZShJRmlsZSBmaWxlKQotCXsKLQkJcmV0dXJuIEZpbGVVdGlsLmlzWE1MRmlsZShmaWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgZ2l2ZW4gZmlsZSBpcyBhbiBYU0wgZmlsZSBieSBpbnNwZWN0aW5nIGl0cyBjb250ZW50IHR5cGVzLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlIHRoZSBmaWxlIHRvIGluc3BlY3QKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBmaWxlIGlzIGFuIFhTTCBmaWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzWFNMRmlsZShJRmlsZSBmaWxlKQotCXsKLQkJcmV0dXJuIEZpbGVVdGlsLmlzWFNMRmlsZShmaWxlKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogVGFrZXMgYSBnaXZlbiA8Y29kZT5Ob2RlPC9jb2RlPiBhbmQgcmV0dXJucyB3aGV0aGVyIGl0IAotCSAqIGlzIHBhcnQgb2YgdGhlIHRoZSBYU0xUIE5hbWVzcGFjZS4KLQkgKiBAcGFyYW0gbm9kZSAgVGhlIE5vZGUgdG8gYmUgY2hlY2tlZC4KLQkgKiBAcmV0dXJuIFRydWUgaWYgcGFydCBvZiB0aGUgWFNMVCBuYW1lc3BhY2UsIGZhbHNlIG90aGVyd2lzZS4KLQkgKiBAc2luY2UgMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzWFNMTmFtZXNwYWNlKE5vZGUgbm9kZSkgewotCQlpZiAoaGFzTmFtZXNwYWNlKG5vZGUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIG5vZGUuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKFhTTF9OQU1FU1BBQ0VfVVJJKTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmUgaWYgdGhlIE5vZGUgdGhhdCB3YXMgcGFzc2VkIGhhcyBhIE5hbWVzcGFjZS4gIElmIGl0Ci0JICogZG9lc24ndCB0aGUgbm9kZSBpcyBlaXRoZXIgZ29pbmcgdG8gYmUgZmFsc2UsIG9yIHRoZSBjYWxsIHRvIHRoZQotCSAqIGdldE5hbWVzcGFjZSgpIG1ldGhvZCB3aWxsIHJldHVybiBudWxsLgotCSAqIEBwYXJhbSBub2RlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaGFzTmFtZXNwYWNlKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gbm9kZSA9PSBudWxsIHx8IG5vZGUuZ2V0TmFtZXNwYWNlVVJJKCkgPT0gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhbiBBdHRyIG5vZGUgZm9yIHRoZSBjdXJyZW50IE5vZGUgaWYgb25lIGV4aXRzIGF0IHRoZSBzcGVjaWZpZWQgb2Zmc2V0LgotCSAqIEBwYXJhbSBub2RlIAotCSAqIEBwYXJhbSBvZmZzZXQgCi0JICogQHJldHVybiBBIHczYy5kb20uQXR0cgotCSAqIEBzaW5jZSAxLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEF0dHIgZ2V0Q3VycmVudEF0dHJOb2RlKE5vZGUgbm9kZSwgaW50IG9mZnNldCkKLQl7Ci0JCWlmICgobm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuY29udGFpbnMob2Zmc2V0KSAmJiAobm9kZS5oYXNBdHRyaWJ1dGVzKCkpKQotCQl7Ci0JCQlOYW1lZE5vZGVNYXAgYXR0cnMgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnMuZ2V0TGVuZ3RoKCk7ICsraSkKLQkJCXsKLQkJCQlJbmRleGVkUmVnaW9uIGF0dFJlZ2lvbiA9IChJbmRleGVkUmVnaW9uKSBhdHRycy5pdGVtKGkpOwotCQkJCWlmIChhdHRSZWdpb24uY29udGFpbnMob2Zmc2V0KSkKLQkJCQl7Ci0JCQkJCXJldHVybiAoQXR0cikgYXR0cnMuaXRlbShpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBOb2RlIGF0IHRoZSBzcGVjaWZpZWQgb2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudCAKLQkgKiBAcGFyYW0gb2Zmc2V0IAotCSAqIEByZXR1cm4gYW4gdzNjLmRvbS5Ob2RlCi0JICogQHNpbmNlIDEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTm9kZSBnZXRDdXJyZW50Tm9kZShJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQpCi0JewotCQlJbmRleGVkUmVnaW9uIGlub2RlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBudWxsOwotCQl0cnkKLQkJewotCQkJc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQlpbm9kZSA9IHNNb2RlbC5nZXRJbmRleGVkUmVnaW9uKG9mZnNldCk7Ci0JCQlpZiAoaW5vZGUgPT0gbnVsbCkKLQkJCQlpbm9kZSA9IHNNb2RlbC5nZXRJbmRleGVkUmVnaW9uKG9mZnNldCAtIDEpOwotCQl9Ci0JCWZpbmFsbHkKLQkJewotCQkJaWYgKHNNb2RlbCAhPSBudWxsKQotCQkJCXNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCi0JCWlmIChpbm9kZSBpbnN0YW5jZW9mIE5vZGUpCi0JCXsKLQkJCXJldHVybiAoTm9kZSkgaW5vZGU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC9TdHlsZXNoZWV0QnVpbGRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC9TdHlsZXNoZWV0QnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Nzk5NWE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwvU3R5bGVzaGVldEJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBmaXggaXNzdWUgd2l0aCB4c2xFbG0gYmVpbmcgbnVsbCBvbiBsb2NhbCB2YXJpYWJsZXMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUF0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLlhTTENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLm1vZGVsLkNhbGxUZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUubW9kZWwuSW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5tb2RlbC5JbmNsdWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5tb2RlbC5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLm1vZGVsLlN0eWxlc2hlZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLm1vZGVsLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5tb2RlbC5WYXJpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUubW9kZWwuWFNMQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5tb2RlbC5YU0xFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5tb2RlbC5YU0xOb2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLS8qKgotICogQSBidWlsZGVyIHRoYXQgY3JlYXRlcyBhbmQgbWFpbnRhaW5zIGEgY2FjaGUgb2YgPGNvZGU+U3R5bGVzaGVldDwvY29kZT4ncy4KLSAqIAotICogQGF1dGhvciBEb3VnIFNhdGNod2VsbAotICovCi1wdWJsaWMgY2xhc3MgU3R5bGVzaGVldEJ1aWxkZXIgewotCXByaXZhdGUgc3RhdGljIFN0eWxlc2hlZXRCdWlsZGVyIGluc3RhbmNlOwotCXByaXZhdGUgZmluYWwgTWFwPElGaWxlLCBTdHlsZXNoZWV0PiBidWlsdEZpbGVzID0gbmV3IEhhc2hNYXA8SUZpbGUsIFN0eWxlc2hlZXQ+KCk7Ci0KLQlwcml2YXRlIFN0eWxlc2hlZXRCdWlsZGVyKCkgewotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgPGNvZGU+U3R5bGVzaGVldDwvY29kZT4gYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBmaWxlLiBJZiBlaXRoZXIKLQkgKiB0aGUgPGNvZGU+U3R5bGVzaGVldDwvY29kZT4gaGFzIG5vdCB5ZXQgYmVlbiBjcmVhdGVkIG9yCi0JICogPGNvZGU+Zm9yY2U8L2NvZGU+IGlzIHNwZWNpZmllZCB0aGVuIHRoZSA8Y29kZT5TdHlsZXNoZWV0PC9jb2RlPiBpcwotCSAqIGJ1aWx0LgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICB0aGUgWFNMIGZpbGUKLQkgKiBAcGFyYW0gZm9yY2UKLQkgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IHRvIGZvcmNlIGEgcGFyc2Ugb2YgdGhlIGZpbGUKLQkgKiBAcmV0dXJuIHRoZSA8Y29kZT5TdHlsZXNoZWV0PC9jb2RlPgotCSAqLwotCXB1YmxpYyBTdHlsZXNoZWV0IGdldFN0eWxlc2hlZXQoSUZpbGUgZmlsZSwgYm9vbGVhbiBmb3JjZSkgewotCQlTdHlsZXNoZWV0IHN0eWxlc2hlZXQgPSBidWlsdEZpbGVzLmdldChmaWxlKTsKLQkJaWYgKHN0eWxlc2hlZXQgPT0gbnVsbCB8fCBmb3JjZSkgewotCQkJc3R5bGVzaGVldCA9IGJ1aWxkKGZpbGUpOwotCQkJYnVpbHRGaWxlcy5wdXQoZmlsZSwgc3R5bGVzaGVldCk7Ci0JCX0KLQkJcmV0dXJuIHN0eWxlc2hlZXQ7Ci0JfQotCi0JcHJpdmF0ZSBTdHlsZXNoZWV0IGJ1aWxkKElGaWxlIGZpbGUpIHsKLQkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlpZiAoRGVidWcuZGVidWdYU0xNb2RlbCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJCdWlsZGluZyAiICsgZmlsZSArICIuLi4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQlTdHlsZXNoZWV0IHN0eWxlc2hlZXQgPSBudWxsOwotCQlJU3RydWN0dXJlZE1vZGVsIHNtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlzbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpCi0JCQkJCS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChmaWxlKTsKLQkJCWlmIChzbW9kZWwgPT0gbnVsbCkgewotCQkJCXNtb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkKLQkJCQkJCS5nZXRNb2RlbEZvclJlYWQoZmlsZSk7Ci0JCQkJaWYgKERlYnVnLmRlYnVnWFNMTW9kZWwpIHsKLQkJCQkJbG9uZyBlbmRQYXJzZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlBBUlNFICIgKyBmaWxlICsgIiBpbiAiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCSsgKGVuZFBhcnNlIC0gc3RhcnQpICsgIm1zIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKERlYnVnLmRlYnVnWFNMTW9kZWwpIHsKLQkJCQlsb25nIGVuZFBhcnNlID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJOTy1QQVJTRSAiICsgZmlsZSArICIgaW4gIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCSsgKGVuZFBhcnNlIC0gc3RhcnQpICsgIm1zIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCS8vIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlpZiAoc21vZGVsICE9IG51bGwgJiYgc21vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSB7Ci0JCQkJSURPTU1vZGVsIG1vZGVsID0gKElET01Nb2RlbCkgc21vZGVsOwotCQkJCXN0eWxlc2hlZXQgPSBwYXJzZU1vZGVsKG1vZGVsLCBmaWxlKTsKLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJWFNMQ29yZVBsdWdpbi5sb2coZSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJWFNMQ29yZVBsdWdpbi5sb2coZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoc21vZGVsICE9IG51bGwpCi0JCQkJc21vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1hTTE1vZGVsKSB7Ci0JCQlsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJCVUlMRCAiICsgZmlsZSArICIgaW4gIiArIChlbmQgLSBzdGFydCkgKyAibXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfQotCQlyZXR1cm4gc3R5bGVzaGVldDsKLQl9Ci0KLQlwcml2YXRlIFN0eWxlc2hlZXQgcGFyc2VNb2RlbChJRE9NTW9kZWwgbW9kZWwsIElGaWxlIGZpbGUpIHsKLQkJSURPTURvY3VtZW50IGRvY3VtZW50ID0gbW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJU3R5bGVzaGVldCBzZiA9IG5ldyBTdHlsZXNoZWV0KGZpbGUpOwotCQlTdHlsZXNoZWV0UGFyc2VyIHdhbGtlciA9IG5ldyBTdHlsZXNoZWV0UGFyc2VyKHNmKTsKLQkJd2Fsa2VyLndhbGtEb2N1bWVudChkb2N1bWVudCk7Ci0JCXJldHVybiBzZjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHNpbmdsZXRvbiA8Y29kZT5TdHlsZXNoZWV0QnVpbGRlcjwvY29kZT4gaW5zdGFuY2UuCi0JICogCi0JICogQHJldHVybiB0aGUgPGNvZGU+U3R5bGVzaGVldEJ1aWxkZXI8L2NvZGU+IGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgU3R5bGVzaGVldEJ1aWxkZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlpbnN0YW5jZSA9IG5ldyBTdHlsZXNoZWV0QnVpbGRlcigpOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBTdHlsZXNoZWV0UGFyc2VyIHsKLQkJcHJpdmF0ZSBmaW5hbCBTdHlsZXNoZWV0IHNmOwotCQlwcml2YXRlIGZpbmFsIFN0YWNrPEVsZW1lbnQ+IGVsZW1lbnRTdGFjayA9IG5ldyBTdGFjazxFbGVtZW50PigpOwotCQlwcml2YXRlIFRlbXBsYXRlIGN1cnJlbnRUZW1wbGF0ZTsKLQkJcHJpdmF0ZSBTdGFjazxDYWxsVGVtcGxhdGU+IGNhbGxUZW1wbGF0ZXMgPSBuZXcgU3RhY2s8Q2FsbFRlbXBsYXRlPigpOwotCQlwcml2YXRlIFhTTEVsZW1lbnQgcGFyZW50RWw7Ci0KLQkJcHVibGljIFN0eWxlc2hlZXRQYXJzZXIoU3R5bGVzaGVldCBzdHlsZXNoZWV0KSB7Ci0JCQl0aGlzLnNmID0gc3R5bGVzaGVldDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHdhbGtEb2N1bWVudChJRE9NRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQotCQkJaWYgKGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpICE9IG51bGwpCi0JCQkJcmVjdXJzZShkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKSk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgcmVjdXJzZShFbGVtZW50IGVsZW1lbnQpIHsKLQkJCVhTTEVsZW1lbnQgeHNsRWwgPSBudWxsOwotCQkJaWYgKFhTTENvcmUuWFNMX05BTUVTUEFDRV9VUkkuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCkpKSB7Ci0JCQkJU3RyaW5nIGVsTmFtZSA9IGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCk7Ci0JCQkJaWYgKCJzdHlsZXNoZWV0Ii5lcXVhbHMoZWxOYW1lKSAmJiBlbGVtZW50U3RhY2suc2l6ZSgpID09IDApIC8vJE5PTi1OTFMtMSQKLQkJCQl7Ci0JCQkJCU5hbWVkTm9kZU1hcCBtYXAgPSBlbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKLQkJCQkJU3RyaW5nIHZlcnNpb24gPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgidmVyc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCXNmLnNldFZlcnNpb24odmVyc2lvbik7Ci0JCQkJCXhzbEVsID0gc2Y7Ci0JCQkJfSBlbHNlIGlmICgiaW5jbHVkZSIuZXF1YWxzKGVsTmFtZSkgJiYgZWxlbWVudFN0YWNrLnNpemUoKSA9PSAxKSAvLyROT04tTkxTLTEkCi0JCQkJewotCQkJCQlJbmNsdWRlIGluY2x1ZGUgPSBuZXcgSW5jbHVkZShzZik7Ci0JCQkJCXNmLmFkZEluY2x1ZGUoaW5jbHVkZSk7Ci0JCQkJCXhzbEVsID0gaW5jbHVkZTsKLQkJCQl9IGVsc2UgaWYgKCJpbXBvcnQiLmVxdWFscyhlbE5hbWUpICYmIGVsZW1lbnRTdGFjay5zaXplKCkgPT0gMSkgLy8kTk9OLU5MUy0xJAotCQkJCXsKLQkJCQkJSW1wb3J0IGluY2x1ZGUgPSBuZXcgSW1wb3J0KHNmKTsKLQkJCQkJc2YuYWRkSW1wb3J0KGluY2x1ZGUpOwotCQkJCQl4c2xFbCA9IGluY2x1ZGU7Ci0JCQkJfSBlbHNlIGlmICgidGVtcGxhdGUiLmVxdWFscyhlbE5hbWUpICYmIGVsZW1lbnRTdGFjay5zaXplKCkgPT0gMSkgLy8kTk9OLU5MUy0xJAotCQkJCXsKLQkJCQkJY3VycmVudFRlbXBsYXRlID0gbmV3IFRlbXBsYXRlKHNmKTsKLQkJCQkJc2YuYWRkVGVtcGxhdGUoY3VycmVudFRlbXBsYXRlKTsKLQkJCQkJeHNsRWwgPSBjdXJyZW50VGVtcGxhdGU7Ci0JCQkJfSBlbHNlIGlmICgicGFyYW0iLmVxdWFscyhlbE5hbWUpICYmIGVsZW1lbnRTdGFjay5zaXplKCkgPT0gMiAmJiBjdXJyZW50VGVtcGxhdGUgIT0gbnVsbCkgLy8kTk9OLU5MUy0xJAotCQkJCXsKLQkJCQkJUGFyYW1ldGVyIHBhcmFtID0gbmV3IFBhcmFtZXRlcihzZik7Ci0JCQkJCS8vIGRldGVybWluZSB3aGV0aGVyIHBhcmFtIGhhcyBhIHZhbHVlCi0JCQkJCU5vZGVMaXN0IGNoaWxkTm9kZXMgPSBlbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZE5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQkJCU5vZGUgY2hpbGROb2RlID0gY2hpbGROb2Rlcy5pdGVtKGkpOwotCQkJCQkJaWYgKGNoaWxkTm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuQVRUUklCVVRFX05PREUpIHsKLQkJCQkJCQlwYXJhbS5zZXRWYWx1ZSh0cnVlKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljdXJyZW50VGVtcGxhdGUuYWRkUGFyYW1ldGVyKHBhcmFtKTsKLQkJCQkJeHNsRWwgPSBwYXJhbTsKLQkJCQl9IGVsc2UgaWYgKCJjYWxsLXRlbXBsYXRlIi5lcXVhbHMoZWxOYW1lKSAmJiBlbGVtZW50U3RhY2suc2l6ZSgpID49IDIpIC8vJE5PTi1OTFMtMSQKLQkJCQl7Ci0JCQkJCUNhbGxUZW1wbGF0ZSBjdXJyZW50Q2FsbFRlbXBsYXRlID0gbmV3IENhbGxUZW1wbGF0ZShzZik7Ci0JCQkJCWNhbGxUZW1wbGF0ZXMucHVzaChjdXJyZW50Q2FsbFRlbXBsYXRlKTsKLQkJCQkJc2YuYWRkQ2FsbGVkVGVtcGxhdGUoY3VycmVudENhbGxUZW1wbGF0ZSk7Ci0JCQkJCXhzbEVsID0gY3VycmVudENhbGxUZW1wbGF0ZTsKLQkJCQl9IGVsc2UgaWYgKCJ3aXRoLXBhcmFtIi5lcXVhbHMoZWxOYW1lKSAmJiBlbGVtZW50U3RhY2suc2l6ZSgpID49IDMgJiYgY2FsbFRlbXBsYXRlcy5zaXplKCkgPiAwKSAvLyROT04tTkxTLTEkCi0JCQkJewotCQkJCQlQYXJhbWV0ZXIgcGFyYW0gPSBuZXcgUGFyYW1ldGVyKHNmKTsKLQkJCQkJLy8gZGV0ZXJtaW5lIHdoZXRoZXIgcGFyYW0gaGFzIGEgdmFsdWUKLQkJCQkJTm9kZUxpc3QgY2hpbGROb2RlcyA9IGVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkTm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCQkJTm9kZSBjaGlsZE5vZGUgPSBjaGlsZE5vZGVzLml0ZW0oaSk7Ci0JCQkJCQlpZiAoY2hpbGROb2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgewotCQkJCQkJCXBhcmFtLnNldFZhbHVlKHRydWUpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCS8vIGdldCB0aGUgcHJldmlvdXMgY2FsbC10ZW1wbGF0ZQotCQkJCQlDYWxsVGVtcGxhdGUgY3VycmVudENhbGxUZW1wbGF0ZSA9IGNhbGxUZW1wbGF0ZXMucGVlaygpOwotCQkJCQljdXJyZW50Q2FsbFRlbXBsYXRlLmFkZFBhcmFtZXRlcihwYXJhbSk7Ci0JCQkJCXhzbEVsID0gcGFyYW07Ci0JCQkJfSBlbHNlIGlmICgidmFyaWFibGUiLmVxdWFscyhlbE5hbWUpKSAvLyROT04tTkxTLTEkCi0JCQkJewotCQkJCQlpZiAoZWxlbWVudFN0YWNrLnNpemUoKSA9PSAxKQotCQkJCQl7Ly8gZ2xvYmFsIHZhcmlhYmxlCi0JCQkJCQlWYXJpYWJsZSB2YXIgPSBuZXcgVmFyaWFibGUoc2YpOwotCQkJCQkJc2YuYWRkR2xvYmFsVmFyaWFibGUodmFyKTsKLQkJCQkJCXhzbEVsID0gdmFyOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGVsZW1lbnRTdGFjay5zaXplKCkgPiAxICYmIGN1cnJlbnRUZW1wbGF0ZSAhPSBudWxsKQotCQkJCQl7Ly8gbG9jYWwgdmFyaWFibGUKLQkJCQkJCVZhcmlhYmxlIHZhciA9IG5ldyBWYXJpYWJsZShzZik7Ci0JCQkJCQljdXJyZW50VGVtcGxhdGUuYWRkVmFyaWFibGUodmFyKTsKLQkJCQkJCXhzbEVsID0gdmFyOwotCQkJCQl9Ci0JCQkJfSAKLQkJCQllbHNlIHsKLQkJCQkJeHNsRWwgPSBuZXcgWFNMRWxlbWVudChzZik7Ci0JCQkJfQotCQkJCWlmICh4c2xFbCE9bnVsbCkKLQkJCQkJY29uZmlndXJlKChJRE9NTm9kZSkgZWxlbWVudCwgeHNsRWwpOwotCQkJfQotCQkJZWxlbWVudFN0YWNrLnB1c2goZWxlbWVudCk7Ci0JCQlOb2RlTGlzdCBjaGlsZE5vZGVzID0gZWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkTm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCU5vZGUgbm9kZSA9IGNoaWxkTm9kZXMuaXRlbShpKTsKLQkJCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCXJlY3Vyc2UoKEVsZW1lbnQpIG5vZGUpOwotCQkJCX0KLQkJCX0KLQkJCWlmICh4c2xFbCBpbnN0YW5jZW9mIENhbGxUZW1wbGF0ZSkKLQkJCQljYWxsVGVtcGxhdGVzLnBvcCgpOwotCQkJZWxlbWVudFN0YWNrLnBvcCgpOwotCQkJLy8gY3VycmVudFRlbXBsYXRlID0gbnVsbDsKLQkJCS8vIGN1cnJlbnRDYWxsVGVtcGxhdGUgPSBudWxsOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZShJRE9NTm9kZSBub2RlLCBYU0xFbGVtZW50IGVsZW1lbnQpIHsKLQkJCXNldFBvc2l0aW9uSW5mbyhub2RlLCBlbGVtZW50KTsKLQkJCUlET01FbGVtZW50IGRvbUVsZW0gPSAoSURPTUVsZW1lbnQpIG5vZGU7Ci0JCQllbGVtZW50LnNldE5hbWUoZG9tRWxlbS5nZXRMb2NhbE5hbWUoKSk7Ci0JCQlOYW1lZE5vZGVNYXAgbWFwID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJSURPTUF0dHIgYXR0ciA9IChJRE9NQXR0cikgbWFwLml0ZW0oaSk7Ci0JCQkJWFNMQXR0cmlidXRlIHhzbGF0dCA9IG5ldyBYU0xBdHRyaWJ1dGUoZWxlbWVudCwgYXR0ci5nZXROYW1lKCksCi0JCQkJCQlhdHRyLmdldFZhbHVlKCkpOwotCQkJCXNldFBvc2l0aW9uSW5mbyhhdHRyLCB4c2xhdHQpOwotCQkJCWVsZW1lbnQuc2V0QXR0cmlidXRlKHhzbGF0dCk7Ci0JCQl9Ci0JCQlpZiAocGFyZW50RWwgIT0gbnVsbCkKLQkJCQlwYXJlbnRFbC5hZGRDaGlsZChlbGVtZW50KTsKLQkJCXBhcmVudEVsID0gZWxlbWVudDsKLQkJfQotCi0JCXByaXZhdGUgc3RhdGljIHZvaWQgc2V0UG9zaXRpb25JbmZvKElET01Ob2RlIG5vZGUsIFhTTE5vZGUgaW5jKSB7Ci0JCQl0cnkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZQotCQkJCQkJLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCWludCBsaW5lID0gc3RydWN0dXJlZERvY3VtZW50LmdldExpbmVPZk9mZnNldChub2RlCi0JCQkJCQkuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJaW50IGxpbmVPZmZzZXQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGluZU9mZnNldChsaW5lKTsKLQkJCQlpbnQgY29sID0gbm9kZS5nZXRTdGFydE9mZnNldCgpIC0gbGluZU9mZnNldDsKLQkJCQlpbmMuc2V0T2Zmc2V0KG5vZGUuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJaW5jLnNldExpbmVOdW1iZXIobGluZSk7Ci0JCQkJaW5jLnNldENvbHVtbk51bWJlcihjb2wpOwotCQkJCWluYy5zZXRMZW5ndGgobm9kZS5nZXRMZW5ndGgoKSk7Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJWFNMQ29yZVBsdWdpbi5sb2coZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL1hTTENvcmVQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwvWFNMQ29yZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDVkM2Q4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwvWFNMQ29yZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSmVzcGVyIFN0ZWVuIE3vv71sbGVyIGFuZCBvdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSmVzcGVyIFN0ZWVuIE3vv71sbGVyIC0gWFNMIGNvcmUgcGx1Z2luCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5NZXNzYWdlczsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLWltcG9ydCBvcmcub3NnaS51dGlsLnRyYWNrZXIuU2VydmljZVRyYWNrZXI7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKi8KLXB1YmxpYyBjbGFzcyBYU0xDb3JlUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JLyoqCi0JICogVE9ETzogQWRkIEphdmFEb2MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV9QUk9KRUNUX1NFVFRJTkdTID0gInVzZS1wcm9qZWN0LXNldHRpbmdzIjsvLyROT04tTkxTLTEkCi0JCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIFhTTENvcmVQbHVnaW4gcGx1Z2luOwotCQotCXByaXZhdGUgU2VydmljZVRyYWNrZXIgcGFyc2VyVHJhY2tlciA9IG51bGw7Ci0KLQlwcml2YXRlIEJ1bmRsZUNvbnRleHQgYnVuZGxlQ29udGV4dDsKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBYU0xDb3JlUGx1Z2luKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCWJ1bmRsZUNvbnRleHQgPSBjb250ZXh0OwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFhTTENvcmVQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZWdpc3RlcmVkIFNBWCBwYXJzZXIgZmFjdG9yeSBvciBudWxsIGlmIG9uZQotCSAqIGRvZXMgbm90IGV4aXN0LgkgKiBAcmV0dXJuCi0JICogQHJldHVybiByZXR1cm5zIGEgU0FYUGFyc2VyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBTQVhQYXJzZXJGYWN0b3J5IGdldEZhY3RvcnkoKSB7Ci0JCWlmIChwYXJzZXJUcmFja2VyID09IG51bGwpIHsKLQkJCXBhcnNlclRyYWNrZXIgPSBuZXcgU2VydmljZVRyYWNrZXIoYnVuZGxlQ29udGV4dCwgU0FYUGFyc2VyRmFjdG9yeS5jbGFzcy5nZXROYW1lKCksIG51bGwpOwotCQkJcGFyc2VyVHJhY2tlci5vcGVuKCk7Ci0JCX0KLQkJU0FYUGFyc2VyRmFjdG9yeSB0aGVGYWN0b3J5ID0gKFNBWFBhcnNlckZhY3RvcnkpIHBhcnNlclRyYWNrZXIuZ2V0U2VydmljZSgpOwotCQlpZiAodGhlRmFjdG9yeSAhPSBudWxsKQotCQkJdGhlRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLQkJcmV0dXJuIHRoZUZhY3Rvcnk7Ci0JfQotCQotCS8qKgotCSAqIExvZ3MgdGhlIHNwZWNpZmllZCBzdGF0dXMgd2l0aCB0aGlzIHBsdWctaW4ncyBsb2cuCi0JICogCi0JICogQHBhcmFtIHN0YXR1cyBzdGF0dXMgdG8gbG9nCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgewotCQlnZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0JfQotCi0JLyoqCi0JICogTG9ncyB0aGUgc3BlY2lmaWVkIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZSB0aHJvd2FibGUgdG8gbG9nIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIGUpIHsKLQkJaWYgKGUgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7Ci0JCQlsb2coKChDb3JlRXhjZXB0aW9uKWUpLmdldFN0YXR1cygpKTsKLQkJfSBlbHNlIHsKLQkJCWxvZyhuZXdFcnJvclN0YXR1cyhNZXNzYWdlcy5YU0xDb3JlUGx1Z2luX2NvcmVFcnJvciwgZSkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgZXJyb3Igc3RhdHVzIGZvciB0aGlzIHBsdWctaW4gd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZQotCSAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBzdGF0dXMKLQkgKiBAcGFyYW0gZXhjZXB0aW9uIHRoZSBleGNlcHRpb24gdG8gYmUgaW5jbHVkZWQgaW4gdGhlIHN0YXR1cyBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogQHJldHVybiBhIG5ldyBlcnJvciBzdGF0dXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgbmV3RXJyb3JTdGF0dXMoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwvYW50L1hJbmNsdWRlVGFzay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC9hbnQvWEluY2x1ZGVUYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkOTVjMDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC9hbnQvWEluY2x1ZGVUYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSogQ29weXJpZ2h0IChjKSAyMDA4IExhcnMgVm9nZWwgDQotKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0qIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbHYxMC5odG1sDQotKg0KLSogQ29udHJpYnV0b3JzOg0KLSogTGFycyBWb2dlbCAtIExhcnMuVm9nZWxAZ21haWwuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC5hbnQ7DQotDQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwueGluY2x1ZGUuWEluY2x1ZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuTWVzc2FnZXM7DQotDQotLyoqDQotICogVGhpcyBjbGFzcyBwcm92aWRlcyBhbiBYSW5jbHVkZSBBTlQgdGFzayBkZWZpbml0aW9uLg0KLSAqIA0KLSAqIEBhdXRob3IgTGFycyBWb2dlbA0KLSAqDQotICovDQotcHVibGljIGNsYXNzIFhJbmNsdWRlVGFzayBleHRlbmRzIFRhc2sgew0KLQlwcml2YXRlIFN0cmluZyBpbkZpbGU7DQotDQotCXByaXZhdGUgU3RyaW5nIG91dEZpbGU7DQotDQotCS8qKg0KLQkgKiBUT0RPOiBBZGQgSmF2YURvYyANCi0JICogQHBhcmFtIGluRmlsZQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0SW4oU3RyaW5nIGluRmlsZSkgew0KLQkJbG9nKE1lc3NhZ2VzLlhJbmNsdWRlVGFza18wICsgaW5GaWxlLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsNCi0JCXRoaXMuaW5GaWxlID0gaW5GaWxlOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUT0RPOiBBZGQgSmF2YURvYw0KLQkgKiBAcGFyYW0gb3V0RmlsZQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0T3V0KFN0cmluZyBvdXRGaWxlKSB7DQotCQlsb2coTWVzc2FnZXMuWEluY2x1ZGVUYXNrXzEgKyBvdXRGaWxlLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsNCi0JCXRoaXMub3V0RmlsZSA9IG91dEZpbGU7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7DQotCQl2YWxpZGF0ZSgpOw0KLQkJbG9nKE1lc3NhZ2VzLlhJbmNsdWRlVGFza18yLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsNCi0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGluRmlsZSk7DQotCQlpZiAoIWZpbGUuZXhpc3RzKCkpIHsNCi0JCQl0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oTWVzc2FnZXMuWEluY2x1ZGVUYXNrXzMNCi0JCQkJCSsgaW5GaWxlKTsNCi0JCX0NCi0JCS8vIFdlIHdpbGwgY2hlY2sgaWYgdGhlIGZpbGUgZXhpc3RzLCBpZiBub3Qgd2Ugd2lsbCB0cnkgdG8gY3JlYXRlIHRoZQ0KLQkJLy8gb3V0cHV0IGZpbGUgYW5kIG9yIHRoZSBvdXRwdXQgZGlyZWN0b3J5DQotCQlGaWxlIGZpbGVvdXQgPSBuZXcgRmlsZShvdXRGaWxlKTsNCi0JCUZpbGUgZGlyID0gbmV3IEZpbGUoZmlsZW91dC5nZXRQYXJlbnQoKSk7DQotCQlpZiAoIWRpci5leGlzdHMoKSkgew0KLQkJCWxvZyhNZXNzYWdlcy5YSW5jbHVkZVRhc2tfNCArIGRpci5nZXRBYnNvbHV0ZVBhdGgoKSk7DQotDQotCQkJQm9vbGVhbiBzdWNjZXNzID0gKG5ldyBGaWxlKGRpci5nZXRBYnNvbHV0ZVBhdGgoKSkpLm1rZGlycygpOw0KLQkJCWlmICghc3VjY2Vzcykgew0KLQkJCQl0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oTWVzc2FnZXMuWEluY2x1ZGVUYXNrXzUNCi0JCQkJCQkrIG91dEZpbGUpOw0KLQkJCX0NCi0JCX0NCi0JCS8vIGNoZWNrIGlmIHRoZSBpbmNsdWRlZCBmaWxlcyBhcmUgbW9kaWZpZWQgYWZ0ZXIgdGhlIGxhc3QgcnVuDQotCQkvLyBBc3N1bXB0aW9uIHRoYXQgYWxsIHRoZSBpbmNsdWRlZCBmaWxlcyBhcmUgcGFydCBvZiB0aGUgaW5wdXQgZmlsZQ0KLQkJLy8gZGlyZWN0b3J5DQotCQlpZiAoY2hlY2ttb2RpZmllZChpbkZpbGUsIG91dEZpbGUpKSB7DQotCQkJbG9nKE1lc3NhZ2VzLlhJbmNsdWRlVGFza182LA0KLQkJCQkJUHJvamVjdC5NU0dfSU5GTyk7DQotCQkJWEluY2x1ZGVyIGxhID0gbmV3IFhJbmNsdWRlcigpOw0KLQkJCXRyeSB7DQotCQkJCWxhLmV4dHJhY3RYTUxGaWxlKGluRmlsZSwgb3V0RmlsZSk7DQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0JCQkJdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKE1lc3NhZ2VzLlhJbmNsdWRlVGFza183DQotCQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCXByaXZhdGUgYm9vbGVhbiBjaGVja21vZGlmaWVkKFN0cmluZyBpbkZpbGUsIFN0cmluZyBvdXRGaWxlKSB7DQotCQlGaWxlIGluID0gbmV3IEZpbGUoaW5GaWxlKTsNCi0JCUZpbGUgb3V0ID0gbmV3IEZpbGUob3V0RmlsZSk7DQotCQlGaWxlIGRpciA9IG5ldyBGaWxlKGluLmdldFBhcmVudCgpKTsNCi0NCi0JCUNvbGxlY3Rpb248RmlsZT4gYWxsRmlsZXMgPSBsaXN0RmlsZXMoZGlyLCB0cnVlKTsNCi0JCWZvciAoRmlsZSBmIDogYWxsRmlsZXMpIHsNCi0JCQlpZiAoZi5sYXN0TW9kaWZpZWQoKSA+IG91dC5sYXN0TW9kaWZpZWQoKSkgew0KLQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRPRE86IEFkZCBKYXZhRG9jDQotCSAqIEBwYXJhbSBkaXJlY3RvcnkNCi0JICogQHBhcmFtIHJlY3Vyc2UNCi0JICogQHJldHVybg0KLQkgKi8NCi0JcHVibGljIENvbGxlY3Rpb248RmlsZT4gbGlzdEZpbGVzKEZpbGUgZGlyZWN0b3J5LCBib29sZWFuIHJlY3Vyc2UpIHsNCi0JCS8vIExpc3Qgb2YgZmlsZXMgLyBkaXJlY3Rvcmllcw0KLQkJVmVjdG9yPEZpbGU+IGZpbGVzID0gbmV3IFZlY3RvcjxGaWxlPigpOw0KLQ0KLQkJLy8gR2V0IGZpbGVzIC8gZGlyZWN0b3JpZXMgaW4gdGhlIGRpcmVjdG9yeQ0KLQkJRmlsZVtdIGVudHJpZXMgPSBkaXJlY3RvcnkubGlzdEZpbGVzKCk7DQotDQotCQkvLyBHbyBvdmVyIGVudHJpZXMNCi0JCWZvciAoRmlsZSBlbnRyeSA6IGVudHJpZXMpIHsNCi0NCi0JCQlmaWxlcy5hZGQoZW50cnkpOw0KLQ0KLQkJCS8vIElmIHRoZSBmaWxlIGlzIGEgZGlyZWN0b3J5IGFuZCB0aGUgcmVjdXJzZSBmbGFnDQotCQkJLy8gaXMgc2V0LCByZWN1cnNlIGludG8gdGhlIGRpcmVjdG9yeQ0KLQkJCWlmIChyZWN1cnNlICYmIGVudHJ5LmlzRGlyZWN0b3J5KCkpIHsNCi0JCQkJZmlsZXMuYWRkQWxsKGxpc3RGaWxlcyhlbnRyeSwgcmVjdXJzZSkpOw0KLQkJCX0NCi0JCX0NCi0NCi0JCS8vIFJldHVybiBjb2xsZWN0aW9uIG9mIGZpbGVzDQotCQlyZXR1cm4gZmlsZXM7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlKCkgew0KLQkJaWYgKGluRmlsZSA9PSBudWxsKSB7DQotCQkJdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKE1lc3NhZ2VzLlhJbmNsdWRlVGFza184KTsNCi0JCX0NCi0JCWlmIChvdXRGaWxlID09IG51bGwpIHsNCi0JCQl0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oTWVzc2FnZXMuWEluY2x1ZGVUYXNrXzkpOw0KLQkJfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzAwYjgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuRGVmYXVsdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JRWNsaXBzZVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5WYWxpZGF0aW9uUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLlhTTENvcmVQbHVnaW47Ci0KLS8qKgotICogUHJlZmVyZW5jZXMgaW5pdGlhbGl6ZXIgZm9yIFhTTCBjb3JlIHByZWZlcmVuY2VzLgotICogCi0gKiBAYXV0aG9yIERvdWcgU2F0Y2h3ZWxsCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcgotewotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKQotCXsKLQkJSUVjbGlwc2VQcmVmZXJlbmNlcyBub2RlID0gbmV3IERlZmF1bHRTY29wZSgpLmdldE5vZGUoWFNMQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCkpOwotCQlub2RlLnB1dEludChWYWxpZGF0aW9uUHJlZmVyZW5jZXMuTUFYX0VSUk9SUywgMTAwKTsKLQkJbm9kZS5wdXRJbnQoVmFsaWRhdGlvblByZWZlcmVuY2VzLk1JU1NJTkdfUEFSQU0sIElNYXJrZXIuU0VWRVJJVFlfV0FSTklORyk7Ci0JCW5vZGUucHV0SW50KFZhbGlkYXRpb25QcmVmZXJlbmNlcy5YUEFUSFMsIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOwotCQlub2RlLnB1dEludChWYWxpZGF0aW9uUHJlZmVyZW5jZXMuQ0FMTF9URU1QTEFURVMsIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOwotCQlub2RlLnB1dEludChWYWxpZGF0aW9uUHJlZmVyZW5jZXMuRU1QVFlfUEFSQU0sIElNYXJrZXIuU0VWRVJJVFlfV0FSTklORyk7Ci0JCW5vZGUucHV0SW50KFZhbGlkYXRpb25QcmVmZXJlbmNlcy5NSVNTSU5HX0lOQ0xVREUsIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOwotCQlub2RlLnB1dEludChWYWxpZGF0aW9uUHJlZmVyZW5jZXMuQ0lSQ1VMQVJfUkVGLCBJTWFya2VyLlNFVkVSSVRZX0VSUk9SKTsKLQkJbm9kZS5wdXRJbnQoVmFsaWRhdGlvblByZWZlcmVuY2VzLlRFTVBMQVRFX0NPTkZMSUNULCBJTWFya2VyLlNFVkVSSVRZX0VSUk9SKTsKLQkJbm9kZS5wdXRJbnQoVmFsaWRhdGlvblByZWZlcmVuY2VzLk5BTUVfQVRUUklCVVRFX01JU1NJTkcsIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOwotCQlub2RlLnB1dEludChWYWxpZGF0aW9uUHJlZmVyZW5jZXMuTkFNRV9BVFRSSUJVVEVfRU1QVFksIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOwotCQlub2RlLnB1dEludChWYWxpZGF0aW9uUHJlZmVyZW5jZXMuRFVQTElDQVRFX1BBUkFNRVRFUiwgSU1hcmtlci5TRVZFUklUWV9FUlJPUik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC91dGlsL0RlYnVnLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL3V0aWwvRGVidWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjcyYWRhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL3V0aWwvRGVidWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCBhbmQgb3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gYmFzZWQgb24gV1RQIFNTRSBEZWJ1ZyBjbGFzcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotCi0KLS8qKgotICogRGVidWcgQ2xhc3MgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hlbiBEZWJ1Z2dpbmcgb3V0cHV0IHRvIHN5c3RlbSBvdXQuCi0gKiBAYXV0aG9yIGRjYXJ2ZXIKLSAqCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEZWJ1ZyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGNoZWNrRm9yTWVtb3J5TGVha3MgPSBmYWxzZTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBjb2xsZWN0U3RhdHMgPSBmYWxzZTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFQlVHID0gMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19USFJFQURMT0NBTCA9IGZhbHNlOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnQnJlYWtwb2ludHMgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWdDYXJldE1lZGlhdG9yID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnRGlzcGxheVRyZWVQb3NpdGlvbnMgPSBmYWxzZTsKLQkvLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z01lZGlhdG9yID0gZmFsc2U7Ci0JLy8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWdOb3RpZmljYXRpb24gPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWdOb3RpZmljYXRpb25BbmRFdmVudHMgPSBmYWxzZTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z05vdGlmeURlZmVycmVkID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnUmVjb25jaWxpbmcgPSBmYWxzZTsKLQkvLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z1J0ZkZvcm1hdFByb3ZpZGVyID0gZmFsc2U7Ci0JLy8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWdUYWdsaWJzID0gZmFsc2U7Ci0JLy8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWdUb2tlbml6ZXIgPSBmYWxzZTsKLQkKLQkvLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z0xhdW5jaGVyID0gZmFsc2U7Ci0JCi0JLyoqCi0JICogT3V0cHV0IE1vZGVsaW5nIE1lc3NhZ2VzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z1hTTE1vZGVsID0gZmFsc2U7Ci0JLy8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWdUcmVlTW9kZWwgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWdVcGRhdGVUcmVlUG9zaXRpb25zID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGRpc3BsYXlJbmZvID0gZmFsc2U7Ci0KLQkvKiogZWZmZWN0cyBvdXRwdXQgb2YgTG9nZ2VyICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGRpc3BsYXlUb0NvbnNvbGUgPSB0cnVlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkaXNwbGF5V2FybmluZ3MgPSBmYWxzZTsKLQkvLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBoZWFkUGFyc2luZyA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBqc0RlYnVnQ29udGV4dEFzc2lzdCA9IGZhbHNlOwotCS8vCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGpzRGVidWdTeW50YXhDb2xvcmluZyA9IGZhbHNlOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIExPQ0tTID0gZmFsc2U7Ci0JLy8gCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHBlcmZUZXN0ID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHBlcmZUZXN0QWRhcHRlckNsYXNzTG9hZGluZyA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBwZXJmVGVzdEZvcm1hdCA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBwZXJmVGVzdFJhd1N0cnVjdHVyZWREb2N1bWVudE9ubHkgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gcGVyZlRlc3RTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudE9ubHkgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gcGVyZlRlc3RTdHJ1Y3R1cmVkRG9jdW1lbnRPbmx5ID0gZmFsc2U7Ci0KLQkvLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBzeW50YXhIaWdobGlnaHRpbmcgPSBmYWxzZTsKLQkvLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiB1c2VTdGFuZGFyZEVvbEluV2lkZ2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBGb3IgdGVzdHMgYW5kIGRlYnVnIG9ubHkKLQkgKiBAcGFyYW0gc3RydWN0dXJlZERvY3VtZW50IAotCSAqLwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIGR1bXAoSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJZHVtcChzdHJ1Y3R1cmVkRG9jdW1lbnQsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgZHVtcChJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCwgYm9vbGVhbiB2ZXJib3NlKSB7Ci0JCUlUZXh0UmVnaW9uQ29sbGVjdGlvbiBmbGF0Tm9kZSA9IG51bGw7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiRHVtcCBvZiBzdHJ1Y3R1cmVkRG9jdW1lbnQ6Iik7IC8vJE5PTi1OTFMtMSQKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgZmxhdE5vZGVzID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkxpc3QoKTsKLQkJRW51bWVyYXRpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyA9IGZsYXROb2Rlcy5lbGVtZW50cygpOwotCQl3aGlsZSAoc3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJZmxhdE5vZGUgPSAoSVRleHRSZWdpb25Db2xsZWN0aW9uKSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLm5leHRFbGVtZW50KCk7Ci0JCQlpZiAoIXZlcmJvc2UpIHsKLQkJCQlTdHJpbmcgb3V0U3RyaW5nID0gZmxhdE5vZGUudG9TdHJpbmcoKTsKLQkJCQlvdXRTdHJpbmcgPSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHMuZXNjYXBlKG91dFN0cmluZyk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKG91dFN0cmluZyk7Ci0JCQl9IGVsc2UgewotCQkJCWR1bXAoZmxhdE5vZGUsIHZlcmJvc2UpOwotCQkJfQotCQl9Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIj0gPSA9ID0gPSA9Iik7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlZ2lvbiAKLQkgKiBAcGFyYW0gZmxhdE5vZGUKLQkgKiBAcGFyYW0gdmVyYm9zZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBkdW1wKElUZXh0UmVnaW9uQ29sbGVjdGlvbiByZWdpb24sIGJvb2xlYW4gdmVyYm9zZSkgewotCQlpZiAocmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICh2ZXJib3NlKSB7Ci0JCQlwcmludFBhcmVudChyZWdpb24pOwotCQl9Ci0JCXByaW50Q2hpbGRSZWdpb25zKHJlZ2lvbiwgMCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludENoaWxkUmVnaW9ucyhJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gcmVnaW9uLCBpbnQgZGVwdGgpIHsKLQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkvLyA9PT4gLy8gSVRleHRSZWdpb25Db2xsZWN0aW9uIHJlZ2lvbkNvbGxlY3Rpb24gPSByZWdpb247Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4ocmVnaW9uKTsKLQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25MaXN0ID0gcmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9uTGlzdC5zaXplKCk7IGkrKykgewotCQkJCUlUZXh0UmVnaW9uIHIgPSByZWdpb25MaXN0LmdldChpKTsKLQkJCQlpZiAociBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29sbGVjdGlvbikgewotCQkJCQlJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gcmMgPSAoSVRleHRSZWdpb25Db2xsZWN0aW9uKSByOwotCQkJCQlwcmludENoaWxkUmVnaW9ucyhyYywgZGVwdGgrKyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKHNwYWNlKGRlcHRoKSArIHIpOwotCQkJCQlkZXB0aC0tOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNpbXBsZSB1dGlsaXR5IHRvIG1ha2Ugc3VyZSBwcmludGxuJ3MgYXJlIHNvbWUgd2hhdCBpbiBvcmRlcgotCSAqIEBwYXJhbSBtc2cgCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBzeW5jaHJvbml6ZWQgdm9pZCBwcmludGxuKFN0cmluZyBtc2cpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgIlx0IiArIG1zZyk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50UGFyZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiICAgIFtwYXJlbnQgZG9jdW1lbnQ6ICIgKyB0b1N0cmluZ1V0aWwocmVnaW9uLmdldFBhcmVudERvY3VtZW50KCkpICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludFBhcmVudChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gcmVnaW9uKSB7Ci0JCWlmIChyZWdpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQlwcmludFBhcmVudCgoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgcmVnaW9uKTsKLQkJfSBlbHNlIGlmIChyZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJcHJpbnRQYXJlbnQoKElUZXh0UmVnaW9uQ29udGFpbmVyKSByZWdpb24pOwotCQl9IGVsc2UKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgIFtwYXJlbnQgZG9jdW1lbnQ6ICIgKyAiKG5hKSIgKyAiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnRQYXJlbnQoSVRleHRSZWdpb25Db250YWluZXIgcmVnaW9uKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiICAgIFtwYXJlbnQgZG9jdW1lbnQ6ICIgKyB0b1N0cmluZ1V0aWwocmVnaW9uLmdldFBhcmVudCgpKSArICJdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZXB0aAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgc3BhY2UoaW50IGRlcHRoKSB7Ci0JCVN0cmluZyByZXN1bHQgPSAiICAiOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVwdGg7IGkrKykgewotCQkJcmVzdWx0ICs9ICIgICI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHRvU3RyaW5nVXRpbChJU3RydWN0dXJlZERvY3VtZW50IG9iamVjdCkgewotCQlTdHJpbmcgY2xhc3NOYW1lID0gb2JqZWN0LmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQlTdHJpbmcgc2hvcnRDbGFzc05hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKGNsYXNzTmFtZS5sYXN0SW5kZXhPZigiLiIpICsgMSk7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHJlc3VsdCA9IHNob3J0Q2xhc3NOYW1lOwotCQkvLyBOT1RFOiBpZiB0aGUgZG9jdW1lbnQgaGVsZCBieSBhbnkgcmVnaW9uIGhhcyBiZWVuIHVwZGF0ZWQgYW5kIHRoZQotCQkvLyByZWdpb24gb2Zmc2V0cyBoYXZlIG5vdAotCQkvLyB5ZXQgYmVlbiB1cGRhdGVkLCB0aGUgb3V0cHV0IGZyb20gdGhpcyBtZXRob2QgaW52YWxpZC4KLQkJcmV0dXJuIHJlc3VsdDsKLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHRvU3RyaW5nVXRpbChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gb2JqZWN0KSB7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSBvYmplY3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCVN0cmluZyBzaG9ydENsYXNzTmFtZSA9IGNsYXNzTmFtZS5zdWJzdHJpbmcoY2xhc3NOYW1lLmxhc3RJbmRleE9mKCIuIikgKyAxKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgcmVzdWx0ID0gc2hvcnRDbGFzc05hbWU7Ci0JCS8vIE5PVEU6IGlmIHRoZSBkb2N1bWVudCBoZWxkIGJ5IGFueSByZWdpb24gaGFzIGJlZW4gdXBkYXRlZCBhbmQgdGhlCi0JCS8vIHJlZ2lvbiBvZmZzZXRzIGhhdmUgbm90Ci0JCS8vIHlldCBiZWVuIHVwZGF0ZWQsIHRoZSBvdXRwdXQgZnJvbSB0aGlzIG1ldGhvZCBpbnZhbGlkLgotCQlyZXR1cm4gcmVzdWx0OwotCi0JfQotCi0JLyoqCi0JICogRGVidWcgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgRGVidWcoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC91dGlsL0ZpbGVVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL3V0aWwvRmlsZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVmOTQwNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL3V0aWwvRmlsZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLlhTTENvcmU7Ci0KLS8qKgotICogVGhpcyBpcyBhIGdlbmVyYWwgZmlsZSB1dGlsaXR5IGNsYXNzLgotICogCi0gKiBAYXV0aG9yIGRjYXJ2ZXIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlVXRpbCB7Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIGEgZmlsZSBpcyBvbmUgb2YgdGhlIHZhbGlkIFhNTCBjb250ZW50IHR5cGVzLgotCSAqIEBwYXJhbSBmaWxlIFRoZSBpbnB1dCBJRmlsZSB0byBjaGVjawotCSAqIEByZXR1cm4gVHJ1ZSBpZiBpdCBpcyBhIFhNTCBmaWxlLCBmYWxzZSBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzWE1MRmlsZShJRmlsZSBmaWxlKQotCXsKLQkJSUNvbnRlbnRUeXBlTWFuYWdlciBjb250ZW50VHlwZU1hbmFnZXIgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKTsKLQkJSUNvbnRlbnRUeXBlW10gdHlwZXMgPSBjb250ZW50VHlwZU1hbmFnZXIuZmluZENvbnRlbnRUeXBlc0ZvcihmaWxlLmdldE5hbWUoKSk7Ci0JCWZvciAoSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlIDogdHlwZXMpCi0JCXsKLQkJCWlmIChjb250ZW50VHlwZS5pc0tpbmRPZihjb250ZW50VHlwZU1hbmFnZXIuZ2V0Q29udGVudFR5cGUoIm9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiKSkgfHwgY29udGVudFR5cGUuaXNLaW5kT2YoY29udGVudFR5cGVNYW5hZ2VyLmdldENvbnRlbnRUeXBlKCJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueG1sc291cmNlIikpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiBhIGZpbGUgaXMgYSBYU0xUIEZpbGUuCi0JICogQHBhcmFtIGZpbGUgVGhlIGlucHV0IElGaWxlIHRvIGNoZWNrLgotCSAqIEByZXR1cm4gVHJ1ZSBpZiBpdCBpcyBhIFhTTFQgZmlsZSwgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1hTTEZpbGUoSUZpbGUgZmlsZSkKLQl7Ci0JCUlDb250ZW50VHlwZU1hbmFnZXIgY29udGVudFR5cGVNYW5hZ2VyID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCk7Ci0JCUlDb250ZW50VHlwZVtdIHR5cGVzID0gY29udGVudFR5cGVNYW5hZ2VyLmZpbmRDb250ZW50VHlwZXNGb3IoZmlsZS5nZXROYW1lKCkpOwotCQlmb3IgKElDb250ZW50VHlwZSBjb250ZW50VHlwZSA6IHR5cGVzKQotCQl7Ci0JCQlpZiAoY29udGVudFR5cGUuZXF1YWxzKGNvbnRlbnRUeXBlTWFuYWdlci5nZXRDb250ZW50VHlwZShYU0xDb3JlLlhTTF9DT05URU5UX1RZUEUpKSkKLQkJCXsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL3V0aWwvU3RydWN0dXJlZERvY3VtZW50VXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC91dGlsL1N0cnVjdHVyZWREb2N1bWVudFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgyN2QzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL3V0aWwvU3RydWN0dXJlZERvY3VtZW50VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLQotLyoqCi0gKiBHZW5lcmFsIFB1cnBvc2UgdXRpbGl0eSBjbGFzc2VzIHRvIGNvbnZlcnQgZnJvbSBTdHJ1Y3R1cmVkRG9jdW1lbnQgdG8gRE9NLgotICogCi0gKiBAYXV0aG9yIGRjYXJ2ZXIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkRG9jdW1lbnRVdGlsIHsKLQkKLQkvKioKLQkgKiBHaXZlbiBhIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhbmQgYSBUZXh0UmVnaW9uLCByZXR1cm4gYQotCSAqIElET01Ob2RlIGZvciB0aGF0IHBhcnRpY3VsYXIgcG9zaXRpb24gaW4gdGhlIFN0cnVjdHVyZWREb2N1bWVudAotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudFJlZ2lvbgotCSAqIEBwYXJhbSB0ZXh0UmVnaW9uCi0JICogQHJldHVybiBJRE9NTm9kZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSURPTU5vZGUgZ2V0Tm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uLCBJVGV4dFJlZ2lvbiB0ZXh0UmVnaW9uKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudFJlZ2lvbi5nZXRQYXJlbnREb2N1bWVudCgpKTsKLQkJSURPTURvY3VtZW50IGRvY3VtZW50Tm9kZSA9ICgoSURPTU1vZGVsKSBzTW9kZWwpLmdldERvY3VtZW50KCk7Ci0KLQkJcmV0dXJuIChJRE9NTm9kZSlkb2N1bWVudE5vZGUuZ2V0TW9kZWwoKS5nZXRJbmRleGVkUmVnaW9uKGRvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHRleHRSZWdpb24pKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9NYXhFcnJvcnNFeGNlZWRlZEV4Y2VwdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL01heEVycm9yc0V4Y2VlZGVkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MGJjOGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL01heEVycm9yc0V4Y2VlZGVkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotLyoqCi0gKiBBbiBleGNlcHRpb24gdXNlZCB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBtYXhpbXVtIG51bWJlciBvZiBlcnJvcnMgaGFzIGJlZW4gcmVhY2hlZCAKLSAqIGZvciBhIGdpdmVuIFN0eWxlc2hlZXQgdmFsaWRhdGlvbi4KLSAqIAotICogQGF1dGhvciBEb3VnIFNhdGNod2VsbAotICovCi1wdWJsaWMgY2xhc3MgTWF4RXJyb3JzRXhjZWVkZWRFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsJCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vWFNMVmFsaWRhdGlvbk1lc3NhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9YU0xWYWxpZGF0aW9uTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWFkODQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9YU0xWYWxpZGF0aW9uTWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLlZhbGlkYXRpb25NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5tb2RlbC5YU0xOb2RlOwotCi0vKioKLSAqIEEgdmFsaWRhdGlvbiBtZXNzYWdlIHNwZWNpZmljIHRvIHRoZSBYU0wgdmFsaWRhdG9yIHdoaWNoIGFkZHMgdGhlIGFiaWxpdHkgCi0gKiB0byBzcGVjaWZ5IHRoZSBYU0wgbm9kZS4KLSAqIAotICogQGF1dGhvciBEb3VnIFNhdGNod2VsbAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLlZhbGlkYXRpb25NZXNzYWdlCi0gKi8KLXB1YmxpYyBjbGFzcyBYU0xWYWxpZGF0aW9uTWVzc2FnZSBleHRlbmRzIFZhbGlkYXRpb25NZXNzYWdlCi17Ci0JcHJpdmF0ZSBYU0xOb2RlIG5vZGU7Ci0JcHJpdmF0ZSBpbnQgcmVhbFNldmVyaXR5OwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMuCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIFRoZSBtZXNzYWdlIGZvciB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlLgotCSAqIEBwYXJhbSBsaW5lTnVtYmVyCi0JICogICAgICAgICAgICBUaGUgbGluZSBsb2NhdGlvbiBvZiB0aGUgbWVzc2FnZS4KLQkgKiBAcGFyYW0gY29sdW1uTnVtYmVyCi0JICogICAgICAgICAgICBUaGUgY29sdW1uIGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlLgotCSAqIEBwYXJhbSB1cmkKLQkgKiAgICAgICAgICAgIFRoZSB1cmkgb2YgdGhlIGZpbGUgdGhlIG1lc3NhZ2UgaXMgZm9yLgotCSAqLwotCXB1YmxpYyBYU0xWYWxpZGF0aW9uTWVzc2FnZShTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmVOdW1iZXIsIGludCBjb2x1bW5OdW1iZXIsIFN0cmluZyB1cmkpCi0JewotCQlzdXBlcihtZXNzYWdlLCBsaW5lTnVtYmVyLCBjb2x1bW5OdW1iZXIsIHVyaSk7Ci0JfQotCQotCS8qKgotCSAqIFNldCB0aGUgbm9kZSB0aGF0IHRoaXMgbWVzc2FnZSBhcHBsaWVzIHRvLgotCSAqIAotCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCi0JICovCi0JcHVibGljIHZvaWQgc2V0Tm9kZShYU0xOb2RlIG5vZGUpCi0JewotCQl0aGlzLm5vZGUgPSBub2RlOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgbm9kZSB0aGF0IHRoaXMgbWVzc2FnZSBhcHBsaWVzIHRvLgotCSAqIEByZXR1cm4gdGhlIG5vZGUKLQkgKi8KLQlwdWJsaWMgWFNMTm9kZSBnZXROb2RlKCkKLQl7Ci0JCXJldHVybiBub2RlOwotCX0KLQkKLQkvKioKLQkgKiBUaGUgc2V2ZXJpdHkgc2V0IGhlcmUgc2hvdWxkIGJlIHRoZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlIHNldmVyaXR5LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFNldmVyaXR5KGludCBzZXYpCi0JewotCQl0aGlzLnJlYWxTZXZlcml0eSA9IHNldjsKLQkJLy8gdGhlIHN1cGVyY2xhc3Mgb25seSB1bmRlcnN0YW5kcyBoaWdoIGFuZCBsb3cuCi0JCWludCBzZXZlcml0eTsKLQkJc3dpdGNoKHNldikKLQkJewotCQkJY2FzZSBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZOgotCQkJCXNldmVyaXR5ID0gVmFsaWRhdGlvbk1lc3NhZ2UuU0VWX0hJR0g7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXNldmVyaXR5ID0gVmFsaWRhdGlvbk1lc3NhZ2UuU0VWX0xPVzsKLQkJfQotCQlzdXBlci5zZXRTZXZlcml0eShzZXZlcml0eSk7Ci0JfQotCQotCS8qKgotCSAqIFdvcmthcm91bmQgZm9yIHN1cGVyY2xhc3MncyBiaXphcnJlIGhhbmRsaW5nIG9mIHNldmVyaXR5Ci0JICogCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UmVhbFNldmVyaXR5KCkKLQl7Ci0JCXJldHVybiByZWFsU2V2ZXJpdHk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJcmV0dXJuIG5vZGUudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vWFNMVmFsaWRhdGlvblJlcG9ydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hTTFZhbGlkYXRpb25SZXBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhiMGFmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vWFNMVmFsaWRhdGlvblJlcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5WYWxpZGF0aW9uTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLlZhbGlkYXRpb25SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLm1vZGVsLlhTTE5vZGU7Ci0KLQotLyoqCi0gKiBBIHZhbGlkYXRpb24gcmVwb3J0IGZvciB0aGUgWFNMIHZhbGlkYXRvci4KLSAqIAotICogQGF1dGhvciBEb3VnIFNhdGNod2VsbAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLlZhbGlkYXRpb25SZXBvcnQKLSAqLwotcHVibGljIGNsYXNzIFhTTFZhbGlkYXRpb25SZXBvcnQgaW1wbGVtZW50cyBWYWxpZGF0aW9uUmVwb3J0Ci17Ci0JcHJpdmF0ZSBib29sZWFuIHZhbGlkID0gdHJ1ZTsKLQlwcml2YXRlIFN0cmluZyB1cmk7Ci0JcHJpdmF0ZSBMaXN0PFhTTFZhbGlkYXRpb25NZXNzYWdlPiBlcnJvcnMgPSBuZXcgQXJyYXlMaXN0PFhTTFZhbGlkYXRpb25NZXNzYWdlPigpOwotCXByaXZhdGUgTGlzdDxYU0xWYWxpZGF0aW9uTWVzc2FnZT4gd2FybmluZ3MgPSBuZXcgQXJyYXlMaXN0PFhTTFZhbGlkYXRpb25NZXNzYWdlPigpOwotCXByaXZhdGUgTGlzdDxYU0xWYWxpZGF0aW9uTWVzc2FnZT4gaW5mb3MgPSBuZXcgQXJyYXlMaXN0PFhTTFZhbGlkYXRpb25NZXNzYWdlPigpOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMuCi0JICogCi0JICogQHBhcmFtIHVyaQotCSAqICAgICAgICAgICAgdGhlIFVSSSBvZiB0aGUgZW50aXR5IHRoYXQgdGhpcyByZXBvcnQgYXBwbGllcyB0bwotCSAqLwotCXB1YmxpYyBYU0xWYWxpZGF0aW9uUmVwb3J0KFN0cmluZyB1cmkpCi0JewotCQl0aGlzLnVyaSA9IHVyaTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbGlkYXRpb24gbWVzc2FnZXMuCi0JICogCi0JICogQHJldHVybiB2YWxpZGF0aW9uIG1lc3NhZ2VzCi0JICovCi0JcHVibGljIExpc3Q8WFNMVmFsaWRhdGlvbk1lc3NhZ2U+IGdldEVycm9ycygpCi0JewotCQlyZXR1cm4gZXJyb3JzOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbGlkYXRpb24gbWVzc2FnZXMKLQkgKi8KLQlwdWJsaWMgTGlzdDxYU0xWYWxpZGF0aW9uTWVzc2FnZT4gZ2V0V2FybmluZ3MoKQotCXsKLQkJcmV0dXJuIHdhcm5pbmdzOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbGlkYXRpb24gbWVzc2FnZXMKLQkgKi8KLQlwdWJsaWMgTGlzdDxYU0xWYWxpZGF0aW9uTWVzc2FnZT4gZ2V0SW5mb3MoKQotCXsKLQkJcmV0dXJuIGluZm9zOwotCX0KLQotCS8qKgotCSAqIEFkZCBhbiBlcnJvciBtZXNzYWdlIGZvciB0aGUgZ2l2ZW4gWFNMIG5vZGUuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIHRoZSBub2RlIHRoZSB3YXJuaW5nIGFwcGxpZXMgdG8KLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gYXNzb2NpYXRlIHdpdGggdGhlIG5vZGUKLQkgKiBAcmV0dXJuIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UgY3JlYXRlZAotCSAqLwotCXB1YmxpYyBWYWxpZGF0aW9uTWVzc2FnZSBhZGRFcnJvcihYU0xOb2RlIG5vZGUsIFN0cmluZyBtZXNzYWdlKQotCXsKLQkJdmFsaWQgPSBmYWxzZTsKLQkJWFNMVmFsaWRhdGlvbk1lc3NhZ2UgbXNnID0gbmV3IFhTTFZhbGlkYXRpb25NZXNzYWdlKG1lc3NhZ2UsIG5vZGUuZ2V0TGluZU51bWJlcigpICsgMSwgbm9kZS5nZXRDb2x1bW5OdW1iZXIoKSArIDEsIGdldEZpbGVVUkkoKSk7Ci0JCW1zZy5zZXRTZXZlcml0eShJTWVzc2FnZS5ISUdIX1NFVkVSSVRZKTsKLQkJbXNnLnNldE5vZGUobm9kZSk7Ci0JCWVycm9ycy5hZGQobXNnKTsKLQkJcmV0dXJuIG1zZzsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYW4gd2FybmluZyBtZXNzYWdlIGZvciB0aGUgZ2l2ZW4gWFNMIG5vZGUuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIHRoZSBub2RlIHRoZSB3YXJuaW5nIGFwcGxpZXMgdG8KLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gYXNzb2NpYXRlIHdpdGggdGhlIG5vZGUKLQkgKiBAcmV0dXJuIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UgY3JlYXRlZAotCSAqLwotCXB1YmxpYyBWYWxpZGF0aW9uTWVzc2FnZSBhZGRXYXJuaW5nKFhTTE5vZGUgbm9kZSwgU3RyaW5nIG1lc3NhZ2UpCi0JewotCQlYU0xWYWxpZGF0aW9uTWVzc2FnZSBtc2cgPSBuZXcgWFNMVmFsaWRhdGlvbk1lc3NhZ2UobWVzc2FnZSwgbm9kZS5nZXRMaW5lTnVtYmVyKCkgKyAxLCBub2RlLmdldENvbHVtbk51bWJlcigpICsgMSwgZ2V0RmlsZVVSSSgpKTsKLQkJbXNnLnNldFNldmVyaXR5KElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSk7Ci0JCW1zZy5zZXROb2RlKG5vZGUpOwotCQl3YXJuaW5ncy5hZGQobXNnKTsKLQkJcmV0dXJuIG1zZzsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYW4gaW5mbyBtZXNzYWdlIGZvciB0aGUgZ2l2ZW4gWFNMIG5vZGUuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIHRoZSBub2RlIHRoZSB3YXJuaW5nIGFwcGxpZXMgdG8KLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gYXNzb2NpYXRlIHdpdGggdGhlIG5vZGUKLQkgKiBAcmV0dXJuIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UgY3JlYXRlZAotCSAqLwotCXB1YmxpYyBWYWxpZGF0aW9uTWVzc2FnZSBhZGRJbmZvKFhTTE5vZGUgbm9kZSwgU3RyaW5nIG1lc3NhZ2UpCi0JewotCQlYU0xWYWxpZGF0aW9uTWVzc2FnZSBtc2cgPSBuZXcgWFNMVmFsaWRhdGlvbk1lc3NhZ2UobWVzc2FnZSwgbm9kZS5nZXRMaW5lTnVtYmVyKCkgKyAxLCBub2RlLmdldENvbHVtbk51bWJlcigpICsgMSwgZ2V0RmlsZVVSSSgpKTsKLQkJbXNnLnNldFNldmVyaXR5KElNZXNzYWdlLkxPV19TRVZFUklUWSk7Ci0JCW1zZy5zZXROb2RlKG5vZGUpOwotCQlpbmZvcy5hZGQobXNnKTsKLQkJcmV0dXJuIG1zZzsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIFVSSSB0aGF0IHRoaXMgcmVwb3J0IGFwcGxpZXMgdG8uCi0JICogCi0JICogQHJldHVybiB0aGUgVVJJCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWxlVVJJKCkKLQl7Ci0JCXJldHVybiB1cmk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLmdldE5lc3RlZE1lc3NhZ2VzCi0JICogCi0JICogQHJldHVybiBudWxsCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEhhc2hNYXAgZ2V0TmVzdGVkTWVzc2FnZXMoKQotCXsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiB2YWxpZGF0aW9uIG1lc3NhZ2VzLgotCSAqIAotCSAqIEByZXR1cm4gQW4gYXJyYXkgb2YgdmFsaWRhdGlvbiBtZXNzYWdlcy4KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdGlvbk1lc3NhZ2VbXSBnZXRWYWxpZGF0aW9uTWVzc2FnZXMoKQotCXsKLQkJTGlzdDxWYWxpZGF0aW9uTWVzc2FnZT4gbWVzc2FnZXMgPSBuZXcgQXJyYXlMaXN0PFZhbGlkYXRpb25NZXNzYWdlPigpOwotCQltZXNzYWdlcy5hZGRBbGwoZXJyb3JzKTsKLQkJbWVzc2FnZXMuYWRkQWxsKHdhcm5pbmdzKTsKLQkJbWVzc2FnZXMuYWRkQWxsKGluZm9zKTsKLQkJcmV0dXJuIG1lc3NhZ2VzLnRvQXJyYXkobmV3IFZhbGlkYXRpb25NZXNzYWdlWzBdKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGZpbGUgaXMgdmFsaWQuIFRoZSBmaWxlIG1heSBoYXZlIHdhcm5pbmdzIGFzc29jaWF0ZWQgd2l0aCBpdC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGZpbGUgaXMgdmFsaWQsIGZhbHNlIG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkKLQl7Ci0JCXJldHVybiB2YWxpZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vWFNMVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vWFNMVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZGVjYTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hTTFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIERhdmlkIENhcnZlciAoU1RBUikgLSBidWcgMjMwMDcyIC0gUHJvamVjdCBsZXZlbCBzcGVjaWZpYyB2YWxpZGF0aW9uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAtIGJ1ZyAyMjYyNDUgLSBYUGF0aCAyLjAgdmFsaWRhdGlvbiBmb3IgWFNMVAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aEV4cHJlc3Npb25FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlByb2plY3RTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuVmFsaWRhdGlvbk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5WYWxpZGF0aW9uUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwueHBhdGguY29yZS51dGlsLlhQYXRoMjBIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC5jb3JlLnV0aWwuWFNMVFhQYXRoSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5WYWxpZGF0aW9uUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLlhTTENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLlhTTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLm1vZGVsLkNhbGxUZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUubW9kZWwuSW5jbHVkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUubW9kZWwuUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5tb2RlbC5TdHlsZXNoZWV0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLm1vZGVsLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5tb2RlbC5YU0xBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLm1vZGVsLlhTTEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLm1vZGVsLlhTTE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLk1lc3NhZ2VzOwotCi0KLS8qKgotICogVGhlIFhTTCB2YWxpZGF0b3IgZm9yIHdvcmtzcGFjZSBYU0wgZmlsZXMuCi0gKiAKLSAqIEBhdXRob3IgRG91ZyBTYXRjaHdlbGwKLSAqLwotcHVibGljIGNsYXNzIFhTTFZhbGlkYXRvcgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYU0xUMl9WZXJzaW9uID0gIjIuMCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBYU0xWYWxpZGF0b3IgaW5zdGFuY2U7Ci0JcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OwotCi0JcHJpdmF0ZSBYU0xWYWxpZGF0b3IoKQotCXsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZSB0aGUgZ2l2ZW4gWFNMIGZpbGUuIFNhbWUgYXMgPGNvZGU+dmFsaWRhdGUoeHNsRmlsZSxyZXBvcnQsZm9yY2VCdWlsZCk8L2NvZGU+IGV4Y2VwdCBhIG5ldyByZXBvcnQgaXMgY3JlYXRlZCBhbmQgcmV0dXJuZWQuCi0JICogCi0JICogQHBhcmFtIHhzbEZpbGUgdGhlIFhTTCBmaWxlCi0JICogQHBhcmFtIGZvcmNlQnVpbGQgdHJ1ZSBpZiBidWlsZCBzaG91bGQgYWx3YXlzIGJlIGZvcmNlZAotCSAqIEByZXR1cm4gdGhlIHZhbGlkYXRpb24gcmVwb3J0Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIGFueSBleGNlcHRpb24gb2NjdXJzIHdoaWxlIHZhbGlkYXRpbmcKLQkgKi8KLQlwdWJsaWMgVmFsaWRhdGlvblJlcG9ydCB2YWxpZGF0ZShJRmlsZSB4c2xGaWxlLCBib29sZWFuIGZvcmNlQnVpbGQpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlYU0xWYWxpZGF0aW9uUmVwb3J0IHJlcG9ydCA9IG5ldyBYU0xWYWxpZGF0aW9uUmVwb3J0KHhzbEZpbGUuZ2V0TG9jYXRpb25VUkkoKS50b1N0cmluZygpKTsKLQkJcHJvamVjdCA9IHhzbEZpbGUuZ2V0UHJvamVjdCgpOwotCQl2YWxpZGF0ZSh4c2xGaWxlLCByZXBvcnQsIGZvcmNlQnVpbGQpOwotCQlyZXR1cm4gcmVwb3J0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlIHRoZSBnaXZlbiBYU0wgZmlsZSB1c2luZyB0aGUgc3BlY2lmaWVkIHJlcG9ydC4KLQkgKiAKLQkgKiBAcGFyYW0geHNsRmlsZSB0aGUgWFNMIGZpbGUKLQkgKiBAcGFyYW0gcmVwb3J0IHRoZSByZXBvcnQgdG8gdXNlIGZvciByZXBvcnRpbmcgdmFsaWRhdGlvbiBlcnJvcnMKLQkgKiBAcGFyYW0gZm9yY2VCdWlsZCB0cnVlIGlmIGJ1aWxkIHNob3VsZCBhbHdheXMgYmUgZm9yY2VkCi0JICogQHJldHVybiB0aGUgdmFsaWRhdGlvbiByZXBvcnQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgYW55IGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgdmFsaWRhdGluZwotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElGaWxlIHhzbEZpbGUsIFhTTFZhbGlkYXRpb25SZXBvcnQgcmVwb3J0LCBib29sZWFuIGZvcmNlQnVpbGQpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlTdHlsZXNoZWV0TW9kZWwgc3R5bGVzaGVldDsKLQkJaWYgKGZvcmNlQnVpbGQpCi0JCQlzdHlsZXNoZWV0ID0gWFNMQ29yZS5nZXRJbnN0YW5jZSgpLmJ1aWxkU3R5bGVzaGVldCh4c2xGaWxlKTsKLQkJZWxzZQotCQkJc3R5bGVzaGVldCA9IFhTTENvcmUuZ2V0SW5zdGFuY2UoKS5nZXRTdHlsZXNoZWV0KHhzbEZpbGUpOwotCQkKLQkJcHJvamVjdCA9IHhzbEZpbGUuZ2V0UHJvamVjdCgpOwotCi0JCWxvbmcgc3RhcnQ7Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1hTTE1vZGVsKSB7Ci0JCQlzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl9Ci0JCWlmIChzdHlsZXNoZWV0IT1udWxsKQotCQl7Ci0JCQl0cnkKLQkJCXsKLQkJCQljYWxjdWxhdGVQcm9ibGVtcyhzdHlsZXNoZWV0LCByZXBvcnQpOwotCQkJfQotCQkJY2F0Y2ggKE1heEVycm9yc0V4Y2VlZGVkRXhjZXB0aW9uIGUpCi0JCQl7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQl9Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1hTTE1vZGVsKSB7Ci0JCQlsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJWQUxJREFURSAiK3hzbEZpbGUrIiBpbiAiKyhlbmQtc3RhcnQpKyJtcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNhbGN1bGF0ZVByb2JsZW1zKFN0eWxlc2hlZXRNb2RlbCBzdHlsZXNoZWV0Q29tcG9zZWQsIFhTTFZhbGlkYXRpb25SZXBvcnQgcmVwb3J0KSB0aHJvd3MgTWF4RXJyb3JzRXhjZWVkZWRFeGNlcHRpb24KLQl7Ci0JCS8vIGNpcmN1bGFyIHJlZmVyZW5jZSBjaGVjawotCQljaGVja0NpcmN1bGFyUmVmKHN0eWxlc2hlZXRDb21wb3NlZCwgcmVwb3J0KTsKLQkJLy8gaW5jbHVkZSBjaGVja3MKLQkJY2hlY2tJbmNsdWRlcyhzdHlsZXNoZWV0Q29tcG9zZWQsIHJlcG9ydCk7Ci0JCS8vIHRlbXBsYXRlIGNoZWNrcwotCQljaGVja1RlbXBsYXRlcyhzdHlsZXNoZWV0Q29tcG9zZWQsIHJlcG9ydCk7Ci0JCS8vIGNhbGwtdGVtcGxhdGUgY2hlY2tzCi0JCWNoZWNrQ2FsbFRlbXBsYXRlcyhzdHlsZXNoZWV0Q29tcG9zZWQsIHJlcG9ydCk7Ci0JCS8vIGNhbGwtdGVtcGxhdGUgY2hlY2tzCi0JCWlmIChnZXRQcmVmZXJlbmNlKFZhbGlkYXRpb25QcmVmZXJlbmNlcy5YUEFUSFMpID4gSU1hcmtlci5TRVZFUklUWV9JTkZPKQotCQkJY2hlY2tYUGF0aHMoc3R5bGVzaGVldENvbXBvc2VkLmdldFN0eWxlc2hlZXQoKSwgcmVwb3J0KTsKLQkJCi0JCS8vIFRPRE8gYSkgY2hlY2sgZ2xvYmFscyBhbmQgYikgYXBwbHktdGVtcGxhdGVzIHdoZXJlIG1vZGUgZG9lcyBub3QgZXhpc3QKLQl9Ci0JCi0JcHJpdmF0ZSBpbnQgZ2V0UHJlZmVyZW5jZShTdHJpbmcga2V5KQotCXsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkgewotCQkJcmV0dXJuIFhTTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0SW50KGtleSk7Ci0JCX0KLQkJCi0JCUlFY2xpcHNlUHJlZmVyZW5jZXMgcHJlZnMgPSBuZXcgUHJvamVjdFNjb3BlKHByb2plY3QpLmdldE5vZGUoWFNMQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCkpOwotCQlib29sZWFuIHVzZVByb2plY3QgPSBwcmVmcy5nZXRCb29sZWFuKFhTTENvcmVQbHVnaW4uVVNFX1BST0pFQ1RfU0VUVElOR1MsIGZhbHNlKTsKLQkJCi0JCWludCB2YWxQcmVmOwotCQlpZiAodXNlUHJvamVjdCkgewotCQkJdmFsUHJlZiA9IHByZWZzLmdldEludChrZXksIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwkKLQkJfSBlbHNlIHsKLQkJCXZhbFByZWYgPSBYU0xDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldEludChrZXkpOwotCQl9Ci0JCXJldHVybiB2YWxQcmVmOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja1hQYXRocyhYU0xFbGVtZW50IHhzbEVsLCBYU0xWYWxpZGF0aW9uUmVwb3J0IHJlcG9ydCkgdGhyb3dzIE1heEVycm9yc0V4Y2VlZGVkRXhjZXB0aW9uCi0JewotCQl2YWxpZGF0ZVhQYXRoKHhzbEVsLCByZXBvcnQsICJzZWxlY3QiKTsgLy8kTk9OLU5MUy0xJAotCQl2YWxpZGF0ZVhQYXRoKHhzbEVsLCByZXBvcnQsICJ0ZXN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJdmFsaWRhdGVYUGF0aCh4c2xFbCwgcmVwb3J0LCAibWF0Y2giKTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKFhTTEVsZW1lbnQgY2hpbGRFbCA6IHhzbEVsLmdldENoaWxkRWxlbWVudHMoKSkKLQkJewotCQkJY2hlY2tYUGF0aHMoY2hpbGRFbCwgcmVwb3J0KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZVhQYXRoKFhTTEVsZW1lbnQgeHNsRWwsIFhTTFZhbGlkYXRpb25SZXBvcnQgcmVwb3J0LCBTdHJpbmcgYXR0TmFtZSkgdGhyb3dzIE1heEVycm9yc0V4Y2VlZGVkRXhjZXB0aW9uCi0JewotCQlYU0xBdHRyaWJ1dGUgYXR0ID0geHNsRWwuZ2V0QXR0cmlidXRlKGF0dE5hbWUpOwotCQlpZiAoYXR0ICE9IG51bGwgJiYgYXR0LmdldFZhbHVlKCkgIT0gbnVsbCkKLQkJewotCQkJdHJ5Ci0JCQl7CQotCQkJCVN0cmluZyB4c2xWZXJzaW9uID0geHNsRWwuZ2V0U3R5bGVzaGVldCgpLmdldFZlcnNpb24oKTsKLQkJCQlTdHJpbmcgeHBhdGhFeHAgPSBhdHQuZ2V0VmFsdWUoKTsKLQkJCQlpZiAoeHNsVmVyc2lvbi5lcXVhbHMoWFNMVDJfVmVyc2lvbikpIHsKLQkJCQkJWFBhdGgyMEhlbHBlci5jb21waWxlKHhwYXRoRXhwKTsKLQkJCQl9IGVsc2UgewotCQkJCQlYU0xUWFBhdGhIZWxwZXIuY29tcGlsZShhdHQuZ2V0VmFsdWUoKSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKFhQYXRoRXhwcmVzc2lvbkV4Y2VwdGlvbiBlKQotCQkJewotCQkJCWNyZWF0ZU1hcmtlcihyZXBvcnQsIGF0dCwgZ2V0UHJlZmVyZW5jZShWYWxpZGF0aW9uUHJlZmVyZW5jZXMuWFBBVEhTKSwgTWVzc2FnZXMuWFNMVmFsaWRhdG9yXzEpOwotCQkJfQotCQkJY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpCi0JCQl7Ci0JCQkJLy8gbm90IHN1cmUgd2h5IE5QRSBpcyBiZWluZyB0aHJvd24gaGVyZQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrQ2lyY3VsYXJSZWYoU3R5bGVzaGVldE1vZGVsIHN0eWxlc2hlZXRDb21wb3NlZCwgWFNMVmFsaWRhdGlvblJlcG9ydCByZXBvcnQpIHRocm93cyBNYXhFcnJvcnNFeGNlZWRlZEV4Y2VwdGlvbgotCXsKLQkJaWYgKHN0eWxlc2hlZXRDb21wb3NlZC5oYXNDaXJjdWxhclJlZmVyZW5jZSgpKQotCQkJY3JlYXRlTWFya2VyKHJlcG9ydCwgc3R5bGVzaGVldENvbXBvc2VkLmdldFN0eWxlc2hlZXQoKSwgZ2V0UHJlZmVyZW5jZShWYWxpZGF0aW9uUHJlZmVyZW5jZXMuQ0lSQ1VMQVJfUkVGKSwgTWVzc2FnZXMuWFNMVmFsaWRhdG9yXzIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja0luY2x1ZGVzKFN0eWxlc2hlZXRNb2RlbCBzdHlsZXNoZWV0Q29tcG9zZWQsIFhTTFZhbGlkYXRpb25SZXBvcnQgcmVwb3J0KSB0aHJvd3MgTWF4RXJyb3JzRXhjZWVkZWRFeGNlcHRpb24KLQl7CQkKLQkJLy8gaW5jbHVkZXMKLQkJZm9yIChJbmNsdWRlIGluY2x1ZGUgOiBzdHlsZXNoZWV0Q29tcG9zZWQuZ2V0U3R5bGVzaGVldCgpLmdldEluY2x1ZGVzKCkpCi0JCXsKLQkJCUlGaWxlIGluY2x1ZGVkRmlsZSA9IGluY2x1ZGUuZ2V0SHJlZkFzRmlsZSgpOwotCQkJaWYgKGluY2x1ZGVkRmlsZSA9PSBudWxsIHx8ICFpbmNsdWRlZEZpbGUuZXhpc3RzKCkpCi0JCQl7IC8vIGluY2x1ZGVkIGZpbGUgZG9lcyBub3QgZXhpc3QKLQkJCQlYU0xBdHRyaWJ1dGUgYXR0ID0gaW5jbHVkZS5nZXRBdHRyaWJ1dGUoImhyZWYiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoYXR0ICE9IG51bGwpCi0JCQkJCWNyZWF0ZU1hcmtlcihyZXBvcnQsIGF0dCwgZ2V0UHJlZmVyZW5jZShWYWxpZGF0aW9uUHJlZmVyZW5jZXMuTUlTU0lOR19JTkNMVURFKSwgTWVzc2FnZXMuWFNMVmFsaWRhdG9yXzQgKyBpbmNsdWRlLmdldEhyZWYoKSk7Ci0JCQkJZWxzZQotCQkJCQljcmVhdGVNYXJrZXIocmVwb3J0LCBpbmNsdWRlLCBnZXRQcmVmZXJlbmNlKFZhbGlkYXRpb25QcmVmZXJlbmNlcy5OQU1FX0FUVFJJQlVURV9FTVBUWSksIE1lc3NhZ2VzLlhTTFZhbGlkYXRvcl8yMyApOwkJCQkJCi0JCQl9Ci0JCQllbHNlIGlmIChpbmNsdWRlZEZpbGUuZXF1YWxzKGluY2x1ZGUuZ2V0U3R5bGVzaGVldCgpLmdldEZpbGUoKSkpCi0JCQl7IC8vIHN0eWxlc2hlZXQgaW5jbHVkaW5nIGl0c2VsZiEKLQkJCQljcmVhdGVNYXJrZXIocmVwb3J0LCBpbmNsdWRlLmdldEF0dHJpYnV0ZSgiaHJlZiIpLCBnZXRQcmVmZXJlbmNlKFZhbGlkYXRpb25QcmVmZXJlbmNlcy5DSVJDVUxBUl9SRUYpLCBNZXNzYWdlcy5YU0xWYWxpZGF0b3JfNik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQkvL2ltcG9ydHMKLQkJZm9yIChJbmNsdWRlIGluY2x1ZGUgOiBzdHlsZXNoZWV0Q29tcG9zZWQuZ2V0U3R5bGVzaGVldCgpLmdldEltcG9ydHMoKSkKLQkJewotCQkJSUZpbGUgaW5jbHVkZWRGaWxlID0gaW5jbHVkZS5nZXRIcmVmQXNGaWxlKCk7Ci0JCQlpZiAoaW5jbHVkZWRGaWxlID09IG51bGwgfHwgIWluY2x1ZGVkRmlsZS5leGlzdHMoKSkKLQkJCXsgLy8gaW5jbHVkZWQgZmlsZSBkb2VzIG5vdCBleGlzdAotCQkJCWNyZWF0ZU1hcmtlcihyZXBvcnQsIGluY2x1ZGUuZ2V0QXR0cmlidXRlKCJocmVmIiksIGdldFByZWZlcmVuY2UoVmFsaWRhdGlvblByZWZlcmVuY2VzLk1JU1NJTkdfSU5DTFVERSksIE1lc3NhZ2VzLlhTTFZhbGlkYXRvcl84ICsgaW5jbHVkZS5nZXRIcmVmKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIGlmIChpbmNsdWRlZEZpbGUuZXF1YWxzKGluY2x1ZGUuZ2V0U3R5bGVzaGVldCgpLmdldEZpbGUoKSkpCi0JCQl7IC8vIHN0eWxlc2hlZXQgaW5jbHVkaW5nIGl0c2VsZiEKLQkJCQljcmVhdGVNYXJrZXIocmVwb3J0LCBpbmNsdWRlLmdldEF0dHJpYnV0ZSgiaHJlZiIpLCBnZXRQcmVmZXJlbmNlKFZhbGlkYXRpb25QcmVmZXJlbmNlcy5DSVJDVUxBUl9SRUYpLCBNZXNzYWdlcy5YU0xWYWxpZGF0b3JfMTApOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tUZW1wbGF0ZXMoU3R5bGVzaGVldE1vZGVsIHN0eWxlc2hlZXRDb21wb3NlZCwgWFNMVmFsaWRhdGlvblJlcG9ydCByZXBvcnQpIHRocm93cyBNYXhFcnJvcnNFeGNlZWRlZEV4Y2VwdGlvbgotCXsKLQkJZm9yIChUZW1wbGF0ZSB0ZW1wbGF0ZSA6IHN0eWxlc2hlZXRDb21wb3NlZC5nZXRTdHlsZXNoZWV0KCkuZ2V0VGVtcGxhdGVzKCkpCi0JCXsKLQkJCS8vIGNoZWNrIGF0dHJpYnV0ZXMgYXJlIGNvcnJlY3QKLQkJCWlmICh0ZW1wbGF0ZS5nZXROYW1lKCkgIT0gbnVsbCkKLQkJCXsvLyBuYW1lZCB0ZW1wbGF0ZQotLy8JCQkJaWYgKHRlbXBsYXRlLmdldE1hdGNoKCkgIT0gbnVsbCkKLS8vCQkJCQljcmVhdGVNYXJrZXIocmVwb3J0LCB0ZW1wbGF0ZSwgSU1hcmtlci5TRVZFUklUWV9FUlJPUiwgIlRlbXBsYXRlIGNhbm5vdCBzcGVjaWZ5IGJvdGggbmFtZSBhbmQgbWF0Y2ggYXR0cmlidXRlcyIpOwotLy8JCQkJaWYgKHRlbXBsYXRlLmdldE1vZGUoKSAhPSBudWxsKQotLy8JCQkJCWNyZWF0ZU1hcmtlcihyZXBvcnQsIHRlbXBsYXRlLCBJTWFya2VyLlNFVkVSSVRZX0VSUk9SLCAiTmFtZWQgdGVtcGxhdGVzIGNhbm5vdCBzcGVjaWZ5IGEgbW9kZSIpOwotCQkJCWNoZWNrUGFyYW1ldGVycyhyZXBvcnQsIHRlbXBsYXRlKTsKLQkJCX0gCi0KLQkJCWZvciAoVGVtcGxhdGUgY2hlY2tUZW1wbGF0ZSA6IHN0eWxlc2hlZXRDb21wb3NlZC5nZXRUZW1wbGF0ZXMoKSkKLQkJCXsKLQkJCQlpZiAoY2hlY2tUZW1wbGF0ZSAhPSB0ZW1wbGF0ZSAmJiBjaGVja1RlbXBsYXRlLmVxdWFscyh0ZW1wbGF0ZSkpCi0JCQkJewotCQkJCQlpZiAodGVtcGxhdGUuZ2V0U3R5bGVzaGVldCgpID09IHN0eWxlc2hlZXRDb21wb3NlZC5nZXRTdHlsZXNoZWV0KCkgJiYgY2hlY2tUZW1wbGF0ZS5nZXRTdHlsZXNoZWV0KCkgPT0gc3R5bGVzaGVldENvbXBvc2VkLmdldFN0eWxlc2hlZXQoKSkKLQkJCQkJey8vIHRlbXBsYXRlcyBpbiB0aGlzIHN0eWxlc2hlZXQgY29uZmxpY3Qgd2l0aCBlYWNoIG90aGVyCi0JCQkJCQljcmVhdGVNYXJrZXIocmVwb3J0LCB0ZW1wbGF0ZSwgZ2V0UHJlZmVyZW5jZShWYWxpZGF0aW9uUHJlZmVyZW5jZXMuVEVNUExBVEVfQ09ORkxJQ1QpLCBNZXNzYWdlcy5YU0xWYWxpZGF0b3JfMTEpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHRlbXBsYXRlLmdldFN0eWxlc2hlZXQoKSA9PSBzdHlsZXNoZWV0Q29tcG9zZWQuZ2V0U3R5bGVzaGVldCgpKQotCQkJCQl7Ly8gdGVtcGxhdGUgaW4gaW5jbHVkZWQgc3R5bGVzaGVldCBjb25mbGljdHMgd2l0aCB0aGlzCi0JCQkJCQljcmVhdGVNYXJrZXIocmVwb3J0LCB0ZW1wbGF0ZSwgZ2V0UHJlZmVyZW5jZShWYWxpZGF0aW9uUHJlZmVyZW5jZXMuVEVNUExBVEVfQ09ORkxJQ1QpLCBNZXNzYWdlcy5YU0xWYWxpZGF0b3JfMTIpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJey8vIHRlbXBsYXRlcyBpbiBpbmNsdWRlZCBzdHlsZXNoZWV0cyBjb25mbGljdCB3aXRoIGVhY2ggb3RoZXIKLQkJCQkJCWNyZWF0ZU1hcmtlcihyZXBvcnQsIHRlbXBsYXRlLmdldFN0eWxlc2hlZXQoKSwgZ2V0UHJlZmVyZW5jZShWYWxpZGF0aW9uUHJlZmVyZW5jZXMuVEVNUExBVEVfQ09ORkxJQ1QpLCBNZXNzYWdlcy5YU0xWYWxpZGF0b3JfMTMpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrUGFyYW1ldGVycyhYU0xWYWxpZGF0aW9uUmVwb3J0IHJlcG9ydCwgVGVtcGxhdGUgdGVtcGxhdGUpIHRocm93cyBNYXhFcnJvcnNFeGNlZWRlZEV4Y2VwdGlvbgotCXsKLQkJTGlzdDxQYXJhbWV0ZXI+IHBhcmFtZXRlcnMgPSBuZXcgQXJyYXlMaXN0PFBhcmFtZXRlcj4odGVtcGxhdGUuZ2V0UGFyYW1ldGVycygpKTsKLQkJLy8gcmV2ZXJzZSB0aGUgcGFyYW1ldGVycyBvcmRlciBmb3IgY2hlY2tpbmcgLSBmb3IgZHVwbGljYXRlIHBhcmFtZXRlcnMKLQkJLy8gdGhlIGZpcnN0IG9uZSBpcyB2YWxpZAotCQlDb2xsZWN0aW9ucy5yZXZlcnNlKHBhcmFtZXRlcnMpOwotCQlTZXQ8UGFyYW1ldGVyPiBkdXBsaWNhdGVQYXJhbWV0ZXJzID0gbmV3IEhhc2hTZXQ8UGFyYW1ldGVyPigpOwotCQkvLyBjaGVjayBwYXJhbWV0ZXJzCi0JCWZvciAoUGFyYW1ldGVyIHBhcmFtIDogcGFyYW1ldGVycykKLQkJewotCQkJaWYgKHBhcmFtLmdldE5hbWUoKSA9PSBudWxsKQotCQkJey8vIG5hbWUgaXMgcmVxdWlyZWQKLQkJCQljcmVhdGVNYXJrZXIocmVwb3J0LCBwYXJhbSwgZ2V0UHJlZmVyZW5jZShWYWxpZGF0aW9uUHJlZmVyZW5jZXMuTkFNRV9BVFRSSUJVVEVfTUlTU0lORyksIE1lc3NhZ2VzLlhTTFZhbGlkYXRvcl8xNCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChwYXJhbS5nZXROYW1lKCkudHJpbSgpLmxlbmd0aCgpID09IDApCi0JCQl7Ly8gbmFtZSB2YWx1ZSBpcyByZXF1aXJlZAotCQkJCWNyZWF0ZU1hcmtlcihyZXBvcnQsIHBhcmFtLCBnZXRQcmVmZXJlbmNlKFZhbGlkYXRpb25QcmVmZXJlbmNlcy5OQU1FX0FUVFJJQlVURV9FTVBUWSksIE1lc3NhZ2VzLlhTTFZhbGlkYXRvcl8xNSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChkdXBsaWNhdGVQYXJhbWV0ZXJzLmNvbnRhaW5zKHBhcmFtKSkKLQkJCXsvLyBkb24ndCByZWNoZWNrIHRoZSBwYXJhbWV0ZXIKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsvLyBjaGVjayBhIHBhcmFtZXRlciB3aXRoIHRoZSBzYW1lIG5hbWUgZG9lcyBub3QgZXhpc3QKLQkJCQlmb3IgKFBhcmFtZXRlciBjaGVja1BhcmFtIDogcGFyYW1ldGVycykKLQkJCQl7Ci0JCQkJCWlmIChwYXJhbSAhPSBjaGVja1BhcmFtKQotCQkJCQl7Ci0JCQkJCQlpZiAocGFyYW0uZ2V0TmFtZSgpLmVxdWFscyhjaGVja1BhcmFtLmdldE5hbWUoKSkpCi0JCQkJCQl7Ci0JCQkJCQkJZHVwbGljYXRlUGFyYW1ldGVycy5hZGQoY2hlY2tQYXJhbSk7Ci0JCQkJCQkJY3JlYXRlTWFya2VyKHJlcG9ydCwgcGFyYW0sIGdldFByZWZlcmVuY2UoVmFsaWRhdGlvblByZWZlcmVuY2VzLkRVUExJQ0FURV9QQVJBTUVURVIpLCBNZXNzYWdlcy5YU0xWYWxpZGF0b3JfMTYpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrQ2FsbFRlbXBsYXRlcyhTdHlsZXNoZWV0TW9kZWwgc3R5bGVzaGVldENvbXBvc2VkLCBYU0xWYWxpZGF0aW9uUmVwb3J0IHJlcG9ydCkgdGhyb3dzIE1heEVycm9yc0V4Y2VlZGVkRXhjZXB0aW9uCi0JewotCQlmb3IgKENhbGxUZW1wbGF0ZSBjYWxsZWRUZW1wbGF0ZSA6IHN0eWxlc2hlZXRDb21wb3NlZC5nZXRTdHlsZXNoZWV0KCkuZ2V0Q2FsbGVkVGVtcGxhdGVzKCkpCi0JCXsKLQkJCWlmIChjYWxsZWRUZW1wbGF0ZS5nZXROYW1lKCkgIT0gbnVsbCkKLQkJCXsKLQkJCQkvLyBnZXQgdGhlIGxpc3Qgb2YgdGVtcGxhdGVzIHRoYXQgbWlnaHQgYmUgYmVpbmcgY2FsbGVkIGJ5IHRoaXMKLQkJCQkvLyB0ZW1wbGF0ZSBjYWxsCi0JCQkJTGlzdDxUZW1wbGF0ZT4gdGVtcGxhdGVMaXN0ID0gc3R5bGVzaGVldENvbXBvc2VkLmdldFRlbXBsYXRlc0J5TmFtZShjYWxsZWRUZW1wbGF0ZS5nZXROYW1lKCkpOwotCQkJCWlmICh0ZW1wbGF0ZUxpc3Quc2l6ZSgpID09IDApCi0JCQkJewotCQkJCQlPYmplY3RbXSBtZXNzYWdlQXJncyA9IHsgY2FsbGVkVGVtcGxhdGUuZ2V0TmFtZSgpIH07Ci0JCQkJCWNyZWF0ZU1hcmtlcihyZXBvcnQsIGNhbGxlZFRlbXBsYXRlLmdldEF0dHJpYnV0ZSgibmFtZSIpLCBnZXRQcmVmZXJlbmNlKFZhbGlkYXRpb25QcmVmZXJlbmNlcy5DQUxMX1RFTVBMQVRFUyksIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KE1lc3NhZ2VzLlhTTFZhbGlkYXRvcl8xOCwgbWVzc2FnZUFyZ3MpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlUZW1wbGF0ZSBuYW1lZFRlbXBsYXRlID0gdGVtcGxhdGVMaXN0LmdldCgwKTsKLQkJCQkJZm9yIChQYXJhbWV0ZXIgY2FsbGVkVGVtcGxhdGVQYXJhbSA6IGNhbGxlZFRlbXBsYXRlLmdldFBhcmFtZXRlcnMoKSkKLQkJCQkJewotCQkJCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJCQkJZm9yIChQYXJhbWV0ZXIgbmFtZWRUZW1wbGF0ZVBhcmFtIDogbmFtZWRUZW1wbGF0ZS5nZXRQYXJhbWV0ZXJzKCkpCi0JCQkJCQl7Ci0JCQkJCQkJaWYgKGNhbGxlZFRlbXBsYXRlUGFyYW0uZ2V0TmFtZSgpLmVxdWFscyhuYW1lZFRlbXBsYXRlUGFyYW0uZ2V0TmFtZSgpKSkKLQkJCQkJCQl7Ci0JCQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCQkJaWYgKCFuYW1lZFRlbXBsYXRlUGFyYW0uaXNWYWx1ZSgpICYmICFjYWxsZWRUZW1wbGF0ZVBhcmFtLmlzVmFsdWUoKSkgewotCQkJCQkJCQkgICAgT2JqZWN0W10gbWVzc2FnZUFyZ3MgPSB7IGNhbGxlZFRlbXBsYXRlUGFyYW0uZ2V0TmFtZSgpIH07CQotCQkJCQkJCQkJY3JlYXRlTWFya2VyKHJlcG9ydCwgY2FsbGVkVGVtcGxhdGVQYXJhbSwgZ2V0UHJlZmVyZW5jZShWYWxpZGF0aW9uUHJlZmVyZW5jZXMuRU1QVFlfUEFSQU0pLCBNZXNzYWdlRm9ybWF0LmZvcm1hdChNZXNzYWdlcy5YU0xWYWxpZGF0b3JfMjAsIG1lc3NhZ2VBcmdzKSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmICghZm91bmQpIHsKLQkJCQkJCQlPYmplY3RbXSBtZXNzYWdlQXJncyA9IHsgY2FsbGVkVGVtcGxhdGVQYXJhbS5nZXROYW1lKCkgfTsKLQkJCQkJCQljcmVhdGVNYXJrZXIocmVwb3J0LCBjYWxsZWRUZW1wbGF0ZVBhcmFtLmdldEF0dHJpYnV0ZSgibmFtZSIpLCBnZXRQcmVmZXJlbmNlKFZhbGlkYXRpb25QcmVmZXJlbmNlcy5NSVNTSU5HX1BBUkFNKSwgTWVzc2FnZUZvcm1hdC5mb3JtYXQoTWVzc2FnZXMuWFNMVmFsaWRhdG9yXzIyLCBtZXNzYWdlQXJncykpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGdldFByZWZlcmVuY2UoVmFsaWRhdGlvblByZWZlcmVuY2VzLk1JU1NJTkdfUEFSQU0pID4gSU1hcmtlci5TRVZFUklUWV9JTkZPKQotCQkJCQl7Ci0JCQkJCQlmb3IgKFBhcmFtZXRlciBuYW1lZFRlbXBsYXRlUGFyYW0gOiBuYW1lZFRlbXBsYXRlLmdldFBhcmFtZXRlcnMoKSkKLQkJCQkJCXsKLQkJCQkJCQlpZiAoIW5hbWVkVGVtcGxhdGVQYXJhbS5pc1ZhbHVlKCkpCi0JCQkJCQkJewotCQkJCQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJCQkJCWZvciAoUGFyYW1ldGVyIGNhbGxlZFRlbXBsYXRlUGFyYW0gOiBjYWxsZWRUZW1wbGF0ZS5nZXRQYXJhbWV0ZXJzKCkpCi0JCQkJCQkJCXsKLQkJCQkJCQkJCWlmIChjYWxsZWRUZW1wbGF0ZVBhcmFtLmdldE5hbWUoKS5lcXVhbHMobmFtZWRUZW1wbGF0ZVBhcmFtLmdldE5hbWUoKSkpCi0JCQkJCQkJCQl7Ci0JCQkJCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmICghZm91bmQpIHsKLQkJCQkJCQkJCU9iamVjdFtdIG1lc3NhZ2VBcmdzID0geyBuYW1lZFRlbXBsYXRlUGFyYW0uZ2V0TmFtZSgpIH07Ci0JCQkJCQkJCQljcmVhdGVNYXJrZXIocmVwb3J0LCBjYWxsZWRUZW1wbGF0ZSwgZ2V0UHJlZmVyZW5jZShWYWxpZGF0aW9uUHJlZmVyZW5jZXMuTUlTU0lOR19QQVJBTSksIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KE1lc3NhZ2VzLlhTTFZhbGlkYXRvcl8zLCBtZXNzYWdlQXJncykpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSAKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVNYXJrZXIoWFNMVmFsaWRhdGlvblJlcG9ydCByZXBvcnQsIFhTTE5vZGUgeHNsTm9kZSwgaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZSkgdGhyb3dzIE1heEVycm9yc0V4Y2VlZGVkRXhjZXB0aW9uCi0JewotCQlpZiAoc2V2ZXJpdHkgPiBJTWFya2VyLlNFVkVSSVRZX0lORk8pCi0JCXsKLQkJCWlmIChyZXBvcnQuZ2V0RXJyb3JzKCkuc2l6ZSgpICsgcmVwb3J0LmdldFdhcm5pbmdzKCkuc2l6ZSgpID4gZ2V0UHJlZmVyZW5jZShWYWxpZGF0aW9uUHJlZmVyZW5jZXMuTUFYX0VSUk9SUykpCi0JCQkJdGhyb3cgbmV3IE1heEVycm9yc0V4Y2VlZGVkRXhjZXB0aW9uKCk7Ci0JCQlzd2l0Y2ggKHNldmVyaXR5KQotCQkJewotCQkJCWNhc2UgSU1hcmtlci5TRVZFUklUWV9FUlJPUjoKLQkJCQkJcmVwb3J0LmFkZEVycm9yKHhzbE5vZGUsIG1lc3NhZ2UpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElNYXJrZXIuU0VWRVJJVFlfV0FSTklORzoKLQkJCQkJcmVwb3J0LmFkZFdhcm5pbmcoeHNsTm9kZSwgbWVzc2FnZSk7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBzaW5nbGV0b24gWFNMVmFsaWRhdG9yIGluc3RhbmNlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBYU0xWYWxpZGF0b3IgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFhTTFZhbGlkYXRvciBnZXRJbnN0YW5jZSgpCi0JewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IFhTTFZhbGlkYXRvcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9WYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RiMDdhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9WYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBTVEFSIC0gYnVnIDIyNDc3NyAtIGZpeCBzcGFjZXMgaW4gcGF0aCBuYW1lcyBpbiBVUklzLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICBidWcgMjI2NTc4IC0gcmVtb3ZlIGV4dHJhbmVvdXMgQG92ZXJyaWRlIHN0YXRlbWVudHMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgd2FzIGNhdXNpbmcgY29tcGlsYXRpb24gcHJvYmxlbXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVjbGlwc2U7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJRW5jb2RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLkFic3RyYWN0TmVzdGVkVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuTmVzdGVkVmFsaWRhdG9yQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLlZhbGlkYXRpb25NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuVmFsaWRhdGlvblJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuWFNMQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwuWFNMQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5YU0xWYWxpZGF0aW9uTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5YU0xWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLm1vZGVsLlN0eWxlc2hlZXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUubW9kZWwuWFNMQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5tb2RlbC5YU0xOb2RlOwotCi0vKioKLSAqIFRoZSBYU0wgdmFsaWRhdG9yIGV4dGVuZHMgdGhlIFhNTCA8Y29kZT5BYnN0cmFjdE5lc3RlZFZhbGlkYXRvcjwvY29kZT4uCi0gKiAKLSAqIEBhdXRob3IgRG91ZyBTYXRjaHdlbGwKLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRvciBleHRlbmRzIEFic3RyYWN0TmVzdGVkVmFsaWRhdG9yCi17Ci0JLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JLy8gQlVJTEQgVkFMSURBVElPTiBNRVRIT0RTCi0JLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLQlwcml2YXRlIGJvb2xlYW4gYXNZb3VUeXBlVmFsaWRhdGlvbjsKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNsZWFuKElQcm9qZWN0IHByb2plY3QsIFZhbGlkYXRpb25TdGF0ZSBzdGF0ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCXsKLQkJc3VwZXIuY2xlYW4ocHJvamVjdCwgc3RhdGUsIG1vbml0b3IpOwotCQlYU0xDb3JlLmdldEluc3RhbmNlKCkuY2xlYW4ocHJvamVjdCxtb25pdG9yKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFZhbGlkYXRpb25SZXN1bHQgdmFsaWRhdGUoSVJlc291cmNlIHJlc291cmNlLCBpbnQga2luZCwgVmFsaWRhdGlvblN0YXRlIHN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JewotCQlWYWxpZGF0aW9uUmVzdWx0IHJlcyA9IHN1cGVyLnZhbGlkYXRlKHJlc291cmNlLCBraW5kLCBzdGF0ZSwgbW9uaXRvcik7Ci0JCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpCi0JCXsKLQkJCVN0eWxlc2hlZXRNb2RlbCBzdHlsZXNoZWV0ID0gWFNMQ29yZS5nZXRJbnN0YW5jZSgpLmdldFN0eWxlc2hlZXQoKElGaWxlKSByZXNvdXJjZSk7Ci0JCQlJRmlsZVtdIGRlcGVuZGVuY2llcyA9IHN0eWxlc2hlZXQuZ2V0RmlsZURlcGVuZGVuY2llcygpLnRvQXJyYXkobmV3IElGaWxlWzBdKTsKLQkJCXJlcy5zZXREZXBlbmRzT24oZGVwZW5kZW5jaWVzKTsKLQkJfQotCQlyZXR1cm4gcmVzOwotCX0gCi0KLQkKLQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkvLyBBUyBZT1UgVFlQRSBWQUxJREFUSU9OIE1FVEhPRFMKLQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlSW5Kb2IoSVZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQsIElSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24KLQl7Ci0JCWFzWW91VHlwZVZhbGlkYXRpb24gPSB0cnVlOwotCQlyZXR1cm4gc3VwZXIudmFsaWRhdGVJbkpvYihjb250ZXh0LCByZXBvcnRlcik7Ci0JfQotCi0JLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JLy8gQ09NTU9OIE1FVEhPRFMKLQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotCUBPdmVycmlkZQotCXB1YmxpYyBWYWxpZGF0aW9uUmVwb3J0IHZhbGlkYXRlKGZpbmFsIFN0cmluZyB1cmksIElucHV0U3RyZWFtIGlucHV0c3RyZWFtLCBOZXN0ZWRWYWxpZGF0b3JDb250ZXh0IGNvbnRleHQpCi0JewotCQlWYWxpZGF0aW9uUmVwb3J0IHZhbHJlcG9ydCA9IG5ldyBWYWxpZGF0aW9uUmVwb3J0KCl7Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZVVSSSgpCi0JCQl7Ci0JCQkJcmV0dXJuIHVyaTsKLQkJCX0KLQotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgSGFzaE1hcCBnZXROZXN0ZWRNZXNzYWdlcygpCi0JCQl7Ci0JCQkJcmV0dXJuIG5ldyBIYXNoTWFwKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBWYWxpZGF0aW9uTWVzc2FnZVtdIGdldFZhbGlkYXRpb25NZXNzYWdlcygpCi0JCQl7Ci0JCQkJcmV0dXJuIG5ldyBWYWxpZGF0aW9uTWVzc2FnZVswXTsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpCi0JCQl7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9fTsKLQkJdHJ5Ci0JCXsKLQkJCVN0cmluZyBlbmNVcmkgPSBVUklFbmNvZGVyLmVuY29kZSh1cmkpOwotCQkJSUZpbGVbXSBmaWxlcyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZEZpbGVzRm9yTG9jYXRpb25VUkkobmV3IFVSSShlbmNVcmkpKTsKLQkJCWlmIChmaWxlcy5sZW5ndGggPiAwKQotCQkJewotCQkJCUlGaWxlIHhzbEZpbGUgPSBmaWxlc1swXTsKLQkJCQl2YWxyZXBvcnQgPSBYU0xWYWxpZGF0b3IuZ2V0SW5zdGFuY2UoKS52YWxpZGF0ZSh4c2xGaWxlLGFzWW91VHlwZVZhbGlkYXRpb24pOwotCQkJfQotCQl9Ci0JCWNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkKLQkJewotCQkJWFNMQ29yZVBsdWdpbi5sb2coZSk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLQkJewotCQkJWFNMQ29yZVBsdWdpbi5sb2coZSk7Ci0JCX0KLQkJcmV0dXJuIHZhbHJlcG9ydDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRJbmZvVG9NZXNzYWdlKFZhbGlkYXRpb25NZXNzYWdlIHZhbGlkYXRpb25NZXNzYWdlLCBJTWVzc2FnZSBtZXNzYWdlKQotCXsKLQkJWFNMVmFsaWRhdGlvbk1lc3NhZ2UgbXNnID0gKFhTTFZhbGlkYXRpb25NZXNzYWdlKSB2YWxpZGF0aW9uTWVzc2FnZTsKLQkJWFNMTm9kZSBub2RlID0gbXNnLmdldE5vZGUoKTsKLQkJLy8gc2V0IHRoaXMgaGVyZSBhcyBpdCBnZXRzIHNldCB0byB0aGUgd3JvbmcgdmFsdWUgYnkgdGhlIHN1cGVyY2xhc3MKLQkJbWVzc2FnZS5zZXRTZXZlcml0eShtc2cuZ2V0UmVhbFNldmVyaXR5KCkpOwotCQkvLyBjb25zdGFudHMgYXJlIGRlZmluZWQgaW4gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3IKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBYU0xOb2RlLkFUVFJJQlVURV9OT0RFKQotCQl7Ci0JCQltZXNzYWdlLnNldEF0dHJpYnV0ZSgiRVJST1JfU0lERSIsICJFUlJPUl9TSURFX1JJR0hUIik7ICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQkJbWVzc2FnZS5zZXRBdHRyaWJ1dGUoQ09MVU1OX05VTUJFUl9BVFRSSUJVVEUsIEludGVnZXIudmFsdWVPZih2YWxpZGF0aW9uTWVzc2FnZS5nZXRDb2x1bW5OdW1iZXIoKSkpOwotCQkJbWVzc2FnZS5zZXRBdHRyaWJ1dGUoU1FVSUdHTEVfU0VMRUNUSU9OX1NUUkFURUdZX0FUVFJJQlVURSwgIkFUVFJJQlVURV9WQUxVRSIpOyAvLyB3aGV0aGVyIHRvIHNxdWlnZ2xlIHRoZSBlbGVtZW50LCBhdHRyaWJ1dGUgb3IgdGV4dCAvLyROT04tTkxTLTEkCi0JCQltZXNzYWdlLnNldEF0dHJpYnV0ZShTUVVJR0dMRV9OQU1FX09SX1ZBTFVFX0FUVFJJQlVURSwgKChYU0xBdHRyaWJ1dGUpIG5vZGUpLmdldE5hbWUoKSk7Ci0JCX0KLQkJZWxzZSBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IFhTTE5vZGUuRUxFTUVOVF9OT0RFKQotCQl7Ci0JCQltZXNzYWdlLnNldEF0dHJpYnV0ZSgiRVJST1JfU0lERSIsICJFUlJPUl9TSURFX1JJR0hUIik7ICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQkJbWVzc2FnZS5zZXRBdHRyaWJ1dGUoQ09MVU1OX05VTUJFUl9BVFRSSUJVVEUsIEludGVnZXIudmFsdWVPZih2YWxpZGF0aW9uTWVzc2FnZS5nZXRDb2x1bW5OdW1iZXIoKSkpOwotCQkJbWVzc2FnZS5zZXRBdHRyaWJ1dGUoU1FVSUdHTEVfU0VMRUNUSU9OX1NUUkFURUdZX0FUVFJJQlVURSwgIlNUQVJUX1RBRyIpOyAvLyB3aGV0aGVyIHRvIHNxdWlnZ2xlIHRoZSBlbGVtZW50LCBhdHRyaWJ1dGUgb3IgdGV4dCAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9WYWxpZGF0b3IyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9WYWxpZGF0b3IyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiN2Y4NGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvVmFsaWRhdG9yMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uQWJzdHJhY3RWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9ySm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuVmFsaWRhdGlvbk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5WYWxpZGF0aW9uUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5YU0xDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC5YU0xDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLlhTTFZhbGlkYXRpb25NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLlhTTFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUubW9kZWwuU3R5bGVzaGVldE1vZGVsOwotCi0vKioKLSAqIFZhbGlkYXRvciBmb3IgYm90aCBidWlsZCB2YWxpZGF0aW9uIChBYnN0cmFjdFZhbGlkYXRvcikgYW5kIGFzLXlvdS10eXBlIHZhbGlkYXRpb24gKElWYWxpZGF0b3JKb2IpLgotICogCi0gKiBAYXV0aG9yIERvdWcKLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRvcjIgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRvciBpbXBsZW1lbnRzIElWYWxpZGF0b3JKb2IKLXsKLQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkvLyBCVUlMRCBWQUxJREFUSU9OIE1FVEhPRFMKLQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNsZWFuKElQcm9qZWN0IHByb2plY3QsIFZhbGlkYXRpb25TdGF0ZSBzdGF0ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCXsKLQkJWFNMQ29yZS5nZXRJbnN0YW5jZSgpLmNsZWFuKHByb2plY3QsIG1vbml0b3IpOwotCQlzdXBlci5jbGVhbihwcm9qZWN0LCBzdGF0ZSwgbW9uaXRvcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFZhbGlkYXRpb25SZXN1bHQgdmFsaWRhdGUoSVJlc291cmNlIHJlc291cmNlLCBpbnQga2luZCwgVmFsaWRhdGlvblN0YXRlIHN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JewotCQkvKgotCQkgKiBTdHJpbmcgczsgc3dpdGNoKGtpbmQpIHsgY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRDogcyA9ICJhZGRlZCI7IGJyZWFrOyBjYXNlIElSZXNvdXJjZURlbHRhLkNIQU5HRUQ6IHMgPSAiQ0hBTkdFRCI7IGJyZWFrOyBjYXNlIElSZXNvdXJjZURlbHRhLkNPTlRFTlQ6IHMgPSAiQ09OVEVOVCI7IGJyZWFrOyBjYXNlCi0JCSAqIElSZXNvdXJjZURlbHRhLlJFTU9WRUQ6IHMgPSAiUkVNT1ZFRCI7IGJyZWFrOyBkZWZhdWx0OiBzID0gIm90aGVyIjsgfSBTeXN0ZW0ub3V0LnByaW50bG4ocyk7Ci0JCSAqLwotCQlWYWxpZGF0aW9uUmVzdWx0IHJlc3VsdCA9IG5ldyBWYWxpZGF0aW9uUmVzdWx0KCk7Ci0JCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpCi0JCXsKLQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpcmVzb3VyY2U7Ci0JCQlWYWxpZGF0aW9uUmVwb3J0IHJlcG9ydCA9IGRvVmFsaWRhdGlvbihmaWxlLCBraW5kLCBzdGF0ZSwgbW9uaXRvcik7Ci0JCQlTdHlsZXNoZWV0TW9kZWwgc3R5bGVzaGVldCA9IFhTTENvcmUuZ2V0SW5zdGFuY2UoKS5nZXRTdHlsZXNoZWV0KGZpbGUpOwotCQkJSUZpbGVbXSBkZXBlbmRlbmNpZXMgPSBzdHlsZXNoZWV0LmdldEZpbGVEZXBlbmRlbmNpZXMoKS50b0FycmF5KG5ldyBJRmlsZVswXSk7Ci0JCQlyZXN1bHQuc2V0RGVwZW5kc09uKGRlcGVuZGVuY2llcyk7Ci0JCQkKLQkJCWZvciAoVmFsaWRhdGlvbk1lc3NhZ2UgbWVzc2FnZSA6IHJlcG9ydC5nZXRWYWxpZGF0aW9uTWVzc2FnZXMoKSkKLQkJCXsKLQkJCQlYU0xWYWxpZGF0aW9uTWVzc2FnZSB4c2xNc2cgPSAoWFNMVmFsaWRhdGlvbk1lc3NhZ2UpbWVzc2FnZTsKLQkJCQlWYWxpZGF0b3JNZXNzYWdlIG1zZyA9IFZhbGlkYXRvck1lc3NhZ2UuY3JlYXRlKG1lc3NhZ2UuZ2V0TWVzc2FnZSgpLCByZXNvdXJjZSk7Ci0JCQkJbXNnLnNldEF0dHJpYnV0ZSgibGluZU51bWJlciIsIHhzbE1zZy5nZXRMaW5lTnVtYmVyKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJbXNnLnNldEF0dHJpYnV0ZSgic2V2ZXJpdHkiLCB4c2xNc2cuZ2V0U2V2ZXJpdHkoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXN1bHQuYWRkKG1zZyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIFZhbGlkYXRpb25SZXBvcnQgZG9WYWxpZGF0aW9uKElGaWxlIGZpbGUsIGludCBraW5kLCBWYWxpZGF0aW9uU3RhdGUgc3RhdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQl7Ci0JCVZhbGlkYXRpb25SZXBvcnQgdmFscmVwb3J0ID0gbnVsbDsKLQkJdHJ5Ci0JCXsKLQkJCXZhbHJlcG9ydCA9IFhTTFZhbGlkYXRvci5nZXRJbnN0YW5jZSgpLnZhbGlkYXRlKGZpbGUsdHJ1ZSk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLQkJewotCQkJWFNMQ29yZVBsdWdpbi5sb2coZSk7Ci0JCX0KLQkJcmV0dXJuIHZhbHJlcG9ydDsKLQl9Ci0KLQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkvLyBBUyBZT1UgVFlQRSBWQUxJREFUSU9OIE1FVEhPRFMKLQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotCXB1YmxpYyBJU2NoZWR1bGluZ1J1bGUgZ2V0U2NoZWR1bGluZ1J1bGUoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlcikKLQl7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVJbkpvYihJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uCi0JewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFudXAoSVJlcG9ydGVyIHJlcG9ydGVyKQotCXsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbgotCXsKLQkJdmFsaWRhdGVJbkpvYihoZWxwZXIscmVwb3J0ZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwveGluY2x1ZGUvWEluY2x1ZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL3hpbmNsdWRlL1hJbmNsdWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmQ4M2NlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwveGluY2x1ZGUvWEluY2x1ZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiBDb3B5cmlnaHQgKGMpIDIwMDggTGFycyBWb2dlbCANCi0qIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0qIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0qIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsdjEwLmh0bWwNCi0qDQotKiBDb250cmlidXRvcnM6DQotKiBMYXJzIFZvZ2VsIC0gTGFycy5Wb2dlbEBnbWFpbC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0qIERhdmlkIENhcnZlciAtIFNUQVIgLSBidWcgMjE3OTE5IC0gcmVuYW1lZCB0byBYSW5jbHVkZXIgZnJvbSBNeVhJbmNsdWRlcg0KLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBmZWF0dXJlIGNhbGwgdG8gbWFrZSBzdXJlIHdlIGdldA0KLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbiBYSW5jbHVkZSBhd2FyZSBjb25maWd1cmF0aW9uLiAgQWxzbw0KLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVkIERvY2Jvb2sgRFREIGhhcmQgY29kaW5nLg0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwueGluY2x1ZGU7DQotDQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOw0KLQ0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7DQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsNCi0NCi1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7DQotDQotLyoqDQotICogWEluY2x1ZGVyIHdpbGwgcmVhZCBhbiBYTUwgZmlsZSwgdGhhdCBoYXMgZWxlbWVudHMgZnJvbSB0aGUgWEluY2x1ZGUNCi0gKiBuYW1lc3BhY2UgYW5kIGZvbGxvd3MgdGhlIFczQyBYSW5jbHVkZSBzcGVjaWZpY2F0aW9uIChodHRwOi8vd3d3LnczLm9yZy9UUi94aW5jbHVkZS8pLg0KLSAqIEl0IHdpbGwgb3V0cHV0IGEgbWVyZ2VkIGZpbGUuDQotICogQGF1dGhvciBMYXJzIFZvZ2VsDQotICoNCi0gKi8NCi1wdWJsaWMgY2xhc3MgWEluY2x1ZGVyIHsNCi0NCi0JLyoqDQotCSAqIGV4dHJhY1hNTEZpbGUgbWVyZ2VzIHRoZSBmaWxlcyByZWZlcmVuY2VkIGJ5IHhpbmNsdWRlIGluY2x1ZGUgZWxlbWVudHMuDQotCSAqIEBwYXJhbSBpbiAgVGhlIGZ1bGwgcGF0aCB0byB0aGUgaW5wdXQgWE1MIGZpbGUNCi0JICogQHBhcmFtIG91dCBUaGUgZnVsbCBwYXRoIHRvIHRoZSBtZXJnZWQgWE1MIGZpbGUNCi0JICogQHRocm93cyBFeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyB2b2lkIGV4dHJhY3RYTUxGaWxlKFN0cmluZyBpbiwgU3RyaW5nIG91dCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCQlEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7DQotCQlGaWxlIGZpbGU7DQotDQotCQlmaWxlID0gbmV3IEZpbGUoaW4pOw0KLQkJZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsNCi0JCWZpbGUubGFzdE1vZGlmaWVkKCk7DQotCQkNCi0JCURvY3VtZW50QnVpbGRlckZhY3RvcnkgZGJmID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLQkJDQotCQkvLyBNYWtlIHN1cmUgd2UgYXJlIGdldHRpbmcgYSBjb25maWd1cmF0aW9uIHRoYXQgaXMgWEluY2x1ZGUgQXdhcmUNCi0JCWRiZi5zZXRBdHRyaWJ1dGUoImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy94aW5jbHVkZSIsIHRydWUpOyAvLyROT04tTkxTLTEkDQotCQlkYmYuc2V0WEluY2x1ZGVBd2FyZSh0cnVlKTsNCi0JCWRiZi5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsNCi0NCi0JCQ0KLQkJRG9jdW1lbnRCdWlsZGVyIGRvbSA9IGRiZi5uZXdEb2N1bWVudEJ1aWxkZXIoKTsNCi0JCWRvY3VtZW50ID0gZG9tLnBhcnNlKGZpbGUpOw0KLQkJDQotCQkvLyAtLS0tIFVzZSBhIFhTTFQgdHJhbnNmb3JtZXIgZm9yIHdyaXRpbmcgdGhlIG5ldyBYTUwgZmlsZSAtLS0tDQotCQlUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpDQotCQkJCS5uZXdUcmFuc2Zvcm1lcigpOw0KLQkJDQotCQlET01Tb3VyY2Ugc291cmNlID0gbmV3IERPTVNvdXJjZShkb2N1bWVudCk7DQotCQlGaWxlT3V0cHV0U3RyZWFtIG9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0obmV3IEZpbGUob3V0KSk7DQotCQlTdHJlYW1SZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChvcyk7DQotCQl0cmFuc2Zvcm1lci50cmFuc2Zvcm0oc291cmNlLCByZXN1bHQpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU1ODU5ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgSmVzcGVyIFN0ZWVuIE34bGxlciAtIGFkYXB0ZWQgZnJvbSBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmNvbnRlbnQgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMjIyBSZXNvbHZlciBwcm9ibGVtcwotWFNMQ29yZVBsdWdpbl9iYWRJbml0aWFsaXphdGlvbkRhdGEgPSBJbnZhbGlkIGluaXRpYWxpemF0aW9uIGRhdGEgZm9yICJ7MH0iLgotWFNMQ29yZVBsdWdpbl9wYXJzZXJDb25maWd1cmF0aW9uID0gWFNMIHBhcnNlciBjb25maWd1cmF0aW9uIGVycm9yIGR1cmluZyBjb250ZW50IGRlc2NyaXB0aW9uLgotWFNMQ29yZVBsdWdpbl9jb3JlRXJyb3I9RXJyb3IgbG9nZ2VkIGZyb20gWFNMIGNvcmUgcGx1Zy1pblw6Ci0jIFhJbmNsdWRlCi1YSW5jbHVkZVRhc2tfMD1TZXR0aW5nIHRoZSBvdXRwdXQgRmlsZSB0bzogCi1YSW5jbHVkZVRhc2tfMT1TZXR0aW5nIHRoZSBvdXRwdXQgRmlsZSB0bzogCi1YSW5jbHVkZVRhc2tfMj1FeGVjdXRpbmcgdGhlIFhJbmNsdWRlVGFzawotWEluY2x1ZGVUYXNrXzM9U3BlY2lmaWVkIElucHV0ZmlsZSBkb2VzIG5vdCBleGlzdHMgCi1YSW5jbHVkZVRhc2tfND1DcmVhdGluZyB0aGUgb3V0cHV0IGRpcmVjdG9yeSAKLVhJbmNsdWRlVGFza181PUNvdWxkIG5vdCBjcmVhdGUgb3V0cHV0ZmlsZQotWEluY2x1ZGVUYXNrXzY9Q2hhbmdlcyBkZXRlY3RlZC4gQ3JlYXRpbmcgYSBuZXcgb3V0cHV0IGZpbGUKLVhJbmNsdWRlVGFza183PVByb2JsZW1zIHdpdGggYWNjZXNzaW5nIHRoZSBmaWxlcy4KLVhJbmNsdWRlVGFza184PVBsZWFzZSBzcGVjaWZ5IGlucHV0ZmlsZSAKLVhJbmNsdWRlVGFza185PVBsZWFzZSBzcGVjaWZ5IG91dHB1dGZpbGUgIAotIyBWYWxpZGF0aW9uCi1YU0xWYWxpZGF0b3JfMT1YcGF0aCBpcyBpbnZhbGlkCi1YU0xWYWxpZGF0b3JfMTA9QSBzdHlsZXNoZWV0IG11c3Qgbm90IGltcG9ydCBpdHNlbGYKLVhTTFZhbGlkYXRvcl8xMT1UZW1wbGF0ZSBjb25mbGljdHMgd2l0aCBhbm90aGVyIHRlbXBsYXRlIGluIHRoaXMgc3R5bGVzaGVldAotWFNMVmFsaWRhdG9yXzEyPVRlbXBsYXRlIGNvbmZsaWN0cyB3aXRoIGFuIGluY2x1ZGVkIHRlbXBsYXRlCi1YU0xWYWxpZGF0b3JfMTM9SW5jbHVkZWQgdGVtcGxhdGVzIGNvbmZsaWN0IHdpdGggZWFjaCBvdGhlcgotWFNMVmFsaWRhdG9yXzE0PU5hbWUgYXR0cmlidXRlIGlzIHJlcXVpcmVkCi1YU0xWYWxpZGF0b3JfMjM9aHJlZiBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQKLVhTTFZhbGlkYXRvcl8xNT1OYW1lIG11c3QgYmUgc3BlY2lmaWVkCi1YU0xWYWxpZGF0b3JfMTY9UGFyYW1ldGVyIGFscmVhZHkgZGVmaW5lZAotWFNMVmFsaWRhdG9yXzE4PU5hbWVkIHRlbXBsYXRlIHswfSBpcyBub3QgYXZhaWxhYmxlCi1YU0xWYWxpZGF0b3JfMj1JbmNsdWRlZCBzdHlsZXNoZWV0cyBmb3JtIGEgY2lyY3VsYXIgcmVmZXJlbmNlCi1YU0xWYWxpZGF0b3JfMjA9UGFyYW1ldGVyIHswfSBkb2VzIG5vdCBoYXZlIGEgZGVmYXVsdCB2YWx1ZQotWFNMVmFsaWRhdG9yXzIyPVBhcmFtZXRlciB7MH0gZG9lcyBub3QgZXhpc3QKLVhTTFZhbGlkYXRvcl8zPU1pc3NpbmcgcGFyYW1ldGVyOiB7MH0KLVhTTFZhbGlkYXRvcl80PU1pc3NpbmcgaW5jbHVkZTogCi1YU0xWYWxpZGF0b3JfNj1BIHN0eWxlc2hlZXQgbXVzdCBub3QgaW5jbHVkZSBpdHNlbGYKLVhTTFZhbGlkYXRvcl84PU1pc3NpbmcgaW1wb3J0OiAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvbW9kZWwvQ2FsbFRlbXBsYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL21vZGVsL0NhbGxUZW1wbGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTc1MDkzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvbW9kZWwvQ2FsbFRlbXBsYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIFRoZSA8Y29kZT54c2w6Y2FsbC10ZW1wbGF0ZTwvY29kZT4gbW9kZWwgZWxlbWVudC4KLSAqIAotICogQGF1dGhvciBEb3VnIFNhdGNod2VsbAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ2FsbFRlbXBsYXRlIGV4dGVuZHMgWFNMRWxlbWVudAotewotCWZpbmFsIExpc3Q8UGFyYW1ldGVyPiBwYXJhbWV0ZXJzID0gbmV3IEFycmF5TGlzdDxQYXJhbWV0ZXI+KCk7Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMuCi0JICogCi0JICogQHBhcmFtIHN0eWxlc2hlZXQgdGhlIHN0eWxlc2hlZXQgdGhhdCB0aGlzIGJlbG9uZ3MgdG8KLQkgKi8KLQlwdWJsaWMgQ2FsbFRlbXBsYXRlKFN0eWxlc2hlZXQgc3R5bGVzaGVldCkKLQl7Ci0JCXN1cGVyKHN0eWxlc2hlZXQpOwotCX0KLQkKLQkvKioKLQkgKiBBZGQgYSBwYXJhbWV0ZXIgdG8gdGhpcy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyYW1ldGVyIHRoZSBwYXJhbWV0ZXIgdG8gYWRkCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFyYW1ldGVyKFBhcmFtZXRlciBwYXJhbWV0ZXIpCi0JewotCQlwYXJhbWV0ZXJzLmFkZChwYXJhbWV0ZXIpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgdGhlIDxjb2RlPm5hbWU8L2NvZGU+IGF0dHJpYnV0ZSBpZiBvbmUgZXhpc3RzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRlbXBsYXRlIG5hbWUsIG9yIG51bGwKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCJuYW1lIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBsaXN0IG9mIHBhcmFtZXRlcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMuCi0JICogCi0JICogQHJldHVybiBhIGxpc3Qgb2YgcGFyYW1ldGVycwotCSAqLwotCXB1YmxpYyBMaXN0PFBhcmFtZXRlcj4gZ2V0UGFyYW1ldGVycygpCi0JewotCQlyZXR1cm4gcGFyYW1ldGVyczsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFR5cGUgZ2V0TW9kZWxUeXBlKCkKLQl7Ci0JCXJldHVybiBUeXBlLkNBTExfVEVNUExBVEU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL21vZGVsL0ltcG9ydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9tb2RlbC9JbXBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM2OWRkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL21vZGVsL0ltcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLm1vZGVsOwotCi0vKioKLSAqIFRoZSA8Y29kZT54c2w6aW1wb3J0PC9jb2RlPiBtb2RlbCBlbGVtZW50LgotICogCi0gKiBAYXV0aG9yIERvdWcgU2F0Y2h3ZWxsCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJbXBvcnQgZXh0ZW5kcyBJbmNsdWRlCi17Ci0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMuCi0JICogCi0JICogQHBhcmFtIHN0eWxlc2hlZXQgdGhlIHN0eWxlc2hlZXQgdGhhdCB0aGlzIGJlbG9uZ3MgdG8KLQkgKi8KLQlwdWJsaWMgSW1wb3J0KFN0eWxlc2hlZXQgc3R5bGVzaGVldCkKLQl7Ci0JCXN1cGVyKHN0eWxlc2hlZXQsSU1QT1JUKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL21vZGVsL0luY2x1ZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvbW9kZWwvSW5jbHVkZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWQwYzhlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvbW9kZWwvSW5jbHVkZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLlhTTENvcmU7Ci0KLS8qKgotICogVGhlIDxjb2RlPnhzbDppbmNsdWRlPC9jb2RlPiBtb2RlbCBlbGVtZW50LgotICogCi0gKiBAYXV0aG9yIERvdWcgU2F0Y2h3ZWxsCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmNsdWRlIGV4dGVuZHMgWFNMRWxlbWVudAotewotCS8qKgotCSAqIENvbnN0YW50IGluZGljYXRpbmcgdGhhdCB0aGlzIGlzIGFuIDxjb2RlPkluY2x1ZGU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOQ0xVREUgPSAxOwotCQotCS8qKgotCSAqIENvbnN0YW50IGluZGljYXRpbmcgdGhhdCB0aGlzIGlzIGFuIDxjb2RlPkltcG9ydDwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU1QT1JUID0gMjsKLQkKLQlwcml2YXRlIGZpbmFsIGludCB0eXBlOwotCQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzLgotCSAqIAotCSAqIEBwYXJhbSBzdHlsZXNoZWV0IHRoZSBzdHlsZXNoZWV0IHRoYXQgdGhpcyBiZWxvbmdzIHRvCi0JICovCi0JcHVibGljIEluY2x1ZGUoU3R5bGVzaGVldCBzdHlsZXNoZWV0KQotCXsKLQkJdGhpcyhzdHlsZXNoZWV0LElOQ0xVREUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzLCBzcGVjaWZ5aW5nIHdoZXRoZXIgYW4gPGNvZGU+SW5jbHVkZTwvY29kZT4gb3IgYW4gPGNvZGU+SW1wb3J0PC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gc3R5bGVzaGVldCB0aGUgc3R5bGVzaGVldCB0aGF0IHRoaXMgYmVsb25ncyB0bwotCSAqIEBwYXJhbSB0eXBlIG9uZSBvZiB0aGUgY29uc3RhbnRzIDxjb2RlPklOQ0xVREU8L2NvZGU+IG9yIDxjb2RlPklNUE9SVDwvY29kZT4KLQkgKi8KLQlwcm90ZWN0ZWQgSW5jbHVkZShTdHlsZXNoZWV0IHN0eWxlc2hlZXQsIGludCB0eXBlKQotCXsKLQkJc3VwZXIoc3R5bGVzaGVldCk7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgdHlwZSBvZiBpbmNsdWRlLCB3aGV0aGVyIGFuIDxjb2RlPkluY2x1ZGU8L2NvZGU+IG9yIGFuIDxjb2RlPkltcG9ydDwvY29kZT4uCi0JICogCi0JICogQHJldHVybiBvbmUgb2YgdGhlIGNvbnN0YW50cyA8Y29kZT5JTkNMVURFPC9jb2RlPiBvciA8Y29kZT5JTVBPUlQ8L2NvZGU+Ci0JICovCi0JcHVibGljIGludCBnZXRJbmNsdWRlVHlwZSgpCi0JewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+aHJlZjwvY29kZT4gYXR0cmlidXRlIGlmIG9uZSBleGlzdHMuCi0JICogCi0JICogQHJldHVybiB0aGUgPGNvZGU+aHJlZjwvY29kZT4gdmFsdWUsIG9yIG51bGwKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEhyZWYoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgiaHJlZiIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCi0JLyoqCi0JICogR2V0cyB0aGUgaW5jbHVkZWQgZmlsZSBhcyBhIHNvdXJjZSBmaWxlLCBpZiBwb3NzaWJsZSAocmV0dXJuZWQgZmlsZSBtYXkgYmUgbnVsbCBhbmQgbmVlZCBub3QgZXhpc3QpLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGluY2x1ZGVkIGZpbGUsIG9yIG51bGwKLQkgKi8KLQlwdWJsaWMgSUZpbGUgZ2V0SHJlZkFzRmlsZSgpCi0JewotCQlyZXR1cm4gWFNMQ29yZS5yZXNvbHZlRmlsZShnZXRTdHlsZXNoZWV0KCkuZ2V0RmlsZSgpLCBnZXRIcmVmKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBUeXBlIGdldE1vZGVsVHlwZSgpCi0JewotCQlyZXR1cm4gVHlwZS5JTkNMVURFOwotCX0gCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL21vZGVsL1BhcmFtZXRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9tb2RlbC9QYXJhbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThkOTJhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL21vZGVsL1BhcmFtZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLm1vZGVsOwotCi0vKioKLSAqIFRoZSA8Y29kZT54c2w6cGFyYW1ldGVyPC9jb2RlPiBvciA8Y29kZT54c2w6d2l0aC1wYXJhbTwvY29kZT4gbW9kZWwgZWxlbWVudC4KLSAqIAotICogQGF1dGhvciBEb3VnIFNhdGNod2VsbAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUGFyYW1ldGVyIGV4dGVuZHMgVmFyaWFibGUKLXsKLQlwcml2YXRlIGJvb2xlYW4gdmFsdWVTZXQ7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcy4KLQkgKiAKLQkgKiBAcGFyYW0gc3R5bGVzaGVldCB0aGUgc3R5bGVzaGVldCB0aGF0IHRoaXMgYmVsb25ncyB0bwotCSAqLwotCXB1YmxpYyBQYXJhbWV0ZXIoU3R5bGVzaGVldCBzdHlsZXNoZWV0KQotCXsKLQkJc3VwZXIoc3R5bGVzaGVldCk7Ci0JfQotCQotCS8qKgotCSAqIFNldCB3aGV0aGVyIHRoaXMgaGFzIGEgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIHZhbHVlU2V0IDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaGFzIGEgdmFsdWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShib29sZWFuIHZhbHVlU2V0KQotCXsKLQkJdGhpcy52YWx1ZVNldCA9IHZhbHVlU2V0OwotCX0KLQotCS8qKgotCSAqIEdldCB3aGV0aGVyIHRoaXMgaGFzIGEgdmFsdWUuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGhhcyBhIHZhbHVlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWYWx1ZSgpCi0JewotCQlpZiAodmFsdWVTZXQpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGdldEF0dHJpYnV0ZVZhbHVlKCJzZWxlY3QiKSAhPSBudWxsKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOyAKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL21vZGVsL1N0eWxlc2hlZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvbW9kZWwvU3R5bGVzaGVldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjU4ZTMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvbW9kZWwvU3R5bGVzaGVldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLQotLyoqCi0gKiBUaGUgPGNvZGU+eHNsOnN0eWxlc2hlZXQ8L2NvZGU+IG1vZGVsIGVsZW1lbnQuCi0gKiAKLSAqIEBhdXRob3IgRG91ZyBTYXRjaHdlbGwKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFN0eWxlc2hlZXQgZXh0ZW5kcyBYU0xFbGVtZW50Ci17Ci0JZmluYWwgSUZpbGUgZmlsZTsKLQlmaW5hbCBMaXN0PEluY2x1ZGU+IGluY2x1ZGVzID0gbmV3IEFycmF5TGlzdDxJbmNsdWRlPigpOwotCWZpbmFsIExpc3Q8SW1wb3J0PiBpbXBvcnRzID0gbmV3IEFycmF5TGlzdDxJbXBvcnQ+KCk7Ci0JZmluYWwgTGlzdDxUZW1wbGF0ZT4gdGVtcGxhdGVzID0gbmV3IEFycmF5TGlzdDxUZW1wbGF0ZT4oKTsKLQlmaW5hbCBMaXN0PENhbGxUZW1wbGF0ZT4gY2FsbGVkVGVtcGxhdGVzID0gbmV3IEFycmF5TGlzdDxDYWxsVGVtcGxhdGU+KCk7Ci0JZmluYWwgTGlzdDxWYXJpYWJsZT4gZ2xvYmFsVmFyaWFibGVzID0gbmV3IEFycmF5TGlzdDxWYXJpYWJsZT4oKTsKLQlmaW5hbCBMaXN0PFhTTEVsZW1lbnQ+IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxYU0xFbGVtZW50PigpOwotCVN0cmluZyB2ZXJzaW9uOwotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMuCi0JICogCi0JICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgdGhhdCB0aGlzIHJlcHJlc2VudHMKLQkgKi8KLQlwdWJsaWMgU3R5bGVzaGVldChJRmlsZSBmaWxlKQotCXsKLQkJc3VwZXIobnVsbCk7Ci0JCXRoaXMuZmlsZSA9IGZpbGU7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHlsZXNoZWV0IGdldFN0eWxlc2hlZXQoKQotCXsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQWRkIGFuIDxjb2RlPkluY2x1ZGU8L2NvZGU+IHRvIHRoaXMuCi0JICogCi0JICogQHBhcmFtIGluY2x1ZGUgdGhlIGluY2x1ZGUgdG8gYWRkCi0JICovCi0JcHVibGljIHZvaWQgYWRkSW5jbHVkZShJbmNsdWRlIGluY2x1ZGUpCi0JewotCQlpbmNsdWRlcy5hZGQoaW5jbHVkZSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGFuIDxjb2RlPkltcG9ydDwvY29kZT4gdG8gdGhpcy4KLQkgKiAKLQkgKiBAcGFyYW0gaW5jbHVkZSB0aGUgaW1wb3J0IHRvIGFkZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEltcG9ydChJbXBvcnQgaW5jbHVkZSkKLQl7Ci0JCWltcG9ydHMuYWRkKGluY2x1ZGUpOwotCX0KLQotCS8qKgotCSAqIEFkZCBhIDxjb2RlPlRlbXBsYXRlPC9jb2RlPiB0byB0aGlzLgotCSAqIAotCSAqIEBwYXJhbSB0ZW1wbGF0ZSB0aGUgdGVtcGxhdGUgdG8gYWRkCi0JICovCi0JcHVibGljIHZvaWQgYWRkVGVtcGxhdGUoVGVtcGxhdGUgdGVtcGxhdGUpCi0JewotCQl0ZW1wbGF0ZXMuYWRkKHRlbXBsYXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYSA8Y29kZT5DYWxsVGVtcGxhdGU8L2NvZGU+IHRvIHRoaXMuCi0JICogCi0JICogQHBhcmFtIHRlbXBsYXRlIHRoZSB0ZW1wbGF0ZSB0byBhZGQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDYWxsZWRUZW1wbGF0ZShDYWxsVGVtcGxhdGUgdGVtcGxhdGUpCi0JewotCQljYWxsZWRUZW1wbGF0ZXMuYWRkKHRlbXBsYXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGZpbGUgdGhhdCB0aGlzIHJlcHJlc2VudHMuCi0JICogCi0JICogQHJldHVybiB0aGUgZmlsZSB0aGF0IHRoaXMgcmVwcmVzZW50cwotCSAqLwotCXB1YmxpYyBJRmlsZSBnZXRGaWxlKCkKLQl7Ci0JCXJldHVybiBmaWxlOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgbGlzdCBvZiBpbmNsdWRlcyBmb3IgdGhpcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGluY2x1ZGVzCi0JICovCi0JcHVibGljIExpc3Q8SW5jbHVkZT4gZ2V0SW5jbHVkZXMoKQotCXsKLQkJcmV0dXJuIGluY2x1ZGVzOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIGxpc3Qgb2YgaW1wb3J0cyBmb3IgdGhpcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGltcG9ydHMKLQkgKi8KLQlwdWJsaWMgTGlzdDxJbXBvcnQ+IGdldEltcG9ydHMoKQotCXsKLQkJcmV0dXJuIGltcG9ydHM7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBsaXN0IG9mIHRlbXBsYXRlcyBmb3IgdGhpcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIHRlbXBsYXRlcwotCSAqLwotCXB1YmxpYyBMaXN0PFRlbXBsYXRlPiBnZXRUZW1wbGF0ZXMoKQotCXsKLQkJcmV0dXJuIHRlbXBsYXRlczsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGxpc3Qgb2YgY2FsbGVkIHRlbXBsYXRlcyBmb3IgdGhpcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGNhbGxlZCB0ZW1wbGF0ZXMKLQkgKi8KLQlwdWJsaWMgTGlzdDxDYWxsVGVtcGxhdGU+IGdldENhbGxlZFRlbXBsYXRlcygpCi0JewotCQlyZXR1cm4gY2FsbGVkVGVtcGxhdGVzOwotCX0KLQotCS8qKgotCSAqIEFkZCBhIGdsb2JhbCB2YXJpYWJsZSB0byB0aGlzLgotCSAqIAotCSAqIEBwYXJhbSB2YXIgdGhlIHZhcmlhYmxlIHRvIGFkZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEdsb2JhbFZhcmlhYmxlKFZhcmlhYmxlIHZhcikKLQl7Ci0JCWdsb2JhbFZhcmlhYmxlcy5hZGQodmFyKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFR5cGUgZ2V0TW9kZWxUeXBlKCkKLQl7Ci0JCXJldHVybiBUeXBlLlNUWUxFU0hFRVQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBzdHlsZXNoZWV0IHZlcnNpb24uCi0JICogCi0JICogQHBhcmFtIHZlcnNpb24gdGhlIHZlcnNpb24gdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbihTdHJpbmcgdmVyc2lvbikKLQl7Ci0JCXRoaXMudmVyc2lvbiA9IHZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBzdHlsZXNoZWV0IHZlcnNpb24uCi0JICogQHJldHVybiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKQotCXsKLQkJcmV0dXJuIHZlcnNpb247Ci0JfQotCi0JcHVibGljIExpc3Q8VmFyaWFibGU+IGdldEdsb2JhbFZhcmlhYmxlcygpCi0JewotCQlyZXR1cm4gZ2xvYmFsVmFyaWFibGVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvbW9kZWwvU3R5bGVzaGVldE1vZGVsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL21vZGVsL1N0eWxlc2hlZXRNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTBiODBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvbW9kZWwvU3R5bGVzaGVldE1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgRGF2aWQgQ2FydmVyIChTVEFSKSAtICBidWcgMjQzNTc3IC0gQWRkZWQgcmV0cmlldmluZyBhbGwgY2FsbGVkLXRlbXBsYXRlcy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuWFNMQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLQotLyoqCi0gKiBUaGUgY29tcG9zZWQgc3R5bGVzaGVldCwgY29uc2lzdGluZyBvZiBhbGwgdGVtcGxhdGVzIGFuZCB2YXJpYWJsZXMgYXZhaWxhYmxlIHZpYSBpbXBvcnRzIGFuZCBpbmNsdWRlcy4KLSAqIAotICogPHA+Ci0gKiBUaGUgPGNvZGU+Zml4KCk8L2NvZGU+IG1ldGhvZCBkb2VzIHRoZSBhY3R1YWwgd29yayBvZiBwb3B1bGF0aW5nIHRoZSBmaWVsZHMgb2YgdGhpcywgc28gaXQgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcgYW55IG9mIHRoZSBvdGhlciBtZXRob2RzLgotICogPC9wPgotICogCi0gKiA8cD4KLSAqIE5vdGUgdGhhdCB0aGlzIG1vZGVsIG1heSBub3QgYmUgdmFsaWQgLSBmb3IgaW5zdGFuY2UgdGhlcmUgbWF5IGJlIG1vcmUgdGhhbiBvbmUgbmFtZWQgdGVtcGxhdGUgZm9yIGEgZ2l2ZW4gbmFtZSBvciBtb3JlIHRoYW4gb25lIGdsb2JhbCB2YXJpYWJsZSB3aXRoIGEgZ2l2ZW4gbmFtZS4KLSAqIDwvcD4KLSAqIAotICogQGF1dGhvciBEb3VnIFNhdGNod2VsbAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3R5bGVzaGVldE1vZGVsIGV4dGVuZHMgWFNMTW9kZWxPYmplY3QKLXsKLQlwcml2YXRlIGZpbmFsIFN0eWxlc2hlZXQgc3R5bGVzaGVldDsKLQlib29sZWFuIGNpcmN1bGFyUmVmZXJlbmNlOwotCWZpbmFsIFNldDxJRmlsZT4gZmlsZXMgPSBuZXcgSGFzaFNldDxJRmlsZT4oKTsKLQlmaW5hbCBTZXQ8U3R5bGVzaGVldD4gc3R5bGVzaGVldHMgPSBuZXcgSGFzaFNldDxTdHlsZXNoZWV0PigpOwotCWZpbmFsIExpc3Q8SW5jbHVkZT4gaW5jbHVkZU1vZGVsID0gbmV3IEFycmF5TGlzdDxJbmNsdWRlPigpOwotCWZpbmFsIExpc3Q8SW1wb3J0PiBpbXBvcnRNb2RlbCA9IG5ldyBBcnJheUxpc3Q8SW1wb3J0PigpOwotCWZpbmFsIFNldDxUZW1wbGF0ZT4gdGVtcGxhdGVTZXQgPSBuZXcgSGFzaFNldDxUZW1wbGF0ZT4oKTsKLQlmaW5hbCBMaXN0PFRlbXBsYXRlPiB0ZW1wbGF0ZXMgPSBuZXcgQXJyYXlMaXN0PFRlbXBsYXRlPigpOwotCWZpbmFsIExpc3Q8VmFyaWFibGU+IGdsb2JhbFZhcmlhYmxlcyA9IG5ldyBBcnJheUxpc3Q8VmFyaWFibGU+KCk7Ci0JZmluYWwgTGlzdDxDYWxsVGVtcGxhdGU+IGNhbGxUZW1wbGF0ZXMgPSBuZXcgQXJyYXlMaXN0PENhbGxUZW1wbGF0ZT4oKTsKLQotCi0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcy4KLQkgKiAKLQkgKiBAcGFyYW0gc3R5bGVzaGVldAotCSAqICAgICAgICAgICAgdGhlIHN0eWxlc2hlZXQgdGhhdCB0aGlzIGlzIHRoZSBtb2RlbCBmb3IKLQkgKi8KLQlwdWJsaWMgU3R5bGVzaGVldE1vZGVsKFN0eWxlc2hlZXQgc3R5bGVzaGVldCkKLQl7Ci0JCXRoaXMuc3R5bGVzaGVldCA9IHN0eWxlc2hlZXQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IGFsbCBzdHlsZXNoZWV0cyB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGlzIHN0eWxlc2hlZXQgYW55d2hlcmUgaW4gdGhlIGhpZXJhcmNoeSB2aWEgZWl0aGVyIGltcG9ydCBvciBpbmNsdWRlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNldCBvZiBzdHlsZXNoZWV0cyBpbiB0aGUgZW50aXJlIGhpZXJhcmNoeQotCSAqLwotCXB1YmxpYyBMaXN0PEluY2x1ZGU+IGdldEluY2x1ZGVzKCkKLQl7Ci0JCXJldHVybiBpbmNsdWRlTW9kZWw7Ci0JfQotCi0JLyoqCi0JICogR2V0IGFsbCBmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGlzIHN0eWxlc2hlZXQgYW55d2hlcmUgaW4gdGhlIGhpZXJhcmNoeSB2aWEgZWl0aGVyIGltcG9ydCBvciBpbmNsdWRlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNldCBvZiBmaWxlcyBpbiB0aGUgZW50aXJlIGhpZXJhcmNoeQotCSAqLwotCXB1YmxpYyBTZXQ8SUZpbGU+IGdldEZpbGVEZXBlbmRlbmNpZXMoKQotCXsKLQkJcmV0dXJuIGZpbGVzOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgc3R5bGVzaGVldCB0aGF0IHRoaXMgaXMgdGhlIG1vZGVsIGZvci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzdHlsZXNoZWV0IHRoYXQgdGhpcyBpcyB0aGUgbW9kZWwgZm9yCi0JICovCi0JcHVibGljIFN0eWxlc2hlZXQgZ2V0U3R5bGVzaGVldCgpCi0JewotCQlyZXR1cm4gdGhpcy5zdHlsZXNoZWV0OwotCX0KLQotCS8qKgotCSAqIEdldCBhbGwgZ2xvYmFsIHZhcmlhYmxlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGlzIHN0eWxlc2hlZXQgYW55d2hlcmUgaW4gdGhlIGhpZXJhcmNoeSB2aWEgZWl0aGVyIGltcG9ydCBvciBpbmNsdWRlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNldCBvZiBmaWxlcyBpbiB0aGUgZW50aXJlIGhpZXJhcmNoeQotCSAqLwotCXB1YmxpYyBMaXN0PFZhcmlhYmxlPiBnZXRHbG9iYWxWYXJpYWJsZXMoKQotCXsKLQkJcmV0dXJuIGdsb2JhbFZhcmlhYmxlczsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYWxsIHRlbXBsYXRlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGlzIHN0eWxlc2hlZXQgYW55d2hlcmUgaW4gdGhlIGhpZXJhcmNoeSB2aWEgZWl0aGVyIGltcG9ydCBvciBpbmNsdWRlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNldCBvZiB0ZW1wbGF0ZXMgaW4gdGhlIGVudGlyZSBoaWVyYXJjaHkKLQkgKi8KLQlwdWJsaWMgTGlzdDxUZW1wbGF0ZT4gZ2V0VGVtcGxhdGVzKCkKLQl7Ci0JCXJldHVybiB0ZW1wbGF0ZXM7Ci0JfQotCQotCS8qKgotCSAqIEEgdXRpbGl0eSBtZXRob2QgdGhhdCB0cmF2ZXJzZXMgYWxsIHN0eWxlc2hlZXQgaW4gdGhlIGhpZXJhcmNoeSBvZiBzdHlsZXNoZWV0cyAobm90IGluY2x1ZGluZyB0aGUgY3VycmVudCBzdHlsZXNoZWV0KSwgYW5kIGFkZHMgYWxsIHRoZWlyIHRlbXBsYXRlcyB0byB0aGUgcmV0dXJuZWQgbGlzdC4KLQkgKiBUaGVyZWZvcmUgdGhlIHJldHVybmVkIGxpc3QgaGFzIG5vIHJlZ2FyZCBmb3Igd2hldGhlciBhIHRlbXBsYXRlIGlzICd2aXNpYmxlJyAoaS5lLiB3aGV0aGVyIGl0IG1pZ2h0IGJlIG92ZXJyaWRkZW4gc2luY2UgaXQgCi0JICogd2FzIGluY2x1ZGVkIHZpYSBhbiBpbXBvcnQpLiBUaGUgb3JkZXIgb2YgdGhlIHRlbXBsYXRlcyBpbiB0aGUgbGlzdCBpcyBhcmJpdHJhcnkuCi0JICogCi0JICogQHJldHVybiBhbiB1bm9yZGVyZWQgbGlzdCBvZiBhbGwgdGVtcGxhdGVzIGZyb20gYWxsIHN0eWxlc2hlZXRzLgotCSAqLwotCXB1YmxpYyBMaXN0PFRlbXBsYXRlPiBmaW5kQWxsTmVzdGVkVGVtcGxhdGVzKCkKLQl7Ci0JCUxpc3Q8VGVtcGxhdGU+IGFsbFRlbXBsYXRlcyA9IG5ldyBBcnJheUxpc3Q8VGVtcGxhdGU+KCk7Ci0JCWZvciAoU3R5bGVzaGVldCBzdHlsZXNoZWV0IDogc3R5bGVzaGVldHMpCi0JCXsKLQkJCWFsbFRlbXBsYXRlcy5hZGRBbGwoc3R5bGVzaGVldC5nZXRUZW1wbGF0ZXMoKSk7Ci0JCX0KLQkJcmV0dXJuIGFsbFRlbXBsYXRlczsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYWxsIG5hbWVkIHRlbXBsYXRlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGlzIHN0eWxlc2hlZXQgYW55d2hlcmUgaW4gdGhlIGhpZXJhcmNoeSB2aWEgZWl0aGVyIGltcG9ydCBvciBpbmNsdWRlIHdoaWNoIGhhdmUgdGhlIGdpdmVuIG5hbWUuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSB0ZW1wbGF0ZSBuYW1lCi0JICogQHJldHVybiB0aGUgc2V0IG9mIG5hbWVkIHRlbXBsYXRlcyB3aXRoIHRoZSBnaXZlbiBuYW1lCi0JICovCi0JcHVibGljIExpc3Q8VGVtcGxhdGU+IGdldFRlbXBsYXRlc0J5TmFtZShTdHJpbmcgbmFtZSkKLQl7Ci0JCUxpc3Q8VGVtcGxhdGU+IG1hdGNoaW5nID0gbmV3IEFycmF5TGlzdDxUZW1wbGF0ZT4odGVtcGxhdGVzLnNpemUoKSk7Ci0JCWZvciAoVGVtcGxhdGUgdGVtcGxhdGUgOiB0ZW1wbGF0ZXMpCi0JCXsKLQkJCWlmIChuYW1lLmVxdWFscyh0ZW1wbGF0ZS5nZXROYW1lKCkpKQotCQkJCW1hdGNoaW5nLmFkZCh0ZW1wbGF0ZSk7Ci0JCX0KLQkJcmV0dXJuIG1hdGNoaW5nOwotCX0KLQotCS8qKgotCSAqIEdldCBhbGwgdGVtcGxhdGVzIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIHRlbXBsYXRlIChkZXRlcm1pbmVkIGZyb20gPGNvZGU+VGVtcGxhdGUuZXF1YWxzKCk8L2NvZGU+KS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9NYXRjaAotCSAqICAgICAgICAgICAgdGhlIHRlbXBsYXRlIHRvIG1hdGNoCi0JICogQHJldHVybiB0aGUgc2V0IG9mIHRlbXBsYXRlcyB0aGF0IG1hdGNoCi0JICovCi0JcHVibGljIExpc3Q8VGVtcGxhdGU+IGZpbmRNYXRjaGluZyhUZW1wbGF0ZSB0b01hdGNoKQotCXsKLQkJTGlzdDxUZW1wbGF0ZT4gbWF0Y2hpbmcgPSBuZXcgQXJyYXlMaXN0PFRlbXBsYXRlPih0ZW1wbGF0ZXMuc2l6ZSgpKTsKLQkJZm9yIChUZW1wbGF0ZSB0ZW1wbGF0ZSA6IHRlbXBsYXRlcykKLQkJewotCQkJaWYgKHRlbXBsYXRlLmVxdWFscyh0b01hdGNoKSkKLQkJCQltYXRjaGluZy5hZGQodGVtcGxhdGUpOwotCQl9Ci0JCXJldHVybiBtYXRjaGluZzsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgd2hldGhlciB0aGlzIGhhcyBhIGNpcmN1bGFyIHJlZmVyZW5jZSBhbnl3aGVyZSBpbiBpdHMgaW1wb3J0L2luY2x1ZGVkIGhpZXJhcmNoeS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaGFzIGEgY2lyY3VsYXIgcmVmZXJlbmNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2lyY3VsYXJSZWZlcmVuY2UoKQotCXsKLQkJcmV0dXJuIGNpcmN1bGFyUmVmZXJlbmNlOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm0gdGhlIHByb2Nlc3Mgb2YgdHJhdmVyc2luZyB0aGUgaGllcmFyY2h5IHRvIGRldGVybWluZSBhbGwgb2YgdGhlIHByb3BlcnRpZXMgb2YgdGhpcy4gTm90ZSB0aGF0IHRoaXMgbWV0aG9kIG1heSBmb3JjZSBvdGhlciA8Y29kZT5TdHlsZXNoZWV0TW9kZWw8L2NvZGU+J3MgdG8gYmUgYnVpbHQgZHVyaW5nIHRoZSBwcm9jZXNzCi0JICogb2YgZml4aW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpeCgpCi0JewotCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLQkJaWYgKERlYnVnLmRlYnVnWFNMTW9kZWwpCi0JCXsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRml4aW5nICIgKyBzdHlsZXNoZWV0LmdldEZpbGUoKSArICIuLi4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJdGVtcGxhdGVzLmFkZEFsbChzdHlsZXNoZWV0LmdldFRlbXBsYXRlcygpKTsKLQkJdGVtcGxhdGVTZXQuYWRkQWxsKHN0eWxlc2hlZXQuZ2V0VGVtcGxhdGVzKCkpOwotCQlnbG9iYWxWYXJpYWJsZXMuYWRkQWxsKHN0eWxlc2hlZXQuZ2xvYmFsVmFyaWFibGVzKTsKLQkJY2FsbFRlbXBsYXRlcy5hZGRBbGwoc3R5bGVzaGVldC5nZXRDYWxsZWRUZW1wbGF0ZXMoKSk7Ci0JCWZvciAoSW5jbHVkZSBpbmMgOiBzdHlsZXNoZWV0LmdldEluY2x1ZGVzKCkpCi0JCXsKLQkJCWhhbmRsZUluY2x1ZGUoaW5jKTsKLQkJfQotCQlmb3IgKEltcG9ydCBpbmMgOiBzdHlsZXNoZWV0LmdldEltcG9ydHMoKSkKLQkJewotCQkJaGFuZGxlSW5jbHVkZShpbmMpOwotCQl9Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1hTTE1vZGVsKQotCQl7Ci0JCQlsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJGSVggIiArIHN0eWxlc2hlZXQuZ2V0RmlsZSgpICsgIiBpbiAiICsgKGVuZCAtIHN0YXJ0KSArICJtcyIpOyAgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUluY2x1ZGUoSW5jbHVkZSBpbmNsdWRlKQotCXsKLQkJSUZpbGUgZmlsZSA9IGluY2x1ZGUuZ2V0SHJlZkFzRmlsZSgpOwotCi0JCWlmIChmaWxlID09IG51bGwgfHwgIWZpbGUuZXhpc3RzKCkpCi0JCXsKLQkJCXJldHVybjsKLQkJfQotCQllbHNlIGlmIChzdHlsZXNoZWV0LmdldEZpbGUoKS5lcXVhbHMoZmlsZSkgfHwgZmlsZXMuY29udGFpbnMoZmlsZSkpCi0JCXsKLQkJCWNpcmN1bGFyUmVmZXJlbmNlID0gdHJ1ZTsKLQkJCXJldHVybjsKLQkJfQotCQlmaWxlcy5hZGQoZmlsZSk7Ci0KLQkJU3R5bGVzaGVldE1vZGVsIGluY2x1ZGVkTW9kZWwgPSBYU0xDb3JlLmdldEluc3RhbmNlKCkuZ2V0U3R5bGVzaGVldChmaWxlKTsKLQkJaWYgKGluY2x1ZGVkTW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJc3R5bGVzaGVldHMuYWRkKGluY2x1ZGVkTW9kZWwuZ2V0U3R5bGVzaGVldCgpKTsKLQkJZ2xvYmFsVmFyaWFibGVzLmFkZEFsbChpbmNsdWRlZE1vZGVsLmdsb2JhbFZhcmlhYmxlcyk7Ci0JCWNhbGxUZW1wbGF0ZXMuYWRkQWxsKGluY2x1ZGVkTW9kZWwuZ2V0Q2FsbFRlbXBsYXRlcygpKTsKLQotCQlpZiAoaW5jbHVkZS5nZXRJbmNsdWRlVHlwZSgpID09IEluY2x1ZGUuSU5DTFVERSkKLQkJewotCQkJaW5jbHVkZU1vZGVsLmFkZChpbmNsdWRlKTsKLQkJCXRlbXBsYXRlcy5hZGRBbGwoaW5jbHVkZWRNb2RlbC5nZXRUZW1wbGF0ZXMoKSk7Ci0JCQl0ZW1wbGF0ZVNldC5hZGRBbGwoaW5jbHVkZWRNb2RlbC5nZXRUZW1wbGF0ZXMoKSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlpbXBvcnRNb2RlbC5hZGQoKEltcG9ydClpbmNsdWRlKTsKLQkJCWZvciAoVGVtcGxhdGUgaW5jbHVkZWRUZW1wbGF0ZSA6IGluY2x1ZGVkTW9kZWwuZ2V0VGVtcGxhdGVzKCkpCi0JCQl7Ci0JCQkJaWYgKCF0ZW1wbGF0ZVNldC5jb250YWlucyhpbmNsdWRlZFRlbXBsYXRlKSkKLQkJCQl7Ci0JCQkJCXRlbXBsYXRlcy5hZGQoaW5jbHVkZWRUZW1wbGF0ZSk7Ci0JCQkJCXRlbXBsYXRlU2V0LmFkZChpbmNsdWRlZFRlbXBsYXRlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFR5cGUgZ2V0TW9kZWxUeXBlKCkKLQl7Ci0JCXJldHVybiBUeXBlLlNUWUxFU0hFRVRfTU9ERUw7Ci0JfQotCQotCXB1YmxpYyBMaXN0PENhbGxUZW1wbGF0ZT4gZ2V0Q2FsbFRlbXBsYXRlcygpIHsKLQkJcmV0dXJuIGNhbGxUZW1wbGF0ZXM7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9tb2RlbC9UZW1wbGF0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9tb2RlbC9UZW1wbGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmFiNWRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvbW9kZWwvVGVtcGxhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIFRoZSA8Y29kZT54c2w6dGVtcGxhdGU8L2NvZGU+IG1vZGVsIGVsZW1lbnQuCi0gKiAKLSAqIEBhdXRob3IgRG91ZyBTYXRjaHdlbGwKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRlbXBsYXRlIGV4dGVuZHMgWFNMRWxlbWVudAotewotCWZpbmFsIExpc3Q8VmFyaWFibGU+IHZhcmlhYmxlcyA9IG5ldyBBcnJheUxpc3Q8VmFyaWFibGU+KCk7Ci0JZmluYWwgTGlzdDxQYXJhbWV0ZXI+IHBhcmFtZXRlcnMgPSBuZXcgQXJyYXlMaXN0PFBhcmFtZXRlcj4oKTsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcy4KLQkgKiAKLQkgKiBAcGFyYW0gc3R5bGVzaGVldCB0aGUgc3R5bGVzaGVldCB0aGF0IHRoaXMgYmVsb25ncyB0bwotCSAqLwotCXB1YmxpYyBUZW1wbGF0ZShTdHlsZXNoZWV0IHN0eWxlc2hlZXQpCi0JewotCQlzdXBlcihzdHlsZXNoZWV0KTsKLQl9Ci0JCi0JLyoqCi0JICogQWRkIGEgcGFyYW1ldGVyIHRvIHRoaXMuCi0JICogCi0JICogQHBhcmFtIHBhcmFtZXRlciB0aGUgcGFyYW1ldGVyIHRvIGFkZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBhcmFtZXRlcihQYXJhbWV0ZXIgcGFyYW1ldGVyKQotCXsKLQkJcGFyYW1ldGVycy5hZGQocGFyYW1ldGVyKTsKLQl9Ci0JCi0JLyoqCi0JICogQWRkIGEgdmFyaWFibGUgdG8gdGhpcy4KLQkgKiAKLQkgKiBAcGFyYW0gdmFyIHRoZSB2YXJpYWJsZSB0byBhZGQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRWYXJpYWJsZShWYXJpYWJsZSB2YXIpCi0JewotCQl2YXJpYWJsZXMuYWRkKHZhcik7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+bmFtZTwvY29kZT4gYXR0cmlidXRlIGlmIG9uZSBleGlzdHMuCi0JICogCi0JICogQHJldHVybiB0aGUgdGVtcGxhdGUgbmFtZSwgb3IgbnVsbAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoIm5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSA8Y29kZT5tYXRjaDwvY29kZT4gYXR0cmlidXRlIGlmIG9uZSBleGlzdHMuCi0JICogCi0JICogQHJldHVybiB0aGUgbWF0Y2ggdmFsdWUsIG9yIG51bGwKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1hdGNoKCkKLQl7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgibWF0Y2giKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSA8Y29kZT5tb2RlPC9jb2RlPiBhdHRyaWJ1dGUgaWYgb25lIGV4aXN0cy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtb2RlIHZhbHVlLCBvciBudWxsCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNb2RlKCkKLQl7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgibW9kZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgdGhlIDxjb2RlPnByaW9yaXR5PC9jb2RlPiBhdHRyaWJ1dGUgaWYgb25lIGV4aXN0cy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcmlvcml0eSB2YWx1ZSwgb3IgbnVsbAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJpb3JpdHkoKQotCXsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCJwcmlvcml0eSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBsaXN0IG9mIHBhcmFtZXRlcnMgb2YgdGhpcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIHBhcmFtZXRlcnMKLQkgKi8KLQlwdWJsaWMgTGlzdDxQYXJhbWV0ZXI+IGdldFBhcmFtZXRlcnMoKQotCXsKLQkJcmV0dXJuIHBhcmFtZXRlcnM7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKQotCXsKLQkJU3RyaW5nIG5hbWUgPSBnZXROYW1lKCk7Ci0JCWlmIChuYW1lICE9IG51bGwpCi0JCXsKLQkJCXJldHVybiAzICsgbmFtZS5oYXNoQ29kZSgpOwotCQl9Ci0JCVN0cmluZyBtYXRjaCA9IGdldE1hdGNoKCk7Ci0JCVN0cmluZyBtb2RlID0gZ2V0TW9kZSgpOwotCQlTdHJpbmcgcHJpb3JpdHkgPSBnZXRQcmlvcml0eSgpOwotCQlpZiAobWF0Y2ggIT0gbnVsbCkKLQkJewotCQkJaW50IGhhc2ggPSAzKm1hdGNoLmhhc2hDb2RlKCk7Ci0JCQlpZiAocHJpb3JpdHkgIT0gbnVsbCkKLQkJCQloYXNoICs9IDUqcHJpb3JpdHkuaGFzaENvZGUoKTsKLQkJCWlmIChtb2RlICE9IG51bGwpCi0JCQkJaGFzaCArPSA3Km1vZGUuaGFzaENvZGUoKTsKLQkJCXJldHVybiA1ICsgaGFzaDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopCi0JewotCQlpZiAob2JqID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChvYmogPT0gdGhpcykKLQkJCXJldHVybiB0cnVlOwotCQlpZiAob2JqIGluc3RhbmNlb2YgVGVtcGxhdGUpCi0JCXsKLQkJCVRlbXBsYXRlIGluY2x1ZGVkVGVtcGxhdGUgPSAoVGVtcGxhdGUpb2JqOwotCQkJaWYgKCFtYXRjaGVzQnlNYXRjaE9yTmFtZShpbmNsdWRlZFRlbXBsYXRlKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkvLyBvbmx5IHBvc3NpYmlsaXR5IGlzIHRoYXQgcHJpb3JpdHkgaXMgZGlmZmVyZW50Ci0JCQlTdHJpbmcgcHJpb3JpdHkxID0gZ2V0UHJpb3JpdHkoKTsKLQkJCVN0cmluZyBwcmlvcml0eTIgPSBpbmNsdWRlZFRlbXBsYXRlLmdldFByaW9yaXR5KCk7Ci0JCQlpZiAocHJpb3JpdHkxID09IG51bGwgJiYgcHJpb3JpdHkyID09IG51bGwgfHwgcHJpb3JpdHkxICE9IG51bGwgJiYgcHJpb3JpdHkxLmVxdWFscyhwcmlvcml0eTIpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gbWF0Y2hlc0J5TWF0Y2hPck5hbWUoVGVtcGxhdGUgaW5jbHVkZWRUZW1wbGF0ZSkKLQl7Ci0JCVN0cmluZyBuYW1lMSA9IGdldE5hbWUoKTsKLQkJU3RyaW5nIG1hdGNoMSA9IGdldE1hdGNoKCk7Ci0JCVN0cmluZyBtb2RlMSA9IGdldE1vZGUoKTsKLQkJU3RyaW5nIG5hbWUyID0gaW5jbHVkZWRUZW1wbGF0ZS5nZXROYW1lKCk7Ci0JCVN0cmluZyBtYXRjaDIgPSBpbmNsdWRlZFRlbXBsYXRlLmdldE1hdGNoKCk7Ci0JCVN0cmluZyBtb2RlMiA9IGluY2x1ZGVkVGVtcGxhdGUuZ2V0TW9kZSgpOwotCQlpZiAobmFtZTEgIT0gbnVsbCAmJiBuYW1lMS5lcXVhbHMobmFtZTIpKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChtYXRjaDEgIT0gbnVsbCAmJiBtYXRjaDEuZXF1YWxzKG1hdGNoMikgJiYgKG1vZGUxID09IG51bGwgJiYgbW9kZTIgPT0gbnVsbCB8fCBtb2RlMSAhPSBudWxsICYmIG1vZGUxLmVxdWFscyhtb2RlMikpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlTdHJpbmcgbmFtZSA9IGdldE5hbWUoKTsKLQkJU3RyaW5nIG1hdGNoID0gZ2V0TWF0Y2goKTsKLQkJcmV0dXJuICJmaWxlPSIrZ2V0U3R5bGVzaGVldCgpLmdldEZpbGUoKSsiLCBuYW1lPSIrbmFtZSsiLCBtYXRjaD0iK21hdGNoOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVHlwZSBnZXRNb2RlbFR5cGUoKQotCXsKLQkJcmV0dXJuIFR5cGUuVEVNUExBVEU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL21vZGVsL1ZhcmlhYmxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL21vZGVsL1ZhcmlhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMjRjODQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9tb2RlbC9WYXJpYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLm1vZGVsOwotCi0vKioKLSAqIFRoZSA8Y29kZT54c2w6dmFyaWFibGU8L2NvZGU+IG1vZGVsIGVsZW1lbnQuCi0gKiAKLSAqIEBhdXRob3IgRG91ZyBTYXRjaHdlbGwKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFZhcmlhYmxlIGV4dGVuZHMgWFNMRWxlbWVudAotewotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzLgotCSAqIAotCSAqIEBwYXJhbSBzdHlsZXNoZWV0IHRoZSBzdHlsZXNoZWV0IHRoYXQgdGhpcyBiZWxvbmdzIHRvCi0JICovCi0JcHVibGljIFZhcmlhYmxlKFN0eWxlc2hlZXQgc3R5bGVzaGVldCkKLQl7Ci0JCXN1cGVyKHN0eWxlc2hlZXQpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgdGhlIDxjb2RlPm5hbWU8L2NvZGU+IGF0dHJpYnV0ZSBpZiBvbmUgZXhpc3RzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhcmlhYmxlIG5hbWUsIG9yIG51bGwKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCJuYW1lIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+c2VsZWN0PC9jb2RlPiBhdHRyaWJ1dGUgaWYgb25lIGV4aXN0cy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzZWxlY3QgdmFsdWUsIG9yIG51bGwKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlbGVjdCgpCi0JewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoInNlbGVjdCIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUeXBlIGdldE1vZGVsVHlwZSgpCi0JewotCQlyZXR1cm4gVHlwZS5WQVJJQUJMRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL21vZGVsL1hTTEF0dHJpYnV0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9tb2RlbC9YU0xBdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NlNGMyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL21vZGVsL1hTTEF0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLm1vZGVsOwotCi0vKioKLSAqIEFuIGF0dHJpYnV0ZSBvZiBhbiBlbGVtZW50IGluIHRoZSBYU0wgbmFtZXNwYWNlLgotICogCi0gKiBAYXV0aG9yIERvdWcgU2F0Y2h3ZWxsCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBYU0xBdHRyaWJ1dGUgZXh0ZW5kcyBYU0xOb2RlCi17Ci0JZmluYWwgU3RyaW5nIG5hbWU7Ci0JZmluYWwgU3RyaW5nIHZhbHVlOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQgdGhpcyBiZWxvbmdzIHRvCi0JICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZQotCSAqLwotCXB1YmxpYyBYU0xBdHRyaWJ1dGUoWFNMRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKQotCXsKLQkJc3VwZXIoZWxlbWVudC5nZXRTdHlsZXNoZWV0KCksIFhTTE5vZGUuQVRUUklCVVRFX05PREUpOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgbmFtZSBvZiB0aGlzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSdzIG5hbWUKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgdGhpcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhdHRyaWJ1dGUncyB2YWx1ZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKQotCXsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVHlwZSBnZXRNb2RlbFR5cGUoKQotCXsKLQkJcmV0dXJuIFR5cGUuQVRUUklCVVRFOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvbW9kZWwvWFNMRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9tb2RlbC9YU0xFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMzg2YjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9tb2RlbC9YU0xFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEFuIGVsZW1lbnQgaW4gdGhlIFhTTCBuYW1lc3BhY2UuCi0gKiAKLSAqIEBhdXRob3IgRG91ZyBTYXRjaHdlbGwKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFhTTEVsZW1lbnQgZXh0ZW5kcyBYU0xOb2RlCi17Ci0JZmluYWwgTWFwPFN0cmluZywgWFNMQXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBYU0xBdHRyaWJ1dGU+KCk7Ci0JZmluYWwgTGlzdDxYU0xFbGVtZW50PiBjaGlsZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxYU0xFbGVtZW50PigpOwotCQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzLgotCSAqIAotCSAqIEBwYXJhbSBzdHlsZXNoZWV0IHRoZSBzdHlsZXNoZWV0IHRoYXQgdGhpcyBiZWxvbmdzIHRvCi0JICovCi0JcHVibGljIFhTTEVsZW1lbnQoU3R5bGVzaGVldCBzdHlsZXNoZWV0KQotCXsKLQkJc3VwZXIoc3R5bGVzaGVldCwgWFNMTm9kZS5FTEVNRU5UX05PREUpOwotCX0KLQkKLQkvKioKLQkgKiBBZGQgYW4gYXR0cmlidXRlIG9mIHRoaXMKLQkgKiAKLQkgKiBAcGFyYW0gYXR0cmlidXRlIHRoZSBhdHRyaWJ1dGUgdG8gYWRkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFhTTEF0dHJpYnV0ZSBhdHRyaWJ1dGUpCi0JewotCQlhdHRyaWJ1dGVzLnB1dChhdHRyaWJ1dGUubmFtZSwgYXR0cmlidXRlKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBhdHRyaWJ1dGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlCi0JICogQHJldHVybiB0aGUgYXR0cmlidXRlCi0JICovCi0JcHVibGljIFhTTEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpCi0JewotCQlyZXR1cm4gYXR0cmlidXRlcy5nZXQobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBhdHRyaWJ1dGVzIGtleWVkIGJ5IHRoZWlyIG5hbWVzLiAKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtYXAgb2YgYXR0cmlidXRlIG5hbWVzIGFuZCBpbnN0YW5jZXMKLQkgKi8KLQlwdWJsaWMgTWFwPFN0cmluZywgWFNMQXR0cmlidXRlPiBnZXRBdHRyaWJ1dGVzKCkKLQl7Ci0JCXJldHVybiBhdHRyaWJ1dGVzOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlCi0JICogQHJldHVybiB0aGUgYXR0cmlidXRlIHZhbHVlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZShTdHJpbmcgbmFtZSkKLQl7Ci0JCVhTTEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLmdldChuYW1lKTsKLQkJcmV0dXJuIGF0dHJpYnV0ZSA9PSBudWxsID8gbnVsbCA6IGF0dHJpYnV0ZS5nZXRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIEFkZCBhIGNoaWxkIGVsZW1lbnQgb2YgdGhpcy4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCB0aGUgY2hvbGQgZWxlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENoaWxkKFhTTEVsZW1lbnQgZWxlbWVudCkKLQl7Ci0JCWNoaWxkRWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIGxpc3Qgb2YgY2hpbGQgZWxlbWVudHMKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGNoaWxkcmVuCi0JICovCi0JcHVibGljIExpc3Q8WFNMRWxlbWVudD4gZ2V0Q2hpbGRFbGVtZW50cygpCi0JewotCQlyZXR1cm4gY2hpbGRFbGVtZW50czsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVHlwZSBnZXRNb2RlbFR5cGUoKQotCXsKLQkJcmV0dXJuIFR5cGUuT1RIRVJfRUxFTUVOVDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL21vZGVsL1hTTE1vZGVsT2JqZWN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL21vZGVsL1hTTE1vZGVsT2JqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmN2IyYTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9tb2RlbC9YU0xNb2RlbE9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm1PYmplY3Q7Ci0KLS8qKgotICogQGF1dGhvciBkY2FydmVyCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgWFNMTW9kZWxPYmplY3QgZXh0ZW5kcyBQbGF0Zm9ybU9iamVjdAotewotCXB1YmxpYyBlbnVtIFR5cGUge1NUWUxFU0hFRVRfTU9ERUwsSU1QT1JULElOQ0xVREUsVEVNUExBVEUsVkFSSUFCTEUsIENBTExfVEVNUExBVEUsIFNUWUxFU0hFRVQsIEFUVFJJQlVURSwgT1RIRVJfRUxFTUVOVH07Ci0JCi0JcHVibGljIGFic3RyYWN0IFR5cGUgZ2V0TW9kZWxUeXBlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL21vZGVsL1hTTE5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvbW9kZWwvWFNMTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGUzZWJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvbW9kZWwvWFNMTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5tb2RlbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogQSBub2RlIGluIHRoZSBYU0wgbmFtZXNwYWNlLgotICogCi0gKiBAYXV0aG9yIERvdWcgU2F0Y2h3ZWxsCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBYU0xOb2RlIGV4dGVuZHMgWFNMTW9kZWxPYmplY3QKLXsKLQkvKioKLQkgKiBBIGNvbnN0YW50IGZvciB0aGUgZWxlbWVudCBub2RlICg9IDxjb2RlPm9yZy53M2MuZG9tLk5vZGUuRUxFTUVOVF9OT0RFPC9jb2RlPikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IEVMRU1FTlRfTk9ERSA9IE5vZGUuRUxFTUVOVF9OT0RFOwotCQotCS8qKgotCSAqIEEgY29uc3RhbnQgZm9yIHRoZSBhdHRyaWJ1dGUgbm9kZSAoPSA8Y29kZT5vcmcudzNjLmRvbS5Ob2RlLkFUVFJJQlVURV9OT0RFPC9jb2RlPikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IEFUVFJJQlVURV9OT0RFID0gTm9kZS5BVFRSSUJVVEVfTk9ERTsKLQkKLQkKLQlwcml2YXRlIGZpbmFsIFN0eWxlc2hlZXQgc3R5bGVzaGVldDsKLQlpbnQgbGluZU51bWJlcjsKLQlpbnQgY29sdW1uTnVtYmVyOwotCXByaXZhdGUgaW50IG9mZnNldDsKLQlwcml2YXRlIGludCBsZW5ndGg7Ci0JcHJpdmF0ZSBzaG9ydCB0eXBlOwotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMuCi0JICogCi0JICogQHBhcmFtIHN0eWxlc2hlZXQgdGhlIHN0eWxlc2hlZXQgdGhpcyBiZWxvbmdzIHRvCi0JICogQHBhcmFtIHR5cGUgb25lIG9mIDxjb2RlPkVMRU1FTlRfTk9ERTwvY29kZT4gb3IgPGNvZGU+QVRUUklCVVRFX05PREU8L2NvZGU+Ci0JICovCi0JcHVibGljIFhTTE5vZGUoU3R5bGVzaGVldCBzdHlsZXNoZWV0LCBzaG9ydCB0eXBlKQotCXsKLQkJdGhpcy5zdHlsZXNoZWV0ID0gc3R5bGVzaGVldDsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGxpbmUgbnVtYmVyIHdoZXJlIHRoaXMgbm9kZSBvY2N1cnMgaW4gdGhlIFhTTCBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSBsaW5lTnVtYmVyIHRoZSBsaW5lIG51bWJlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpbmVOdW1iZXIoaW50IGxpbmVOdW1iZXIpCi0JewotCQl0aGlzLmxpbmVOdW1iZXIgPSBsaW5lTnVtYmVyOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgY29sdW1ucyBudW1iZXIgd2hlcmUgdGhpcyBub2RlIG9jY3VycyBpbiB0aGUgWFNMIGZpbGUuCi0JICogCi0JICogQHBhcmFtIGNvbHVtbk51bWJlciB0aGUgY29sdW1uIG51bWJlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbHVtbk51bWJlcihpbnQgY29sdW1uTnVtYmVyKQotCXsKLQkJdGhpcy5jb2x1bW5OdW1iZXIgPSBjb2x1bW5OdW1iZXI7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBzdHlsZXNoZWV0IHRoYXQgdGhpcyBiZWxvbmdzIHRvLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHN0eWxlc2hlZXQKLQkgKi8KLQlwdWJsaWMgU3R5bGVzaGVldCBnZXRTdHlsZXNoZWV0KCkKLQl7Ci0JCXJldHVybiBzdHlsZXNoZWV0OwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgbGluZSBudW1iZXIgd2hlcmUgdGhpcyBub2RlIG9jY3VycyBpbiB0aGUgWFNMIGZpbGUuCi0JICogQHJldHVybiB0aGUgbGluZSBudW1iZXIgd2hlcmUgdGhpcyBub2RlIG9jY3VycyBpbiB0aGUgWFNMIGZpbGUuCi0JICovCi0JcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkKLQl7Ci0JCXJldHVybiBsaW5lTnVtYmVyOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgY29sdW1uIG51bWJlciB3aGVyZSB0aGlzIG5vZGUgb2NjdXJzIGluIHRoZSBYU0wgZmlsZS4KLQkgKiBAcmV0dXJuIHRoZSBjb2x1bW4gbnVtYmVyIHdoZXJlIHRoaXMgbm9kZSBvY2N1cnMgaW4gdGhlIFhTTCBmaWxlLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29sdW1uTnVtYmVyKCkKLQl7Ci0JCXJldHVybiBjb2x1bW5OdW1iZXI7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBkb2N1bWVudCBvZmZzZXQgd2hlcmUgdGhpcyBub2RlIG9jY3Vycy4KLQkgKiBAcGFyYW0gb2Zmc2V0IHRoZSBkb2N1bWVudCBvZmZzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPZmZzZXQoaW50IG9mZnNldCkKLQl7Ci0JCXRoaXMub2Zmc2V0ID0gb2Zmc2V0OwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIGRvY3VtZW50IG9mZnNldCB3aGVyZSB0aGlzIG5vZGUgb2NjdXJzLgotCSAqIEByZXR1cm4gdGhlIGRvY3VtZW50IG9mZnNldAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0T2Zmc2V0KCkKLQl7Ci0JCXJldHVybiBvZmZzZXQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBsZW5ndGggb2YgdGhpcyBub2RlLgotCSAqIEBwYXJhbSBsZW5ndGggdGhlIG5vZGUgbGVuZ3RoCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGVuZ3RoKGludCBsZW5ndGgpCi0JewotCQl0aGlzLmxlbmd0aCA9IGxlbmd0aDsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBsZW5ndGggb2YgdGhpcyBub2RlLgotCSAqIEByZXR1cm4gdGhlIG5vZGUgbGVuZ3RoCi0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKQotCXsKLQkJcmV0dXJuIGxlbmd0aDsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSB0eXBlIG9mIG5vZGUuCi0JICogCi0JICogQHJldHVybiBvbmUgb2YgPGNvZGU+RUxFTUVOVF9OT0RFPC9jb2RlPiBvciA8Y29kZT5BVFRSSUJVVEVfTk9ERTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKQotCXsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiZmlsZT0iK3N0eWxlc2hlZXQrIiwgbGluZT0iK2xpbmVOdW1iZXIrIiwgY29sPSIrY29sdW1uTnVtYmVyOyAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0zJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvcmVzb2x2ZXIvUmVzb2x2ZXJFeHRlbnNpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvcmVzb2x2ZXIvUmVzb2x2ZXJFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZiMTlkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL3Jlc29sdmVyL1Jlc29sdmVyRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBKZXNwZXIgU3RlZW4gTW9lbGxlciBhbmQgb3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIEplc3BlciBTdGVlbiBNb2VsbGVyIC0gWFNMIGNvcmUgcGx1Z2luCi0gKiBEb3VnIFNhdGNod2VsbCAtIGJ1ZyAyMjUzMDQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5yZXNvbHZlcjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLlhTTENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLlhTTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLS8qKgotICogVE9ETzogSmF2YWRvYwotICogCi0gKiBAYXV0aG9yIEplc3BlciBTdGVlbiBNb2VsbGVyCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFJlc29sdmVyRXh0ZW5zaW9uIGltcGxlbWVudHMgVVJJUmVzb2x2ZXJFeHRlbnNpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEb3VibGUgREVGQVVMVF9YU0xUX1ZFUlNJT04gPSAxLjA7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhTTFRfU1RZTEVTSEVFVCA9ICJzdHlsZXNoZWV0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYU0xUX1RFTVBMQVRFID0gInRlbXBsYXRlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYU0xUX1ZFUlNJT04gPSAidmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgYm9vbGVhbiBpbml0aWFsaXNlZDsKLQlwcml2YXRlIFN0cmluZyB4c2x0XzFfMF9maWxlVVJMOwotCXByaXZhdGUgU3RyaW5nIHhzbHRfMl8wX2ZpbGVVUkw7Ci0KLQlwdWJsaWMgU3RyaW5nIHJlc29sdmUoSUZpbGUgZmlsZSwgU3RyaW5nIGJhc2VMb2NhdGlvbiwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0JewotCi0JCS8vIElzIHNvbWVvbmUgbG9va2luZyBmb3IgIm91ciIgc2NoZW1hPwotCQlpZiAoIVhTTENvcmUuWFNMX05BTUVTUEFDRV9VUkkuZXF1YWxzKHB1YmxpY0lkKSkKLQkJewotCQkJLy8gTm90IHRoaXMgdGltZSwgcmV0dXJuIHJpZ2h0IGF3YXkKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJU3RyaW5nIHZlcnNpb24gPSBudWxsOwotCi0JCWlmIChmaWxlICE9IG51bGwpCi0JCQl2ZXJzaW9uID0gcGVla1ZlcnNpb25BdHRyaWJ1dGVGcm9tU1NFKGZpbGUpOwotCQlpZiAodmVyc2lvbiA9PSBudWxsKQotCQkJdmVyc2lvbiA9IHBlZWtWZXJzaW9uRnJvbUZpbGUoZmlsZSwgYmFzZUxvY2F0aW9uKTsKLQotCQlpZiAodmVyc2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJRG91YmxlIHZlcnNpb25OdW1iZXIgPSBudWxsOwotCQl0cnkKLQkJewotCQkJdmVyc2lvbk51bWJlciA9IERvdWJsZS52YWx1ZU9mKHZlcnNpb24pOwotCQl9Ci0JCWNhdGNoIChUaHJvd2FibGUgdCkKLQkJewotCQkJLy8gTm90IGludGVyZXN0ZWQKLQkJfQotCi0JCWlmICh2ZXJzaW9uTnVtYmVyID09IG51bGwpCi0JCXsKLQkJCXZlcnNpb25OdW1iZXIgPSBERUZBVUxUX1hTTFRfVkVSU0lPTjsKLQkJfQotCi0JCS8vIFdlIGNhcmVsZXNzbHkgZGl0Y2ggdGhlIGZyYWN0aW9uIHBhcnQKLQkJaW50IGludFZlcnNpb24gPSB2ZXJzaW9uTnVtYmVyLmludFZhbHVlKCk7Ci0JCWNoZWNrSW5pdGlhbGlzZWQoKTsKLQkJaWYgKGludFZlcnNpb24gPT0gMSkKLQkJewotCQkJcmV0dXJuIHhzbHRfMV8wX2ZpbGVVUkw7Ci0JCX0KLQkJZWxzZSBpZiAoaW50VmVyc2lvbiA9PSAyKQotCQl7Ci0JCQlyZXR1cm4geHNsdF8yXzBfZmlsZVVSTDsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tJbml0aWFsaXNlZCgpCi0JewotCQlpZiAoIWluaXRpYWxpc2VkKQotCQl7Ci0JCQlpbml0aWFsaXNlZCA9IHRydWU7Ci0JCQl0cnkKLQkJCXsKLQkJCQlVUkwgcGx1Z2luVVJMID0gRmlsZUxvY2F0b3IuZmluZChYU0xDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKSwgbmV3IFBhdGgoIi94c2x0LXNjaGVtYXMveHNsdC0xLjAueHNkIiksIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQkJeHNsdF8xXzBfZmlsZVVSTCA9IEZpbGVMb2NhdG9yLnRvRmlsZVVSTChwbHVnaW5VUkwpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCQkJcGx1Z2luVVJMID0gRmlsZUxvY2F0b3IuZmluZChYU0xDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKSwgbmV3IFBhdGgoIi94c2x0LXNjaGVtYXMveHNsdC0yLjAueHNkIiksIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQkJeHNsdF8yXzBfZmlsZVVSTCA9IEZpbGVMb2NhdG9yLnRvRmlsZVVSTChwbHVnaW5VUkwpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gZSkKLQkJCXsKLQkJCQlYU0xDb3JlUGx1Z2luLmxvZyhlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIHBlZWtWZXJzaW9uRnJvbUZpbGUoSUZpbGUgZmlsZSwgU3RyaW5nIGJhc2VMb2NhdGlvbikKLQl7Ci0JCVhTTFZlcnNpb25IYW5kbGVyIGhhbmRsZXIgPSBuZXcgWFNMVmVyc2lvbkhhbmRsZXIoKTsKLQkJdHJ5Ci0JCXsKLQkJCWhhbmRsZXIucGFyc2VDb250ZW50cyhmaWxlICE9IG51bGwgPyBjcmVhdGVJbnB1dFNvdXJjZShmaWxlKSA6IGNyZWF0ZUlucHV0U291cmNlKGJhc2VMb2NhdGlvbikpOwotCQl9Ci0JCWNhdGNoIChTQVhFeGNlcHRpb24gc2UpCi0JCXsKLQkJCVhTTENvcmVQbHVnaW4ubG9nKHNlKTsKLQkJCS8vIGRyb3AgdGhyb3VnaCwgc2luY2UgdGhpcyBpcyBhbG1vc3QgdG8gYmUgZXhwZWN0ZWQKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gaW9lKQotCQl7Ci0JCQlYU0xDb3JlUGx1Z2luLmxvZyhuZXcgQ29yZUV4Y2VwdGlvbihYU0xDb3JlUGx1Z2luLm5ld0Vycm9yU3RhdHVzKCJDYW4ndCBwYXJzZSBYU0wgZG9jdW1lbnQiLCBpb2UpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIGRyb3AgdGhyb3VnaCwgc2luY2UgdGhpcyBpcyBub3QgcmVhbGx5IGEgc2hvdy1zdG9wcGVyCi0JCX0KLQkJY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gcGNlKQotCQl7Ci0JCQkvLyBzb21lIGJhZCB0aGluZyBoYXBwZW5lZCAtIGZvcmNlIHRoaXMgZGVzY3JpYmVyIHRvIGJlIGRpc2FibGVkCi0JCQlTdHJpbmcgbWVzc2FnZSA9IE1lc3NhZ2VzLlhTTENvcmVQbHVnaW5fcGFyc2VyQ29uZmlndXJhdGlvbjsKLQkJCVhTTENvcmVQbHVnaW4ubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgWFNMQ29yZVBsdWdpbi5QTFVHSU5fSUQsIDAsIG1lc3NhZ2UsIHBjZSkpOwotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obWVzc2FnZSk7Ci0JCQkvLyBkcm9wIHRocm91Z2gsIHNpbmNlIHRoaXMgaXMgbm90IHJlYWxseSBhIHNob3ctc3RvcHBlcgotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKQotCQl7Ci0JCQlYU0xDb3JlUGx1Z2luLmxvZyhjZSk7Ci0JCQkvLyBkcm9wIHRocm91Z2gsIHNpbmNlIHRoaXMgaXMgbm90IHJlYWxseSBhIHNob3ctc3RvcHBlcgotCQl9Ci0KLQkJU3RyaW5nIHZlcnNpb25YID0gaGFuZGxlci5nZXRWZXJzaW9uQXR0cmlidXRlKCk7Ci0JCXJldHVybiB2ZXJzaW9uWDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBwZWVrVmVyc2lvbkF0dHJpYnV0ZUZyb21TU0UoSUZpbGUgZmlsZSkKLQl7Ci0JCUlNb2RlbE1hbmFnZXIgbWFuYWdlciA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0KLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkKLQkJewotCQkJU3RyaW5nIGlkID0gbWFuYWdlci5jYWxjdWxhdGVJZChmaWxlKTsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBtYW5hZ2VyLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGlkKTsKLQkJCXRyeQotCQkJewotCQkJCWlmIChtb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkKLQkJCQl7Ci0JCQkJCURvY3VtZW50IGRvYyA9ICgoSURPTU1vZGVsKSBtb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCQkJaWYgKGRvYyAhPSBudWxsICYmIGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKSAhPSBudWxsKQotCQkJCQl7Ci0JCQkJCQlFbGVtZW50IGRvY3VtZW50RWxlbWVudCA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJCQkJCWlmIChYU0xUX1NUWUxFU0hFRVQuZXF1YWxzKGRvY3VtZW50RWxlbWVudC5nZXRMb2NhbE5hbWUoKSkgfHwgWFNMVF9URU1QTEFURS5lcXVhbHMoZG9jdW1lbnRFbGVtZW50LmdldExvY2FsTmFtZSgpKSkKLQkJCQkJCXsKLQkJCQkJCQlyZXR1cm4gZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZShYU0xUX1ZFUlNJT04pOwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseQotCQkJewotCQkJCS8vIGJ1ZyAyMjUzMDQKLQkJCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBJbnB1dFNvdXJjZSBjcmVhdGVJbnB1dFNvdXJjZShTdHJpbmcgc3lzdGVtSWQpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gbmV3IElucHV0U291cmNlKHN5c3RlbUlkKTsKLQl9Ci0KLQlwcml2YXRlIElucHV0U291cmNlIGNyZWF0ZUlucHV0U291cmNlKElGaWxlIGZpbGUpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlJbnB1dFNvdXJjZSBzcmMgPSBuZXcgSW5wdXRTb3VyY2UoZmlsZS5nZXRDb250ZW50cygpKTsKLQkJc3JjLnNldFN5c3RlbUlkKGZpbGUuZ2V0TG9jYXRpb25VUkkoKS50b1N0cmluZygpKTsKLQkJcmV0dXJuIHNyYzsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL3Jlc29sdmVyL1N0b3BQYXJzaW5nRXhjZXB0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL3Jlc29sdmVyL1N0b3BQYXJzaW5nRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZDA3ZWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9yZXNvbHZlci9TdG9wUGFyc2luZ0V4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUucmVzb2x2ZXI7Ci0KLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLS8qKgotICogQW4gZXhjZXB0aW9uIGluZGljYXRpbmcgdGhhdCB0aGUgcGFyc2luZyBzaG91bGQgc3RvcC4gVGhpcyBpcyB1c3VhbGx5Ci0gKiB0cmlnZ2VyZWQgd2hlbiB0aGUgdG9wLWxldmVsIGVsZW1lbnQgaGFzIGJlZW4gZm91bmQuCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotCi1jbGFzcyBTdG9wUGFyc2luZ0V4Y2VwdGlvbiBleHRlbmRzIFNBWEV4Y2VwdGlvbiB7Ci0JLyoqCi0JICogQWxsIHNlcmlhbGl6YWJsZSBvYmplY3RzIHNob3VsZCBoYXZlIGEgc3RhYmxlIHNlcmlhbFZlcnNpb25VSUQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYW4gaW5zdGFuY2Ugb2YgPGNvZGU+U3RvcFBhcnNpbmdFeGNlcHRpb248L2NvZGU+IHdpdGggYQotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGRldGFpbCBtZXNzYWdlLgotCSAqLwotCXB1YmxpYyBTdG9wUGFyc2luZ0V4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKFN0cmluZykgbnVsbCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvcmVzb2x2ZXIvWFNMVmVyc2lvbkhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvcmVzb2x2ZXIvWFNMVmVyc2lvbkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIxMDEwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL3Jlc29sdmVyL1hTTFZlcnNpb25IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiBKZXNwZXIgU3RlZW4gTe+/vWxsZXIgLSBhZGFwdGVkIGZyb20gb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5jb250ZW50Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUucmVzb2x2ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuWFNMQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwuWFNMQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcueG1sLnNheC4qOwotaW1wb3J0IG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0vKioKLSAqIEEgc2ltcGxlIFhNTCBwYXJzZXIgdG8gZmluZCB0aGUgWFNMIHZlcnNpb24gb2YgYSBnaXZlbiBYTUwgZmlsZSwgZXhwZWN0ZWRseSBhIFhTTFQgc3R5bGVzaGVldC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFhTTFZlcnNpb25IYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgaW1wbGVtZW50cyBMZXhpY2FsSGFuZGxlciwgRXJyb3JIYW5kbGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYU0xUX1NUWUxFU0hFRVQgPSAic3R5bGVzaGVldCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYU0xUX1RFTVBMQVRFID0gInRlbXBsYXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhTTFRfVkVSU0lPTiA9ICJ2ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgdmFsdWUgb2YgdGhlIHZlcnNpb24gYXR0cmlidXRlIGluIHRoZSBYU0xUIGZpbGUuCi0JICogVGhpcyBtZW1iZXIgdmFyaWFibGUgaXMgPGNvZGU+bnVsbDwvY29kZT4gdW5sZXNzIHRoZSBmaWxlIGhhcyBiZWVuCi0JICogcGFyc2VkIHN1Y2Nlc3NmdWwgdG8gdGhlIHBvaW50IG9mIGZpbmRpbmcgdGhlIHRvcC1sZXZlbCBlbGVtZW50LAotCSAqIGFuZCBsb2NhdGluZyB0aGUgJ3ZlcnNpb24nIGF0dHJpYnV0ZSB0aGVyZS4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyB2ZXJzaW9uQXR0cmlidXRlID0gbnVsbDsKLQotCS8qKgotCSAqIFRPRE86IEFkZCBKYXZhZG9jCi0JICovCi0JcHVibGljIFhTTFZlcnNpb25IYW5kbGVyKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyI2NvbW1lbnQoY2hhcltdLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjb21tZW50KGZpbmFsIGNoYXJbXSBjaCwgZmluYWwgaW50IHN0YXJ0LCBmaW5hbCBpbnQgbGVuZ3RoKSB7Ci0JCS8vIE5vdCBpbnRlcmVzdGVkLgotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgU0FYIHBhcnNlciBmb3IgdXNlIHdpdGhpbiB0aGlzIGluc3RhbmNlLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgcGFyc2VyLgotCSAqIAotCSAqIEB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIGEgcGFyc2VyIG9mIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uIGNhbm5vdCBiZSBjcmVhdGVkLgotCSAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgSWYgc29tZXRoaW5nIGluIGdlbmVyYWwgZ29lcyB3cm9uZyB3aGVuIGNyZWF0aW5nIHRoZSBwYXJzZXIuCi0JICogQHRocm93cyBTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgSWYgdGhlIDxjb2RlPlhNTFJlYWRlcjwvY29kZT4gZG9lcyBub3QgcmVjb2duaXplIHRoZQotCSAqICAgICAgICAgICAgIGxleGljYWwgaGFuZGxlciBjb25maWd1cmF0aW9uIG9wdGlvbi4KLQkgKiBAdGhyb3dzIFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHRoZSA8Y29kZT5YTUxSZWFkZXI8L2NvZGU+IGRvZXMgbm90IHN1cHBvcnQgdGhlIGxleGljYWwKLQkgKiAgICAgICAgICAgICBoYW5kbGVyIGNvbmZpZ3VyYXRpb24gb3B0aW9uLgotCSAqLwotCXByaXZhdGUgZmluYWwgU0FYUGFyc2VyIGNyZWF0ZVBhcnNlcihTQVhQYXJzZXJGYWN0b3J5IHBhcnNlckZhY3RvcnkpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24sIFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7Ci0JCS8vIEluaXRpYWxpemUgdGhlIHBhcnNlci4KLQkJZmluYWwgU0FYUGFyc2VyIHBhcnNlciA9IHBhcnNlckZhY3RvcnkubmV3U0FYUGFyc2VyKCk7Ci0JCWZpbmFsIFhNTFJlYWRlciByZWFkZXIgPSBwYXJzZXIuZ2V0WE1MUmVhZGVyKCk7Ci0JCXJlYWRlci5zZXRQcm9wZXJ0eSgiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvbGV4aWNhbC1oYW5kbGVyIiwgdGhpcyk7IC8vJE5PTi1OTFMtMSQKLQkJcmVhZGVyLnNldEVycm9ySGFuZGxlcih0aGlzKTsgLy8gVGhpcyBoZWxwcyB0byBpZ25vcmUgZXJyb3JzCi0JCS8vIGRpc2FibGUgRFREIHZhbGlkYXRpb24KLQkJdHJ5IHsKLQkJCS8vCWJlIHN1cmUgdmFsaWRhdGlvbiBpcyAib2ZmIiBvciB0aGUgZmVhdHVyZSB0byBpZ25vcmUgRFREJ3Mgd2lsbCBub3QgYXBwbHkKLQkJCXJlYWRlci5zZXRGZWF0dXJlKCJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvdmFsaWRhdGlvbiIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQkJcmVhZGVyLnNldEZlYXR1cmUoImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy9ub252YWxpZGF0aW5nL2xvYWQtZXh0ZXJuYWwtZHRkIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24gZSkgewotCQkJLy8gbm90IGEgYmlnIGRlYWwgaWYgdGhlIHBhcnNlciBkb2VzIG5vdCByZWNvZ25pemUgdGhlIGZlYXR1cmVzCi0JCX0gY2F0Y2ggKFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBub3QgYSBiaWcgZGVhbCBpZiB0aGUgcGFyc2VyIGRvZXMgbm90IHN1cHBvcnQgdGhlIGZlYXR1cmVzCi0JCX0KLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlciNlbmRDREFUQSgpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZW5kQ0RBVEEoKSB7Ci0JCS8vIE5vdCBpbnRlcmVzdGVkLgotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyI2VuZERURCgpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZW5kRFREKCkgewotCQkvLyBOb3QgaW50ZXJlc3RlZC4KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlciNlbmRFbnRpdHkoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBlbmRFbnRpdHkoZmluYWwgU3RyaW5nIG5hbWUpIHsKLQkJLy8gTm90IGludGVyZXN0ZWQuCi0JfQotCi0JLyoqCi0JICogVE9ETzogQWRkIEphdmFkb2MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uQXR0cmlidXRlKCkgewotCQlyZXR1cm4gdmVyc2lvbkF0dHJpYnV0ZTsKLQl9Ci0KLQkvKioKLQkgKiBUT0RPOiBBZGQgSmF2YWRvYwotCSAqIEBwYXJhbSBjb250ZW50cwotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogQHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0JICogQHRocm93cyBTQVhFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwYXJzZUNvbnRlbnRzKElucHV0U291cmNlIGNvbnRlbnRzKSB0aHJvd3MgSU9FeGNlcHRpb24sIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiB7Ci0JCS8vIFBhcnNlIHRoZSBmaWxlIGludG8gd2UgaGF2ZSB3aGF0IHdlIG5lZWQgKG9yIGFuIGVycm9yIG9jY3VycykuCi0JCXRyeSB7Ci0JCQlTQVhQYXJzZXJGYWN0b3J5IGZhY3RvcnkgPSBYU0xDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRGYWN0b3J5KCk7Ci0JCQlpZiAoZmFjdG9yeSA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWZpbmFsIFNBWFBhcnNlciBwYXJzZXIgPSBjcmVhdGVQYXJzZXIoZmFjdG9yeSk7Ci0JCQkvLyB0byBzdXBwb3J0IGV4dGVybmFsIGVudGl0aWVzIHNwZWNpZmllZCBhcyByZWxhdGl2ZSBVUklzIChzZWUgYnVnIDYzMjk4KQotCQkJcGFyc2VyLnBhcnNlKGNvbnRlbnRzLCB0aGlzKTsKLQkJfSBjYXRjaCAoU3RvcFBhcnNpbmdFeGNlcHRpb24gZSkgewotCQkJLy8gQWJvcnQgdGhlIHBhcnNpbmcgbm9ybWFsbHkuIEZhbGwgdGhyb3VnaC4uLgotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogUmVzb2x2ZSBleHRlcm5hbCBlbnRpdHkgZGVmaW5pdGlvbnMgdG8gYW4gZW1wdHkgc3RyaW5nLiAgVGhpcyBpcyB0byBzcGVlZAotCSAqIHVwIHByb2Nlc3Npbmcgb2YgZmlsZXMgd2l0aCBleHRlcm5hbCBEVERzLiAgTm90IHJlc29sdmluZyB0aGUgY29udGVudHMgCi0JICogb2YgdGhlIERURCBpcyBvaywgYXMgb25seSB0aGUgU3lzdGVtIElEIG9mIHRoZSBEVEQgZGVjbGFyYXRpb24gaXMgdXNlZC4KLQkgKiBAc2VlIG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXIjcmVzb2x2ZUVudGl0eShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBJbnB1dFNvdXJjZShuZXcgU3RyaW5nUmVhZGVyKCIiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlciNzdGFydENEQVRBKCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBzdGFydENEQVRBKCkgewotCQkvLyBOb3QgaW50ZXJlc3RlZC4KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlciNzdGFydERURChqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBzdGFydERURChmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIHB1YmxpY0lkLCBmaW5hbCBTdHJpbmcgc3lzdGVtSWQpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkvLyBOb3QgaW50ZXJlc3RlZC4KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyI3N0YXJ0RWxlbWVudChqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgb3JnLnhtbC5zYXguQXR0cmlidXRlcykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgZmluYWwgdm9pZCBzdGFydEVsZW1lbnQoZmluYWwgU3RyaW5nIHVyaSwgZmluYWwgU3RyaW5nIGVsZW1lbnROYW1lLCBmaW5hbCBTdHJpbmcgcXVhbGlmaWVkTmFtZSwgZmluYWwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJaWYgKHVyaS5lcXVhbHMoWFNMQ29yZS5YU0xfTkFNRVNQQUNFX1VSSSkgJiYgKFhTTFRfVEVNUExBVEUuZXF1YWxzKGVsZW1lbnROYW1lKSB8fCBYU0xUX1NUWUxFU0hFRVQuZXF1YWxzKGVsZW1lbnROYW1lKSkpIHsKLQkJCXZlcnNpb25BdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKFhTTFRfVkVSU0lPTik7Ci0JCX0gZWxzZSB7Ci0JCQl2ZXJzaW9uQXR0cmlidXRlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0aHJvdyBuZXcgU3RvcFBhcnNpbmdFeGNlcHRpb24oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlciNzdGFydEVudGl0eShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHN0YXJ0RW50aXR5KGZpbmFsIFN0cmluZyBuYW1lKSB7Ci0JCS8vIE5vdCBpbnRlcmVzdGVkLgotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkvLyBOb3QgaW50ZXJlc3RlZC4KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCS8vIE5vdCBpbnRlcmVzdGVkLgotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkvLyBOb3QgaW50ZXJlc3RlZC4KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmNfc3NlL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9YU0xEb2N1bWVudExvYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjX3NzZS9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvWFNMRG9jdW1lbnRMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWI4ZGE3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmNfc3NlL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9YU0xEb2N1bWVudExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERhdmlkIENhcnZlciAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LkFic3RyYWN0RG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudENoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5TdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUVuY29kZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkJhc2ljU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5YTUxEb2N1bWVudENoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLlhNTFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC5wYXJzZXIuWFNMU291cmNlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC50ZXh0LnJ1bGVzLlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYU0w7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlYWRzIGFuIFhTTCBmaWxlIGFuZCBjcmVhdGVzIGFuIFhNTCBTdHJ1Y3R1cmVkIE1vZGVsLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBYU0xEb2N1bWVudExvYWRlciBleHRlbmRzIEFic3RyYWN0RG9jdW1lbnRMb2FkZXIgewotCi0JcHVibGljIFhTTERvY3VtZW50TG9hZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJRG9jdW1lbnRQYXJ0aXRpb25lciBnZXREZWZhdWx0RG9jdW1lbnRQYXJ0aXRpb25lcigpIHsKLQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yWFNMKCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudENoYXJzZXREZXRlY3RvciBnZXREb2N1bWVudEVuY29kaW5nRGV0ZWN0b3IoKSB7Ci0JCWlmIChmRG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yID09IG51bGwpIHsKLQkJCWZEb2N1bWVudEVuY29kaW5nRGV0ZWN0b3IgPSBuZXcgWE1MRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IoKTsKLQkJfQotCQlyZXR1cm4gZkRvY3VtZW50RW5jb2RpbmdEZXRlY3RvcjsKLQl9Ci0KLQlwdWJsaWMgUmVnaW9uUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJcmV0dXJuIG5ldyBYU0xTb3VyY2VQYXJzZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIFVURi04IGFzIHBlciBYTUwgc3BlYwotCQlmaW5hbCBTdHJpbmcgZW5jID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZW5jOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJRW5jb2RlZERvY3VtZW50IG5ld0VuY29kZWREb2N1bWVudCgpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5LmdldE5ld1N0cnVjdHVyZWREb2N1bWVudEluc3RhbmNlKGdldFBhcnNlcigpKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCBpbnN0YW5jZW9mIEJhc2ljU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkoKEJhc2ljU3RydWN0dXJlZERvY3VtZW50KSBzdHJ1Y3R1cmVkRG9jdW1lbnQpLnNldFJlUGFyc2VyKG5ldyBYTUxTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlcigpKTsKLQkJfQotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50OwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRMb2FkZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgWFNMRG9jdW1lbnRMb2FkZXIoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyY19zc2Uvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJGb3JYU0wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyY19zc2Uvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJGb3JYU0wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTRkNGI5Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmNfc3NlL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTW9kZWxIYW5kbGVyRm9yWFNMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRGF2aWQgQ2FydmVyIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudENoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLklNb2RlbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuWE1MRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5Nb2RlbEhhbmRsZXJGb3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLlhTTENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLmVuY29kaW5nLlhTTERvY3VtZW50TG9hZGVyOwotCi0KLS8qKgotICogUHJvdmlkZXMgZ2VuZXJpYyBYTUwgbW9kZWwgaGFuZGxpbmcuIEl0IGlzIGFsc28gbWFya2VkIGFzIHRoZSBkZWZhdWx0Ci0gKiBjb250ZW50IHR5cGUgaGFuZGxlci4gVGhlcmUgc2hvdWxkIGJlIG9ubHkgb25lIGltcGxlbWVudGF0aW9uIG9mIHRoZQotICogZGVmYXVsdC4KLSAqLwotcHVibGljIGNsYXNzIE1vZGVsSGFuZGxlckZvclhTTCBleHRlbmRzIE1vZGVsSGFuZGxlckZvclhNTCBpbXBsZW1lbnRzIElNb2RlbEhhbmRsZXIgewotCS8qKgotCSAqIE5lZWRzIHRvIG1hdGNoIHdoYXQncyBpbiBwbHVnaW4gcmVnaXN0cnkuIEluIGZhY3QsIGNhbiBiZSBvdmVyd3JpdHRlbgotCSAqIGF0IHJ1biB0aW1lIHdpdGggd2hhdCdzIGluIHJlZ2lzdHJ5ISAoc28gc2hvdWxkIG5ldmVyIGJlICdmaW5hbCcpCi0JICovCi0Jc3RhdGljIFN0cmluZyBBc3NvY2lhdGVkQ29udGVudFR5cGVJRCA9IFhTTENvcmUuWFNMX0NPTlRFTlRfVFlQRTsKLQkvKioKLQkgKiBOZWVkcyB0byBtYXRjaCB3aGF0J3MgaW4gcGx1Z2luIHJlZ2lzdHJ5LiBJbiBmYWN0LCBjYW4gYmUgb3ZlcndyaXR0ZW4KLQkgKiBhdCBydW4gdGltZSB3aXRoIHdoYXQncyBpbiByZWdpc3RyeSEgKHNvIHNob3VsZCBuZXZlciBiZSAnZmluYWwnKQotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBNb2RlbEhhbmRsZXJJRCA9ICJvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUubW9kZWxoYW5kbGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIE1vZGVsSGFuZGxlckZvclhTTCgpIHsKLQkJc3VwZXIoKTsJCi0JCXNldElkKE1vZGVsSGFuZGxlcklEKTsKLQkJc2V0QXNzb2NpYXRlZENvbnRlbnRUeXBlSWQoQXNzb2NpYXRlZENvbnRlbnRUeXBlSUQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJRG9jdW1lbnRMb2FkZXIgZ2V0RG9jdW1lbnRMb2FkZXIoKSB7Ci0JCXJldHVybiBuZXcgWFNMRG9jdW1lbnRMb2FkZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSURvY3VtZW50Q2hhcnNldERldGVjdG9yIGdldEVuY29kaW5nRGV0ZWN0b3IoKSB7Ci0JCXJldHVybiBuZXcgWE1MRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSU1vZGVsTG9hZGVyIGdldE1vZGVsTG9hZGVyKCkgewotCQlyZXR1cm4gbmV3IFhTTE1vZGVsTG9hZGVyKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmNfc3NlL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvWFNMTW9kZWxMb2FkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyY19zc2Uvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9YU0xNb2RlbExvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4OGY3YTc5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyY19zc2Uvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9YU0xNb2RlbExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERhdmlkIENhcnZlciAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Qcm9wYWdhdGluZ0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5EZWJ1Z0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5ET01Nb2RlbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5YTUxNb2RlbExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5YU0xEb2N1bWVudExvYWRlcjsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmVhZHMgYW4gWE1MIGZpbGUgYW5kIGNyZWF0ZXMgYW4gWE1MIFN0cnVjdHVyZWQgTW9kZWwuCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBYU0xNb2RlbExvYWRlciBleHRlbmRzIFhNTE1vZGVsTG9hZGVyIHsKLQotCS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJfRU5DT0RJTkcgPSAiZW5jb2RpbmciOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBYTUxMb2FkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgWFNMTW9kZWxMb2FkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0vLwlAT3ZlcnJpZGUKLS8vCXB1YmxpYyBMaXN0IGdldEFkYXB0ZXJGYWN0b3JpZXMoKSB7Ci0vLwkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLS8vCQlmYWN0b3J5ID0gbmV3IE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvclhNTCgpOwotLy8JCXJlc3VsdC5hZGQoZmFjdG9yeSk7Ci0vLwkJLy8gRG9lcyBYTUwgbmVlZCBwcm9wYWdhdGluZyBhZGFwdGVyPyBPciBqdXN0IEpTUD8KLS8vCQlmYWN0b3J5ID0gbmV3IFByb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnlJbXBsKCk7Ci0vLwkJcmVzdWx0LmFkZChmYWN0b3J5KTsKLS8vCQlyZXR1cm4gcmVzdWx0OwotLy8JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIElEb2N1bWVudExvYWRlciBnZXREb2N1bWVudExvYWRlcigpIHsKLQkJaWYgKGRvY3VtZW50TG9hZGVySW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZG9jdW1lbnRMb2FkZXJJbnN0YW5jZSA9IG5ldyBYU0xEb2N1bWVudExvYWRlcigpOwotCQl9Ci0JCXJldHVybiBkb2N1bWVudExvYWRlckluc3RhbmNlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJTW9kZWxMb2FkZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgWFNMTW9kZWxMb2FkZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBET01Nb2RlbEltcGwoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwcmVMb2FkQWRhcHQoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJc3VwZXIucHJlTG9hZEFkYXB0KHN0cnVjdHVyZWRNb2RlbCk7Ci0JCUlET01Nb2RlbCBkb21Nb2RlbCA9IChJRE9NTW9kZWwpIHN0cnVjdHVyZWRNb2RlbDsKLQkJLy8gaWYgdGhlcmUgaXMgYSBtb2RlbCBpbiB0aGUgYWRhcHRlciwgdGhpcyB3aWxsIGFkYXB0IGl0IHRvCi0JCS8vIGZpcnN0IG5vZGUuIEFmdGVyIHRoYXQgdGhlIFByb3BhZ2F0aW5nQWRhdGVyIHNwcmVhZHMgb3ZlciB0aGUKLQkJLy8gY2hpbGRyZW4gYmVpbmcKLQkJLy8gY3JlYXRlZC4gRWFjaCB0aW1lIHRoYXQgaGFwcGVuZHMsIGEgc2lkZSBlZmZlY3QgaXMgdG8KLQkJLy8gYWxzbyAic3ByZWFkIiBzcHJlY2lmaWMgcmVnaXN0ZXJlZCBhZGFwdGVycywKLQkJLy8gdGhleSB0d28gY2FuIHByb3BpZ2F0ZSBpcyBuZWVkZWQuCi0JCSgoSU5vZGVOb3RpZmllcikgZG9tTW9kZWwuZ2V0RG9jdW1lbnQoKSkuZ2V0QWRhcHRlckZvcihQcm9wYWdhdGluZ0FkYXB0ZXIuY2xhc3MpOwotCi0JCWlmIChEZWJ1Zy5kZWJ1Z05vdGlmaWNhdGlvbkFuZEV2ZW50cykgewotCQkJUHJvcGFnYXRpbmdBZGFwdGVyIHByb3BhZ2F0aW5nQWRhcHRlciA9IChQcm9wYWdhdGluZ0FkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgZG9tTW9kZWwuZ2V0RG9jdW1lbnQoKSkuZ2V0QWRhcHRlckZvcihQcm9wYWdhdGluZ0FkYXB0ZXIuY2xhc3MpOwotCQkJcHJvcGFnYXRpbmdBZGFwdGVyLmFkZEFkYXB0T25DcmVhdGVGYWN0b3J5KG5ldyBEZWJ1Z0FkYXB0ZXJGYWN0b3J5KCkpOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyY19zc2Uvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL3BhcnNlci9YU0xTb3VyY2VQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyY19zc2Uvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL3BhcnNlci9YU0xTb3VyY2VQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjljYWEyZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmNfc3NlL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC9wYXJzZXIvWFNMU291cmNlUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERhdmlkIENhcnZlciAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkJsb2NrVG9rZW5pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIuWE1MU291cmNlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBYU0xTb3VyY2VQYXJzZXIgZXh0ZW5kcyBYTUxTb3VyY2VQYXJzZXIgewotCi0KLQlwdWJsaWMgWFNMU291cmNlUGFyc2VyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVnaW9uUGFyc2VyIG5ld0luc3RhbmNlKCkgewotCQlYU0xTb3VyY2VQYXJzZXIgbmV3SW5zdGFuY2UgPSBuZXcgWFNMU291cmNlUGFyc2VyKCk7Ci0JCW5ld0luc3RhbmNlLnNldFRva2VuaXplcihnZXRUb2tlbml6ZXIoKS5uZXdJbnN0YW5jZSgpKTsKLQkJcmV0dXJuIG5ld0luc3RhbmNlOwotCX0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRUb2tlbml6ZXIoQmxvY2tUb2tlbml6ZXIgbmV3VG9rZW5pemVyKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJc3VwZXIuc2V0VG9rZW5pemVyKG5ld1Rva2VuaXplcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcnNlTm9kZXMoKSB7Ci0JCS8vIHJlZ2lvbnMgYXJlIGluaXRpYWxseSByZXBvcnRlZCBhcyBjb21wbGV0ZSBvZmZzZXRzIHdpdGhpbiB0aGUKLQkJLy8gc2Nhbm5lZCBpbnB1dAotCQkvLyB0aGV5IGFyZSBhZGp1c3RlZCBoZXJlIHRvIGJlIGluZGV4ZXMgZnJvbSB0aGUgY3VycmVudE5vZGUncyBzdGFydAotCQkvLyBvZmZzZXQKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBoZWFkTm9kZSA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdE5vZGUgPSBudWxsOwotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnROb2RlID0gbnVsbDsKLQkJU3RyaW5nIHR5cGUgPSBudWxsOwotCi0JCXdoaWxlICgocmVnaW9uID0gZ2V0TmV4dFJlZ2lvbigpKSAhPSBudWxsKSB7Ci0JCQl0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCS8vIHRoZXNlIHR5cGVzIChtaWdodCkgZGVtYW5kIGEgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmb3IgZWFjaAotCQkJLy8gb2YgdGhlbQotCQkJCi0JCQlpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQpIHsKLQkJCQlpZiAoY3VycmVudE5vZGUgIT0gbnVsbCAmJiBjdXJyZW50Tm9kZS5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCkgewotCQkJCQkvLyBtdWx0aXBsZSBibG9jayB0ZXh0cyBpbmRpY2F0ZWQgZW1iZWRkZWQgY29udGFpbmVyczsgbm8KLQkJCQkJLy8gbmV3IElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkJCQkJY3VycmVudE5vZGUuYWRkUmVnaW9uKHJlZ2lvbik7Ci0JCQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCQlyZWdpb24uYWRqdXN0U3RhcnQoLWN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCQkvLyBEVyA0LzE2LzIwMDMgcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCQkJCS8vIHJlZ2lvbi5zZXRQYXJlbnQoY3VycmVudE5vZGUpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gbm90IGNvbnRpbnVpbmcgYSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JCQkJCWlmIChjdXJyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQkJCQkvLyBlbnN1cmUgdGhhdCBhbnkgZXhpc3Rpbmcgbm9kZSBpcyBhdCBsZWFzdAotCQkJCQkJLy8gdGVybWluYXRlZAotCQkJCQkJaWYgKCFjdXJyZW50Tm9kZS5pc0VuZGVkKCkpIHsKLQkJCQkJCQljdXJyZW50Tm9kZS5zZXRMZW5ndGgocmVnaW9uLmdldFN0YXJ0KCkgLSBjdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkJCQkvLyBmQ3VycmVudE5vZGUuc2V0VGV4dExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSAtCi0JCQkJCQkJLy8gZkN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCQkJfQotCQkJCQkJbGFzdE5vZGUgPSBjdXJyZW50Tm9kZTsKLQkJCQkJfQotCQkJCQlmaXJlTm9kZVBhcnNlZChjdXJyZW50Tm9kZSk7Ci0JCQkJCWN1cnJlbnROb2RlID0gY3JlYXRlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHR5cGUpOwotCQkJCQlpZiAobGFzdE5vZGUgIT0gbnVsbCkgewotCQkJCQkJbGFzdE5vZGUuc2V0TmV4dChjdXJyZW50Tm9kZSk7Ci0JCQkJCX0KLQkJCQkJY3VycmVudE5vZGUuc2V0UHJldmlvdXMobGFzdE5vZGUpOwotCQkJCQljdXJyZW50Tm9kZS5zZXRTdGFydChyZWdpb24uZ2V0U3RhcnQoKSk7Ci0JCQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCQljdXJyZW50Tm9kZS5zZXRFbmRlZCh0cnVlKTsKLQkJCQkJcmVnaW9uLmFkanVzdFN0YXJ0KC1jdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkJY3VycmVudE5vZGUuYWRkUmVnaW9uKHJlZ2lvbik7Ci0JCQkJCS8vIERXIDQvMTYvMjAwMyByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJCQkJLy8gcmVnaW9uLnNldFBhcmVudChjdXJyZW50Tm9kZSk7Ci0JCQkJfQotCQkJfQotCQkJLy8gdGhlIGZvbGxvd2luZyBjb250ZXh0cyBPUEVOIG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zCi0JCQllbHNlIGlmICgoY3VycmVudE5vZGUgIT0gbnVsbCAmJiBjdXJyZW50Tm9kZS5pc0VuZGVkKCkpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NIQVJfUkVGRVJFTkNFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTlRJVFlfUkVGRVJFTkNFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9QSV9PUEVOKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTikgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX09QRU4pIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX09QRU4pIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RFQ0xBUkFUSU9OX09QRU4pKSB7Ci0JCQkJaWYgKGN1cnJlbnROb2RlICE9IG51bGwpIHsKLQkJCQkJLy8gZW5zdXJlIHRoYXQgYW55IGV4aXN0aW5nIG5vZGUgaXMgYXQgbGVhc3QgdGVybWluYXRlZAotCQkJCQlpZiAoIWN1cnJlbnROb2RlLmlzRW5kZWQoKSkgewotCQkJCQkJY3VycmVudE5vZGUuc2V0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpIC0gY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJCQkvLyBmQ3VycmVudE5vZGUuc2V0VGV4dExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSAtCi0JCQkJCQkvLyBmQ3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJCX0KLQkJCQkJbGFzdE5vZGUgPSBjdXJyZW50Tm9kZTsKLQkJCQl9Ci0JCQkJZmlyZU5vZGVQYXJzZWQoY3VycmVudE5vZGUpOwotCQkJCWN1cnJlbnROb2RlID0gY3JlYXRlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHR5cGUpOwotCQkJCWlmIChsYXN0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJCWxhc3ROb2RlLnNldE5leHQoY3VycmVudE5vZGUpOwotCQkJCX0KLQkJCQljdXJyZW50Tm9kZS5zZXRQcmV2aW91cyhsYXN0Tm9kZSk7Ci0JCQkJY3VycmVudE5vZGUuc2V0U3RhcnQocmVnaW9uLmdldFN0YXJ0KCkpOwotCQkJCWN1cnJlbnROb2RlLmFkZFJlZ2lvbihyZWdpb24pOwotCQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCXJlZ2lvbi5hZGp1c3RTdGFydCgtY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJLy8gRFcgNC8xNi8yMDAzIHJlZ2lvbnMgbm8gbG9uZ2VyIGhhdmUgcGFyZW50cwotCQkJCS8vIHJlZ2lvbi5zZXRQYXJlbnQoY3VycmVudE5vZGUpOwotCQkJfQotCQkJLy8gdGhlIGZvbGxvd2luZyBjb250ZXh0cyBuZWl0aGVyIG9wZW4gbm9yIGNsb3NlCi0JCQkvLyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zOyBqdXN0IGFkZCB0byB0aGVtCi0JCQllbHNlIGlmICgodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUykgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9URVhUKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9QSV9DT05URU5UKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0lOVEVSTkFMX1NVQlNFVCkpIHsKLQkJCQljdXJyZW50Tm9kZS5hZGRSZWdpb24ocmVnaW9uKTsKLQkJCQljdXJyZW50Tm9kZS5zZXRMZW5ndGgocmVnaW9uLmdldFN0YXJ0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkgLSBjdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQlyZWdpb24uYWRqdXN0U3RhcnQoLWN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCS8vIERXIDQvMTYvMjAwMyByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJCQkvLyByZWdpb24uc2V0UGFyZW50KGN1cnJlbnROb2RlKTsKLQkJCX0KLQkJCS8vIHRoZSBmb2xsb3dpbmcgY29udGV4dHMgY2xvc2Ugb2ZmIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMKLQkJCS8vIGNsZWFubHkKLQkJCWVsc2UgaWYgKCh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX0NMT1NFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9DTE9TRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfREVDTEFSQVRJT05fQ0xPU0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX0NMT1NFKSkgewotCQkJCWN1cnJlbnROb2RlLnNldEVuZGVkKHRydWUpOwotCQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCWN1cnJlbnROb2RlLmFkZFJlZ2lvbihyZWdpb24pOwotCQkJCXJlZ2lvbi5hZGp1c3RTdGFydCgtY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJLy8gRFcgNC8xNi8yMDAzIHJlZ2lvbnMgbm8gbG9uZ2VyIGhhdmUgcGFyZW50cwotCQkJCS8vIHJlZ2lvbi5zZXRQYXJlbnQoY3VycmVudE5vZGUpOwotCQkJfQotCQkJLy8gdGhpcyBpcyBleHRyZW1lbHkgcmFyZSwgYnV0IHZhbGlkCi0JCQllbHNlIGlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuV0hJVEVfU1BBQ0UpIHsKLQkJCQlJVGV4dFJlZ2lvbiBsYXN0UmVnaW9uID0gY3VycmVudE5vZGUuZ2V0TGFzdFJlZ2lvbigpOwotCQkJCS8vIHBhY2sgdGhlIGVtYmVkZGVkIGNvbnRhaW5lciB3aXRoIHRoaXMgcmVnaW9uCi0JCQkJaWYgKGxhc3RSZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCQlJVGV4dFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoSVRleHRSZWdpb25Db250YWluZXIpIGxhc3RSZWdpb247Ci0JCQkJCWNvbnRhaW5lci5nZXRSZWdpb25zKCkuYWRkKHJlZ2lvbik7Ci0JCQkJCS8vIGNvbnRhaW5lcnMgbXVzdCBoYXZlIHBhcmVudCBzZXQgLi4uCi0JCQkJCS8vIHNldHRpbmcgZm9yIEVBQ0ggc3VicmVnaW9uIGlzIHJlZHVuZGVudCwgYnV0IG5vdCBzdXJlCi0JCQkJCS8vIHdoZXJlIGVsc2UgdG8gZG8sIHNvIHdpbGwgZG8gaGVyZSBmb3Igbm93LgotCQkJCQljb250YWluZXIuc2V0UGFyZW50KGN1cnJlbnROb2RlKTsKLQkJCQkJLy8gRFcgNC8xNi8yMDAzIHJlZ2lvbnMgbm8gbG9uZ2VyIGhhdmUgcGFyZW50cwotCQkJCQkvLyByZWdpb24uc2V0UGFyZW50KGNvbnRhaW5lcik7Ci0JCQkJCXJlZ2lvbi5hZGp1c3RTdGFydChjb250YWluZXIuZ2V0TGVuZ3RoKCkgLSByZWdpb24uZ2V0U3RhcnQoKSk7Ci0JCQkJfQotCQkJCWN1cnJlbnROb2RlLmdldExhc3RSZWdpb24oKS5hZGp1c3RMZW5ndGgocmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCQljdXJyZW50Tm9kZS5hZGp1c3RMZW5ndGgocmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5VTkRFRklORUQgJiYgY3VycmVudE5vZGUgIT0gbnVsbCkgewotCQkJCS8vIHNraXAgb24gYSB2ZXJ5LWZpcnN0IHJlZ2lvbiBzaXR1YXRpb24gYXMgdGhlIGRlZmF1bHQKLQkJCQkvLyBiZWhhdmlvciBpcyBnb29kIGVub3VnaAotCQkJCS8vIGNvbWJpbmUgd2l0aCBwcmV2aW91cyBpZiBhbHNvIHVuZGVmaW5lZAotCQkJCWlmIChjdXJyZW50Tm9kZS5nZXRMYXN0UmVnaW9uKCkgIT0gbnVsbCAmJiBjdXJyZW50Tm9kZS5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuVU5ERUZJTkVEKSB7Ci0JCQkJCWN1cnJlbnROb2RlLmdldExhc3RSZWdpb24oKS5hZGp1c3RMZW5ndGgocmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCQkJY3VycmVudE5vZGUuYWRqdXN0TGVuZ3RoKHJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJfQotCQkJCS8vIHByZXZpb3VzIHdhc24ndCB1bmRlZmluZWQKLQkJCQllbHNlIHsKLQkJCQkJY3VycmVudE5vZGUuYWRkUmVnaW9uKHJlZ2lvbik7Ci0JCQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCQlyZWdpb24uYWRqdXN0U3RhcnQoLWN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGlmIGFuIHVua25vd24gdHlwZSBpcyB0aGUgZmlyc3QgcmVnaW9uIGluIHRoZSBkb2N1bWVudCwKLQkJCQkvLyBlbnN1cmUgdGhhdCBhIG5vZGUgZXhpc3RzCi0JCQkJaWYgKGN1cnJlbnROb2RlID09IG51bGwpIHsKLQkJCQkJY3VycmVudE5vZGUgPSBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24odHlwZSk7Ci0JCQkJCWN1cnJlbnROb2RlLnNldFN0YXJ0KHJlZ2lvbi5nZXRTdGFydCgpKTsKLQkJCQl9Ci0JCQkJY3VycmVudE5vZGUuYWRkUmVnaW9uKHJlZ2lvbik7Ci0JCQkJY3VycmVudE5vZGUuc2V0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpICsgcmVnaW9uLmdldExlbmd0aCgpIC0gY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJcmVnaW9uLmFkanVzdFN0YXJ0KC1jdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkvLyBEVyA0LzE2LzIwMDMgcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCQkJLy8gcmVnaW9uLnNldFBhcmVudChjdXJyZW50Tm9kZSk7Ci0JCQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZvdW5kIHJlZ2lvbiBvZiBub3Qgc3BlY2lmaWNhbGx5IGhhbmRsZWQgdHlwZSAiICsgcmVnaW9uLmdldFR5cGUoKSArICIgQCAiICsgcmVnaW9uLmdldFN0YXJ0KCkgKyAiWyIgKyByZWdpb24uZ2V0TGVuZ3RoKCkgKyAiXSIpOyAvLyROT04tTkxTLTQkLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCS8vIHRoZXNlIHJlZ2lvbnMgYWxzbyBnZXQgdGhlaXIgb3duIG5vZGUsIHNvIGNsb3NlIHRoZW0gY2xlYW5seQotCQkJLy8gTk9URTogdGhlc2UgcmVnaW9ucyBoYXZlIG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zIGNyZWF0ZWQKLQkJCS8vIGZvciB0aGVtIGFib3ZlOyBpdCBtYXkKLQkJCS8vIGJlIG1vcmUgcmVhZGFibGUgaWYgdGhhdCBpcyBoYW5kbGVkIGhlcmUgYXMgd2VsbCwgYnV0IHRoZQotCQkJLy8gY3VycmVudCBsYXlvdXQKLQkJCS8vIGVuc3VyZXMgdGhhdCB0aGV5IG9wZW4gU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyB0aGUgc2FtZSB3YXkKLQkJCWlmICgodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DSEFSX1JFRkVSRU5DRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5USVRZX1JFRkVSRU5DRSkpIHsKLQkJCQljdXJyZW50Tm9kZS5zZXRFbmRlZCh0cnVlKTsKLQkJCX0KLQkJCWlmIChoZWFkTm9kZSA9PSBudWxsICYmIGN1cnJlbnROb2RlICE9IG51bGwpIHsKLQkJCQloZWFkTm9kZSA9IGN1cnJlbnROb2RlOwotCQkJfQotCQl9Ci0JCWlmIChjdXJyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQlmaXJlTm9kZVBhcnNlZChjdXJyZW50Tm9kZSk7Ci0JCQljdXJyZW50Tm9kZS5zZXRQcmV2aW91cyhsYXN0Tm9kZSk7Ci0JCX0KLQkJLy8gZlN0cmluZ0lucHV0ID0gbnVsbDsKLQkJcHJpbVJlc2V0KCk7Ci0JCXJldHVybiBoZWFkTm9kZTsKLQl9Ci0JCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyY19zc2Uvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1hQYXRoU2VwYXJhdG9yUmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmNfc3NlL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9YUGF0aFNlcGFyYXRvclJlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZDU2M2NmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyY19zc2Uvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1hQYXRoU2VwYXJhdG9yUmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRGF2aWQgQ2FydmVyIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLnBhcnNlci5yZWdpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9ucy5SZWdpb25Ub1N0cmluZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotCi0KLXB1YmxpYyBjbGFzcyBYUGF0aFNlcGFyYXRvclJlZ2lvbiBpbXBsZW1lbnRzIElUZXh0UmVnaW9uIHsKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBieXRlIGZUZXh0TGVuZ3RoID0gMTsKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZlR5cGUgPSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsKLQlwcml2YXRlIHNob3J0IGZMZW5ndGg7Ci0JcHJpdmF0ZSBpbnQgZlN0YXJ0OwotCi0KLQlwdWJsaWMgWFBhdGhTZXBhcmF0b3JSZWdpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFhQYXRoU2VwYXJhdG9yUmVnaW9uKGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgpIHsKLQkJdGhpcygpOwotCQlmU3RhcnQgPSBzdGFydDsKLQkJZkxlbmd0aCA9IChzaG9ydCkgbGVuZ3RoOwotCX0KLQotCi0JcHVibGljIHZvaWQgYWRqdXN0TGVuZ3RoKGludCBpKSB7Ci0JCWZMZW5ndGggKz0gaTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFN0YXJ0KGludCBpKSB7Ci0JCWZTdGFydCArPSBpOwotCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0VGV4dExlbmd0aChpbnQgaSkgewotCQkvLyBub3Qgc3VwcG9ydGVkCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBlcXVhdGVQb3NpdGlvbnMoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWZTdGFydCA9IHJlZ2lvbi5nZXRTdGFydCgpOwotCQlmTGVuZ3RoID0gKHNob3J0KSByZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0YXJ0KCkgewotCQlyZXR1cm4gZlN0YXJ0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZUZXh0TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dExlbmd0aCgpIHsKLQkJcmV0dXJuIGZUZXh0TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGZUeXBlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBSZWdpb25Ub1N0cmluZ1V0aWwudG9TdHJpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHVwZGF0ZVJlZ2lvbihPYmplY3QgcmVxdWVzdGVyLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudCwgU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJLy8gY2FuIG5ldmVyIGJlIHVwZGF0ZWQKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjX3NzZS9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwvcmVnaW9ucy9YUGF0aFJlZ2lvbkNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyY19zc2Uvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL3JlZ2lvbnMvWFBhdGhSZWdpb25Db250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY0NmRiOGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjX3NzZS9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwvcmVnaW9ucy9YUGF0aFJlZ2lvbkNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwucmVnaW9uczsKLQotcHVibGljIGludGVyZmFjZSBYUGF0aFJlZ2lvbkNvbnRleHQgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkxPQ0tfVEVYVCA9ICJCTE9DS19URVhUIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5ERUZJTkVEID0gIlVOREVGSU5FRCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdISVRFX1NQQUNFID0gIldISVRFX1NQQUNFIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFBBVEhfQ09OVEVOVCA9ICJYUEFUSF9DT05URU5UIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhQQVRIX1NFUEFSQVRPUl9ESVYgPSAiWFBBVEhfU0VQQVJBVE9SX0RJViI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYUEFUSF9GVU5DVElPTl9QQVJBTUVURVJTX09QRU4gPSAiWFBBVEhfRlVOQ1RJT05fUEFSQU1FVEVSU19PUEVOIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhQQVRIX0ZVTkNUSU9OX1BBUkFNRVRFUlNfQ0xPU0UgPSAiWFBBVEhfRlVOQ1RJT05fUEFSQU1FVEVSU19DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYUEFUSF9GVU5DVElPTl9OQU1FID0gIlhQQVRIX0ZVTkNUSU9OX05BTUUiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmNfc3NlL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC9yZWdpb25zL1hTTFBhcnNlclJlZ2lvbkZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyY19zc2Uvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL3JlZ2lvbnMvWFNMUGFyc2VyUmVnaW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWMxMWRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyY19zc2Uvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL3JlZ2lvbnMvWFNMUGFyc2VyUmVnaW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERhdmlkIENhcnZlciAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLnJlZ2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnMuWE1MUGFyc2VyUmVnaW9uRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFhTTFBhcnNlclJlZ2lvbkZhY3RvcnkgZXh0ZW5kcyBYTUxQYXJzZXJSZWdpb25GYWN0b3J5IHsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjX3NzZS9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwvdGV4dC9JWFNMUGFydGl0aW9ucy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjX3NzZS9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwvdGV4dC9JWFNMUGFydGl0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0OGIxYzQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyY19zc2Uvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL3RleHQvSVhTTFBhcnRpdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotCi0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkLgotICogSXQgZGVmaW5lcyB0aGUgcGFydGl0aW9uIHR5cGVzIGZvciBYU0wuCi0gKiBDbGllbnRzIHNob3VsZCByZWZlcmVuY2UgdGhlIHBhcnRpdGlvbiB0eXBlIFN0cmluZ3MgZGVmaW5lZCBoZXJlIGRpcmVjdGx5LgotICogCi0gKiBAc2luY2UgMC41TTcKLSAqLwotcHVibGljIGludGVyZmFjZSBJWFNMUGFydGl0aW9ucyB7Ci0JCi0JU3RyaW5nIFhTTF9YUEFUSCA9ICJvcmcuZWNsaXBzZS53c3QueHNsLlhTTF9YUEFUSCI7IC8vJE5PTi1OTFMtMSQKLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyY19zc2Uvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL3RleHQvcnVsZXMvU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhTTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjX3NzZS9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwvdGV4dC9ydWxlcy9TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yWFNMLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUyZDY4OTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjX3NzZS9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwvdGV4dC9ydWxlcy9TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yWFNMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRGF2aWQgQ2FydmVyIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLnRleHQucnVsZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnRleHQucnVsZXMuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUudGV4dC5JWE1MUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwudGV4dC5JWFNMUGFydGl0aW9uczsKLQotLyoqCi0gKiBDb250YWlucyBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byBzZXR0aW5nIHVwIFN0cnVjdHVyZWQgRG9jdW1lbnQgUGFydGlvbnMgCi0gKiBpbiBYU0wgZG9jdW1lbnRzLiAKLSAqIEBhdXRob3IgZGNhcnZlcgotICoKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYU0wgZXh0ZW5kcyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yWE1MIGltcGxlbWVudHMgSVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIgewotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nW10gY29uZmlndXJlZENvbnRlbnRUeXBlcyA9IG5ldyBTdHJpbmdbXXtJWE1MUGFydGl0aW9ucy5YTUxfREVGQVVMVCwgSVhNTFBhcnRpdGlvbnMuWE1MX0NEQVRBLCBJWE1MUGFydGl0aW9ucy5YTUxfUEksIElYTUxQYXJ0aXRpb25zLlhNTF9ERUNMQVJBVElPTiwgSVhNTFBhcnRpdGlvbnMuWE1MX0NPTU1FTlQsIElYTUxQYXJ0aXRpb25zLkRURF9TVUJTRVQsIElYU0xQYXJ0aXRpb25zLlhTTF9YUEFUSH07Ci0KLQkvKioKLQkgKiBUaGUgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhTTCBhZGRzIHRoZSBuZWNlc3NhcnkKLQkgKiBQYXJ0aXRpb24gdHlwZXMgdG8gaGVscCBJZGVudGlmeSBwb3RlbnRpYWwgWFBhdGggYXJlYXMuCi0JICogVGhpcyBpcyBhbHNvIHVzZWQgZm9yIExpbmUgU3R5bGluZyBhbmQgQ29udGVudCBBc3Npc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yWFNMKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZShJVGV4dFJlZ2lvbiByZWdpb24sIGludCBvZmZzZXQpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQkJcmVzdWx0ID0gSVhTTFBhcnRpdGlvbnMuWFNMX1hQQVRIOwotCQl9IGVsc2UgewotCQkJcmVzdWx0ID0gc3VwZXIuZ2V0UGFydGl0aW9uVHlwZShyZWdpb24sIG9mZnNldCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKCkgewotCQlyZXR1cm4gY29uZmlndXJlZENvbnRlbnRUeXBlcy5jbG9uZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSURvY3VtZW50UGFydGl0aW9uZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYTUwgaW5zdGFuY2UgPSBuZXcgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTCgpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCQotCi0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS94c2x0LXNjaGVtYXMveGluY2x1ZGUueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUveHNsdC1zY2hlbWFzL3hpbmNsdWRlLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIxY2IzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS94c2x0LXNjaGVtYXMveGluY2x1ZGUueHNkCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBXM0PCriBTT0ZUV0FSRSBOT1RJQ0UgQU5EIExJQ0VOU0UKLSAqIGh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvY29weXJpZ2h0LXNvZnR3YXJlLTE5OTgwNzIwCi0gKgotICogQ29weXJpZ2h0IMKpIDE5OTQtMjAwMiBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtLCAoTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YKLSAqIFRlY2hub2xvZ3ksIEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgZW4gQXV0b21hdGlxdWUsCi0gKiBLZWlvIFVuaXZlcnNpdHkpLiBBbGwgUmlnaHRzIFJlc2VydmVkLiBodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsLwotICoKLSAqIFRoaXMgVzNDIHdvcmsgKGluY2x1ZGluZyBzb2Z0d2FyZSwgZG9jdW1lbnRzLCBvciBvdGhlciByZWxhdGVkIGl0ZW1zKSBpcyBiZWluZwotICogcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIHVuZGVyIHRoZSBmb2xsb3dpbmcgbGljZW5zZS4gQnkgb2J0YWluaW5nLAotICogdXNpbmcgYW5kL29yIGNvcHlpbmcgdGhpcyB3b3JrLCB5b3UgKHRoZSBsaWNlbnNlZSkgYWdyZWUgdGhhdCB5b3UgaGF2ZSByZWFkLAotICogdW5kZXJzdG9vZCwgYW5kIHdpbGwgY29tcGx5IHdpdGggdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9uczoKLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKLSAqIGRvY3VtZW50YXRpb24sIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sICBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlCi0gKiBvciByb3lhbHR5IGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHlvdSBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgb24gQUxMIGNvcGllcwotICogb2YgdGhlIHNvZnR3YXJlIGFuZCBkb2N1bWVudGF0aW9uIG9yIHBvcnRpb25zIHRoZXJlb2YsIGluY2x1ZGluZyBtb2RpZmljYXRpb25zLCB0aGF0Ci0gKiB5b3UgbWFrZToKLSAqCi0gKiAgMS4gVGhlIGZ1bGwgdGV4dCBvZiB0aGlzIE5PVElDRSBpbiBhIGxvY2F0aW9uIHZpZXdhYmxlIHRvIHVzZXJzIG9mIHRoZSByZWRpc3RyaWJ1dGVkCi0gKiAgICAgb3IgZGVyaXZhdGl2ZSB3b3JrLgotICogIDIuIEFueSBwcmUtZXhpc3RpbmcgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGRpc2NsYWltZXJzLCBub3RpY2VzLCBvciB0ZXJtcyBhbmQKLSAqICAgICBjb25kaXRpb25zLiBJZiBub25lIGV4aXN0LCBhIHNob3J0IG5vdGljZSBvZiB0aGUgZm9sbG93aW5nIGZvcm0gKGh5cGVydGV4dCBpcyBwcmVmZXJyZWQsIHRleHQgaXMgcGVybWl0dGVkKSBzaG91bGQgYmUgdXNlZCB3aXRoaW4gdGhlIGJvZHkgb2YgYW55IHJlZGlzdHJpYnV0ZWQgb3IgZGVyaXZhdGl2ZSBjb2RlOiAiQ29weXJpZ2h0IMKpIFskZGF0ZS1vZi1zb2Z0d2FyZV0gV29ybGQgV2lkZSBXZWIgQ29uc29ydGl1bSwgKE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgZW4gQXV0b21hdGlxdWUsIEtlaW8gVW5pdmVyc2l0eSkuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIGh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvIgotICogIDMuIE5vdGljZSBvZiBhbnkgY2hhbmdlcyBvciBtb2RpZmljYXRpb25zIHRvIHRoZSBXM0MgZmlsZXMsIGluY2x1ZGluZyB0aGUgZGF0ZSBjaGFuZ2VzCi0gKiAgICAgd2VyZSBtYWRlLiAoV2UgcmVjb21tZW5kIHlvdSBwcm92aWRlIFVSSXMgdG8gdGhlIGxvY2F0aW9uIGZyb20gd2hpY2ggdGhlIGNvZGUgaXMKLSAqICAgICBkZXJpdmVkLikKLSAqCi0gKiBUSElTIFNPRlRXQVJFIEFORCBET0NVTUVOVEFUSU9OIElTIFBST1ZJREVEICJBUyBJUywiIEFORCBDT1BZUklHSFQgSE9MREVSUyBNQUtFIE5PIAotICogUkVQUkVTRU5UQVRJT05TIE9SIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTywgCi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBTlkgUEFSVElDVUxBUiBQVVJQT1NFIE9SIFRIQVQgVEhFIFVTRSBPRgotICogVEhFIFNPRlRXQVJFIE9SIERPQ1VNRU5UQVRJT04gV0lMTCBOT1QgSU5GUklOR0UgQU5ZIFRISVJEIFBBUlRZIFBBVEVOVFMsIENPUFlSSUdIVFMsCi0gKiBUUkFERU1BUktTIE9SIE9USEVSIFJJR0hUUy4KLSAqCi0gKiBDT1BZUklHSFQgSE9MREVSUyBXSUxMIE5PVCBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBTUEVDSUFMIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgQU5ZIFVTRSBPRiBUSEUgU09GVFdBUkUgT1IgRE9DVU1FTlRBVElPTi4KLSAqCi0gKiBUaGUgbmFtZSBhbmQgdHJhZGVtYXJrcyBvZiBjb3B5cmlnaHQgaG9sZGVycyBtYXkgTk9UIGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5Ci0gKiBwZXJ0YWluaW5nIHRvIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uIFRpdGxlIHRvIGNvcHlyaWdodAotICogaW4gdGhpcyBzb2Z0d2FyZSBhbmQgYW55IGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiB3aWxsIGF0IGFsbCB0aW1lcyByZW1haW4gd2l0aCBjb3B5cmlnaHQKLSAqIGhvbGRlcnMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gLS0+Ci08eHM6c2NoZW1hIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICAgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiCi0gICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIKLSAgICAgICAgICAgZmluYWxEZWZhdWx0PSJleHRlbnNpb24iPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImluY2x1ZGUiIHR5cGU9InhpOmluY2x1ZGVUeXBlIiAvPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJpbmNsdWRlVHlwZSIgbWl4ZWQ9InRydWUiPgotICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPScwJyBtYXhPY2N1cnM9J3VuYm91bmRlZCcgPgotICAgICAgPHhzOmVsZW1lbnQgcmVmPSd4aTpmYWxsYmFjaycgLz4KLSAgICAgIDx4czphbnkgbmFtZXNwYWNlPScjI290aGVyJyBwcm9jZXNzQ29udGVudHM9J2xheCcgLz4KLSAgICAgIDx4czphbnkgbmFtZXNwYWNlPScjI2xvY2FsJyBwcm9jZXNzQ29udGVudHM9J2xheCcgLz4KLSAgICA8L3hzOmNob2ljZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImhyZWYiIHVzZT0ib3B0aW9uYWwiIHR5cGU9InhzOmFueVVSSSIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icGFyc2UiIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9InhtbCIKLSAgICAgICAgICAgICAgICAgIHR5cGU9InhpOnBhcnNlVHlwZSIgLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Inhwb2ludGVyIiB1c2U9Im9wdGlvbmFsIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImVuY29kaW5nIiB1c2U9Im9wdGlvbmFsIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImFjY2VwdCIgdXNlPSJvcHRpb25hbCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJhY2NlcHQtbGFuZ3VhZ2UiIHVzZT0ib3B0aW9uYWwiIHR5cGU9InhzOnN0cmluZyIvPgotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9InBhcnNlVHlwZSI+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLSAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ieG1sIi8+Ci0gICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InRleHQiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0gIAotICA8eHM6ZWxlbWVudCBuYW1lPSJmYWxsYmFjayIgdHlwZT0ieGk6ZmFsbGJhY2tUeXBlIiAvPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJmYWxsYmFja1R5cGUiIG1peGVkPSJ0cnVlIj4KLSAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4aTppbmNsdWRlIi8+Ci0gICAgICA8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgICAgIDx4czphbnkgbmFtZXNwYWNlPSIjI2xvY2FsIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgIDwveHM6Y2hvaWNlPgotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgLz4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS94c2x0LXNjaGVtYXMveHNsdC0xLjAueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUveHNsdC1zY2hlbWFzL3hzbHQtMS4wLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkyMjQ1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS94c2x0LXNjaGVtYXMveHNsdC0xLjAueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTcwOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgLSBXM0MsIFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCwKLSAqIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSAyMDA3MTIyOCAtIFNUQVIgLSBVcGRhdGVkIHRvIFhNTCBTY2hlbWFzIDIwMDEgMS4wCi0gKiAgICAgICAgIE5vdGUgdGhpcyBzY2hlbWFzIGlzIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGZvciBYU0xUIDIuMCwgaXQgaGFzCi0gKiAgICAgICAgIGJlZW4gc3RyaXBwZWQgb2YgYWxsIFhTTFQgMi4wIGFkZGl0aW9ucywgdG8gYnJpbmcgaXQgaW4gbGluZSB3aXRoIHRoZSBYU0xUIDEuMAotICogICAgICAgICBzcGVjaWZpY2F0aW9uLgotICogICAgICAgICBUaGUgb3JpZ2luYWwgdmVyc2lvbiBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3d3dy53My5vcmcvMjAwNy9zY2hlbWEtZm9yLXhzbHQyMC54c2QKLSAqICAgICAgICAgVGhlIG9yaWdpbmFsIFczQyBjb3B5cmlnaHQgbm90aWNlIGlzIGluY2x1ZGVkOgotICogICAgIERhdmlkIENhcnZlciAtIDIwMDgwMzMwIC0gU1RBUiAtIGJ1ZyAyMjQ4MTkgLSBjaGFuZ2VkIHByb2Nlc0NvbnRlbnRzIGZyb20gbGF4IHRvIHNraXAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVzNDwq4gU09GVFdBUkUgTk9USUNFIEFORCBMSUNFTlNFCi0gKiBodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsL2NvcHlyaWdodC1zb2Z0d2FyZS0xOTk4MDcyMAotICoKLSAqIENvcHlyaWdodCDCqSAxOTk0LTIwMDIgV29ybGQgV2lkZSBXZWIgQ29uc29ydGl1bSwgKE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mCi0gKiBUZWNobm9sb2d5LCBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0IGVuIEF1dG9tYXRpcXVlLAotICogS2VpbyBVbml2ZXJzaXR5KS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC8KLSAqCi0gKiBUaGlzIFczQyB3b3JrIChpbmNsdWRpbmcgc29mdHdhcmUsIGRvY3VtZW50cywgb3Igb3RoZXIgcmVsYXRlZCBpdGVtcykgaXMgYmVpbmcKLSAqIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyB1bmRlciB0aGUgZm9sbG93aW5nIGxpY2Vuc2UuIEJ5IG9idGFpbmluZywKLSAqIHVzaW5nIGFuZC9vciBjb3B5aW5nIHRoaXMgd29yaywgeW91ICh0aGUgbGljZW5zZWUpIGFncmVlIHRoYXQgeW91IGhhdmUgcmVhZCwKLSAqIHVuZGVyc3Rvb2QsIGFuZCB3aWxsIGNvbXBseSB3aXRoIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnM6Ci0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCi0gKiBkb2N1bWVudGF0aW9uLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCAgZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZQotICogb3Igcm95YWx0eSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB5b3UgaW5jbHVkZSB0aGUgZm9sbG93aW5nIG9uIEFMTCBjb3BpZXMKLSAqIG9mIHRoZSBzb2Z0d2FyZSBhbmQgZG9jdW1lbnRhdGlvbiBvciBwb3J0aW9ucyB0aGVyZW9mLCBpbmNsdWRpbmcgbW9kaWZpY2F0aW9ucywgdGhhdAotICogeW91IG1ha2U6Ci0gKgotICogIDEuIFRoZSBmdWxsIHRleHQgb2YgdGhpcyBOT1RJQ0UgaW4gYSBsb2NhdGlvbiB2aWV3YWJsZSB0byB1c2VycyBvZiB0aGUgcmVkaXN0cmlidXRlZAotICogICAgIG9yIGRlcml2YXRpdmUgd29yay4KLSAqICAyLiBBbnkgcHJlLWV4aXN0aW5nIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBkaXNjbGFpbWVycywgbm90aWNlcywgb3IgdGVybXMgYW5kCi0gKiAgICAgY29uZGl0aW9ucy4gSWYgbm9uZSBleGlzdCwgYSBzaG9ydCBub3RpY2Ugb2YgdGhlIGZvbGxvd2luZyBmb3JtIChoeXBlcnRleHQgaXMgcHJlZmVycmVkLCB0ZXh0IGlzIHBlcm1pdHRlZCkgc2hvdWxkIGJlIHVzZWQgd2l0aGluIHRoZSBib2R5IG9mIGFueSByZWRpc3RyaWJ1dGVkIG9yIGRlcml2YXRpdmUgY29kZTogIkNvcHlyaWdodCDCqSBbJGRhdGUtb2Ytc29mdHdhcmVdIFdvcmxkIFdpZGUgV2ViIENvbnNvcnRpdW0sIChNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0IGVuIEF1dG9tYXRpcXVlLCBLZWlvIFVuaXZlcnNpdHkpLiBBbGwgUmlnaHRzIFJlc2VydmVkLiBodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsLyIKLSAqICAzLiBOb3RpY2Ugb2YgYW55IGNoYW5nZXMgb3IgbW9kaWZpY2F0aW9ucyB0byB0aGUgVzNDIGZpbGVzLCBpbmNsdWRpbmcgdGhlIGRhdGUgY2hhbmdlcwotICogICAgIHdlcmUgbWFkZS4gKFdlIHJlY29tbWVuZCB5b3UgcHJvdmlkZSBVUklzIHRvIHRoZSBsb2NhdGlvbiBmcm9tIHdoaWNoIHRoZSBjb2RlIGlzCi0gKiAgICAgZGVyaXZlZC4pCi0gKgotICogVEhJUyBTT0ZUV0FSRSBBTkQgRE9DVU1FTlRBVElPTiBJUyBQUk9WSURFRCAiQVMgSVMsIiBBTkQgQ09QWVJJR0hUIEhPTERFUlMgTUFLRSBOTyAKLSAqIFJFUFJFU0VOVEFUSU9OUyBPUiBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8sIAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQU5ZIFBBUlRJQ1VMQVIgUFVSUE9TRSBPUiBUSEFUIFRIRSBVU0UgT0YKLSAqIFRIRSBTT0ZUV0FSRSBPUiBET0NVTUVOVEFUSU9OIFdJTEwgTk9UIElORlJJTkdFIEFOWSBUSElSRCBQQVJUWSBQQVRFTlRTLCBDT1BZUklHSFRTLAotICogVFJBREVNQVJLUyBPUiBPVEhFUiBSSUdIVFMuCi0gKgotICogQ09QWVJJR0hUIEhPTERFUlMgV0lMTCBOT1QgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgU1BFQ0lBTCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIEFOWSBVU0UgT0YgVEhFIFNPRlRXQVJFIE9SIERPQ1VNRU5UQVRJT04uCi0gKgotICogVGhlIG5hbWUgYW5kIHRyYWRlbWFya3Mgb2YgY29weXJpZ2h0IGhvbGRlcnMgbWF5IE5PVCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eQotICogcGVydGFpbmluZyB0byB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiBUaXRsZSB0byBjb3B5cmlnaHQKLSAqIGluIHRoaXMgc29mdHdhcmUgYW5kIGFueSBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gd2lsbCBhdCBhbGwgdGltZXMgcmVtYWluIHdpdGggY29weXJpZ2h0Ci0gKiBob2xkZXJzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotIC0tPgotPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiAKLSAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIAotICAgICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgPgotCi08IS0tICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgotPHhzOmFubm90YXRpb24+Ci0gIDx4czpkb2N1bWVudGF0aW9uPgotICAKLSAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLTwveHM6YW5ub3RhdGlvbj4gICAKLTwhLS0gKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+Ci0gCi08IS0tCi1UaGUgZGVjbGFyYXRpb24gb2YgeG1sOnNwYWNlIGFuZCB4bWw6bGFuZyBtYXkgbmVlZCB0byBiZSBjb21tZW50ZWQgb3V0IGJlY2F1c2UKLW9mIHByb2JsZW1zIHByb2Nlc3NpbmcgdGhlIHNjaGVtYSB1c2luZyB2YXJpb3VzIHRvb2xzCi0tLT4KLSAgICAgIAotPHhzOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIgCi0gIHNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QiLz4KLQotPCEtLSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KLTx4czphbm5vdGF0aW9uPgotICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICBQQVJUIEE6IGRlZmluaXRpb25zIG9mIGNvbXBsZXggdHlwZXMgYW5kIG1vZGVsIGdyb3VwcyB1c2VkIGFzIHRoZSBiYXNpcyAKLSAgICAgICAgICAgIGZvciBlbGVtZW50IGRlZmluaXRpb25zCi0gIDwveHM6ZG9jdW1lbnRhdGlvbj4KLTwveHM6YW5ub3RhdGlvbj4gICAKLTwhLS0gKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+Ci0KLTx4czpjb21wbGV4VHlwZSBuYW1lPSJnZW5lcmljLWVsZW1lbnQtdHlwZSIgbWl4ZWQ9InRydWUiPgotICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJza2lwIi8+Ci08L3hzOmNvbXBsZXhUeXBlPgotCi08IS0tIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ2ZXJzaW9uZWQtZWxlbWVudC10eXBlIiBtaXhlZD0idHJ1ZSI+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDpnZW5lcmljLWVsZW1lbnQtdHlwZSI+ICAgIAotICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJ4czpkZWNpbWFsIiB1c2U9Im9wdGlvbmFsIi8+Ci0KLSAgICA8L3hzOmV4dGVuc2lvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLTwveHM6Y29tcGxleFR5cGU+Ci0tLT4KLQotPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImVsZW1lbnQtb25seS12ZXJzaW9uZWQtZWxlbWVudC10eXBlIiBtaXhlZD0iZmFsc2UiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzbDpnZW5lcmljLWVsZW1lbnQtdHlwZSI+Ci0gICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJza2lwIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLQotPC94czpjb21wbGV4VHlwZT4KLQotPHhzOmNvbXBsZXhUeXBlIG5hbWU9InNlcXVlbmNlLWNvbnN0cnVjdG9yIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50IG1peGVkPSJ0cnVlIj4KLSAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDpnZW5lcmljLWVsZW1lbnQtdHlwZSI+ICAgIAotICAgICAgPHhzOmdyb3VwIHJlZj0ieHNsOnNlcXVlbmNlLWNvbnN0cnVjdG9yLWdyb3VwIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94czpleHRlbnNpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci08L3hzOmNvbXBsZXhUeXBlPgotCi08eHM6Z3JvdXAgbmFtZT0ic2VxdWVuY2UtY29uc3RydWN0b3ItZ3JvdXAiPgotICA8eHM6Y2hvaWNlPgotCi0gICAgPHhzOmVsZW1lbnQgcmVmPSJ4c2w6dmFyaWFibGUiLz4KLSAgICA8eHM6ZWxlbWVudCByZWY9InhzbDppbnN0cnVjdGlvbiIvPgotICAgIDx4czpncm91cCByZWY9InhzbDpyZXN1bHQtZWxlbWVudHMiLz4KLSAgPC94czpjaG9pY2U+Ci08L3hzOmdyb3VwPgotCi08eHM6ZWxlbWVudCBuYW1lPSJkZWNsYXJhdGlvbiIgdHlwZT0ieHNsOmdlbmVyaWMtZWxlbWVudC10eXBlIiBhYnN0cmFjdD0idHJ1ZSIvPgotCi08eHM6ZWxlbWVudCBuYW1lPSJpbnN0cnVjdGlvbiIgdHlwZT0ieHNsOmdlbmVyaWMtZWxlbWVudC10eXBlIiBhYnN0cmFjdD0idHJ1ZSIvPgotCi08IS0tICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgotPHhzOmFubm90YXRpb24+Ci0gIDx4czpkb2N1bWVudGF0aW9uPgotCi0gICAgUEFSVCBCOiBkZWZpbml0aW9ucyBvZiBpbmRpdmlkdWFsIFhTTFQgZWxlbWVudHMgICAgCi0gICAgRWxlbWVudHMgYXJlIGxpc3RlZCBpbiBhbHBoYWJldGljYWwgb3JkZXIuICAgIAotICA8L3hzOmRvY3VtZW50YXRpb24+Ci08L3hzOmFubm90YXRpb24+ICAgCi08IS0tICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgotCi08eHM6ZWxlbWVudCBuYW1lPSJhcHBseS1pbXBvcnRzIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmluc3RydWN0aW9uIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgIFRoaXMgY29tbWFuZCBhcHBsaWVzIHRlbXBsYXRlIHJ1bGUgZnJvbSBhbiBpbXBvcnRlZCBzdHlsZSBzaGVldC4KLSAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDplbGVtZW50LW9ubHktdmVyc2lvbmVkLWVsZW1lbnQtdHlwZSIvPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9ImFwcGx5LXRlbXBsYXRlcyIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDppbnN0cnVjdGlvbiI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICBBcHBsaWVzIHRlbXBsYXRlIHJ1bGVzIGJhc2VkIG9uIGEgZ2l2ZW4gWFBhdGggc2VsZWN0aW9uIGNyaXRlcmlhLiAgSWYgbm8gdGVtcGxhdGUKLSAgICAgICAgaXMgZm91bmQgdGhlIGJ1aWx0IGluIHRlbXBsYXRlcyBhcmUgdXNlZC4KLSAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOmVsZW1lbnQtb25seS12ZXJzaW9uZWQtZWxlbWVudC10eXBlIj4KLSAgICAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzbDpzb3J0Ii8+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4c2w6d2l0aC1wYXJhbSIvPgotICAgICAgICA8L3hzOmNob2ljZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzZWxlY3QiIHR5cGU9InhzbDpleHByZXNzaW9uIiBkZWZhdWx0PSJjaGlsZDo6bm9kZSgpIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgIE9wdGlvbmFsLiBTcGVjaWZpZXMgdGhlIFhQYXRoIGNyaXRlcmlhIHRvIGJlIHVzZWQgdG8gYXBwbHkgdGhlIHRlbXBsYXRlcy4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1vZGUiIHR5cGU9InhzbDptb2RlIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgIE9wdGlvbmFsLiAgU3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRlbXBsYXRlIHRvIGJlIHVzZWQgaWYgdGhlcmUgaXMgbW9yZSB0aGFuCi0gICAgICAgICAgICAgICAgIG9uZSB3YXkgaW4gd2hpY2ggdG8gcHJvY2VzcyB0aGUgZ2l2ZW4gY3JpdGVyaWEuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZSIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDppbnN0cnVjdGlvbiI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgRGVmaW5lcyBhbiBhdHRyaWJ1dGUgdGhhdCB3aWxsIGJlIHB1dCBpbiB0aGUgcmVzdWx0IHNldC4KLSAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0idHJ1ZSI+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3RvciI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNsOmF2dCIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgUmVxdWlyZWQuIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gYmUgY3JlYXRlZC4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHNsOmF2dCI+Ci0gICAgICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgICBPcHRpb25hbC4gVGhlIG5hbWVzcGFjZSBmb3IgdGhlIGF0dHJpYnV0ZS4KLSAgICAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4gICAgICAgIAotCi08eHM6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtc2V0IiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmRlY2xhcmF0aW9uIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICBEZWZpbmVzIGEgZ3JvdXAgb2YgYXR0cmlidXRlcyB0aGF0IHdpbGwgYmUgY3JlYXRlZCBhbmQgY2FuIGJlIHJldXNlZAotICAgICAgICAgYnkgb3RoZXIgcG9ydGlvbnMgb2YgdGhlIHN0eWxlc2hlZXQgZHVyaW5nIHByb2Nlc3NpbmcuICBUaGVzZSBhdHRyaWJ1dGVzCi0gICAgICAgICB3aWxsIGFwcGVhciBvbiB0aGUgcmVzdWx0aW5nIGRvY3VtZW50IHdoZW4gdXNlZC4KLSAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOmVsZW1lbnQtb25seS12ZXJzaW9uZWQtZWxlbWVudC10eXBlIj4KLSAgICAgICAgPHhzOnNlcXVlbmNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieHNsOmF0dHJpYnV0ZSIvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzbDpRTmFtZSIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgUmVxdWlyZWQuICBOYW1lIG9mIHRoZSBhdHRyaWJ1dGUgc2V0LgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idXNlLWF0dHJpYnV0ZS1zZXRzIiB0eXBlPSJ4c2w6UU5hbWVzIiBkZWZhdWx0PSIiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgIEEgbGlzdCBvZiBhdHRyaWJ1dGVzLXNldHMgc2VwYXJhdGVkIGJ5IHNwYWNlcyB0byBiZSB1c2VkIGluIHRoaXMKLSAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSBzZXQuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9ImNhbGwtdGVtcGxhdGUiIHN1YnN0aXR1dGlvbkdyb3VwPSJ4c2w6aW5zdHJ1Y3Rpb24iPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgU3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgdGVtcGxhdGUgdG8gYmUgY2FsbGVkLiBBIGNhbGxlZCB0ZW1wbGF0ZQotICAgICAgICBpcyBvbmx5IGV4ZWN1dGVkIHdoZW4gaXQgaXMgY2FsbGVkLiAgSXQgaXMgbm90IGV4ZWN1dGVkIGRpcmVjdGx5IGJ5Ci0gICAgICAgIGFuIGFwcGx5LXRlbXBsYXRlcyBjb21tYW5kLgotICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLQotICA8eHM6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDplbGVtZW50LW9ubHktdmVyc2lvbmVkLWVsZW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzbDp3aXRoLXBhcmFtIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNsOlFOYW1lIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgIFJlcXVpcmVkLiAgVGhlIG5hbWUgb2YgdGhlIHRlbXBsYXRlIHRvIGJlIGNhbGxlZC4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0iY2hvb3NlIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmluc3RydWN0aW9uIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICBDaG9vc2UgaXMgdGhlIGJlZ2lubmluZyBvZiBhIFdoZW4vT3RoZXJ3aXNlIGNvbWJpbmF0aW9uLiAgSXQgaXMKLSAgICAgICAgIHRoZSB3YXkgdG8gaW1wbGVtZW50IGNhc2Ugc2VsZWN0aW9uIG9mIElmL1RoZW4vRWxzZUlmIHR5cGUgbG9naWNhbAotICAgICAgICAgcHJvY2Vzc2luZy4KLSAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDplbGVtZW50LW9ubHktdmVyc2lvbmVkLWVsZW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzbDp3aGVuIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieHNsOm90aGVyd2lzZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJjb21tZW50IiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmluc3RydWN0aW9uIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgIENyZWF0ZXMgYSBjb21tZW50IG5vZGUgaW4gdGhlIHJlc3VsdCBkb2N1bWVudC4KLSAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3IiLz4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJjb3B5IiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmluc3RydWN0aW9uIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICBDb3B5IGNyZWF0ZXMgYSBkdXBsaWNhdGUgb2YgdGhlIGN1cnJlbnQgbm9kZSBiZWluZyBwcm9jZXNzZWQuICBJdAotICAgICAgICAgZG9lcyBub3QgY29weSB0aGUgYXR0cmlidXRlcyBvciBjaGlsZHJlbiBub2Rlcy4gIFNlZSBjb3B5LW9mIGZvcgotICAgICAgICAgY29weWluZyBhdHRyaWJ1dGVzIGFuZCBjaGlsZHJlbiBub2Rlcy4KLSAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3IiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InVzZS1hdHRyaWJ1dGUtc2V0cyIgdHlwZT0ieHNsOlFOYW1lcyIgZGVmYXVsdD0iIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgIE9wdGlvbmFsLiAgQSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBhdHRyaWJ1dGVzIHNldHMgdG8gYXBwbHkgdG8gdGhlCi0gICAgICAgICAgICAgICAgIHJlc3VsdCBkb2N1bWVudC4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0iY29weS1vZiIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDppbnN0cnVjdGlvbiI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgQ3JlYXRlcyBhIGNvcHktb2YgdGhlIGN1cnJlbnQgbm9kZSBhbmQgYWxsIGF0dHJpYnV0ZXMsIGFuZCBjaGlsZHJlbiBub2Rlcy4KLSAgICAgICAgIEl0IGNvcGllcyB0aGUgbm9kZXMgc3BlY2lmaWVkIGJ5IHRoZSBYUGF0aCBzZWxlY3Rpb24gY3JpdGVyaWEuCi0gICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50IG1peGVkPSJ0cnVlIj4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOmdlbmVyaWMtZWxlbWVudC10eXBlIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzZWxlY3QiIHR5cGU9InhzbDpleHByZXNzaW9uIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgICBSZXF1aXJlZC4gIFhQYXRoIGV4cHJlc3Npb25zIHRoYXQgc2VsZWN0IHRoZSBub2RlcyB0byBiZSBjb3BpZWQuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9ImRlY2ltYWwtZm9ybWF0IiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmRlY2xhcmF0aW9uIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICBEZWZpbmVzIHRoZSBvdXRwdXQgZm9ybWF0IHRvIGJlIHVzZWQgd2hlbiBjb252ZXJ0aW5nIG51bWJlcnMgaW50byBzdHJpbmdzIHdoZW4KLSAgICAgICAgIHVzZWQgd2l0aCB0aGUgWFBhdGggZnVuY3Rpb24gZm9ybWF0LW51bWJlcigpLgotICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLQotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6ZWxlbWVudC1vbmx5LXZlcnNpb25lZC1lbGVtZW50LXR5cGUiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzbDpRTmFtZSI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgT3B0aW9uYWwuIFRoZSB1bmlxdWUgbmFtZSBmb3IgdGhpcyBmb3JtYXQuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkZWNpbWFsLXNlcGFyYXRvciIgdHlwZT0ieHNsOmNoYXIiIGRlZmF1bHQ9Ii4iPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgIE9wdGlvbmFsLiAgVGhlIGNoYXJhY3RlciB0byB1c2UgdG8gcmVwcmVzZW50IGEgZGVjaW1hbCBwb2ludC4KLSAgICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGEgcGVyaW9kLgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZ3JvdXBpbmctc2VwYXJhdG9yIiB0eXBlPSJ4c2w6Y2hhciIgZGVmYXVsdD0iLCI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgT3B0aW9uYWwuIFRoZSBjaGFyYWN0ZXIgdG8gYmUgdXNlZCB0byBzZXBlcmF0ZSB0aG91c2FuZHMuICBUaGUKLSAgICAgICAgICAgICAgICAgIGRlZmF1bHQgaXMgYSBjb21tYS4gICAgICAgICAgICAgIAotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaW5maW5pdHkiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iSW5maW5pdHkiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgIE9wdGlvbmFsLiBUaGUgc3RyaW5nIHRvIGJlIHVzZWQgdG8gcmVwcmVzZW50IGluZmluaXR5LiBUaGUgZGVmYXVsdAotICAgICAgICAgICAgICAgICAgaXMgSW5maW5pdHkuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtaW51cy1zaWduIiB0eXBlPSJ4c2w6Y2hhciIgZGVmYXVsdD0iLSI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgT3B0aW9uYWwuIFRoZSBjaGFyYWN0ZXIgdG8gYmUgdXNlZCB0byByZXByZXNlbnQgbmVnYXRpdmUgbnVtYmVycy4KLSAgICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IGlzIHRoZSBtaW51cyBzaWduLgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iTmFOIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9Ik5hTiI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgT3B0aW9uYWwuICBUaGUgc3RyaW5nIHRvIGJlIHVzZWQgd2hlbiB0aGUgaW5wdXQgaXMgTm90IGEgTnVtYmVyLgotICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgaXMgTmFOLgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icGVyY2VudCIgdHlwZT0ieHNsOmNoYXIiIGRlZmF1bHQ9IiUiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgIE9wdGlvbmFsLiBUaGUgY2hhcmFjdGVyIHRvIGJlIHVzZWQgdG8gcmVwcmVzZW50IGEgcGVyY2VudC4KLSAgICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IGlzIGEgcGVyY2VudCBzaWduLgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icGVyLW1pbGxlIiB0eXBlPSJ4c2w6Y2hhciIgZGVmYXVsdD0iJiN4MjAzMDsiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgIE9wdGlvbmFsLiAgVGhlIGNoYXJhY3RlciB0byBiZSB1c2VkIHRvIHJlcHJlc2V0IHBlciB0aG91c2FuZC4KLSAgICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IGlzICYjeDIwMzA7Ci0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ6ZXJvLWRpZ2l0IiB0eXBlPSJ4c2w6Y2hhciIgZGVmYXVsdD0iMCI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgT3B0aW9uYWwuIFRoZSBjaGFyYWN0ZXIgdG8gYmUgdXNlZCB0byByZXByZXNlbnQgdGhlIGRpZ2l0IHplcm8uCi0gICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCBpcyB0aGUgbnVtYmVyIHplcm8uCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkaWdpdCIgdHlwZT0ieHNsOmNoYXIiIGRlZmF1bHQ9IiMiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgICBPcHRpb25hbC4gVGhlIGNoYXJhY3RlciB0byBiZSB1c2VkIHRvIGluZGljYXRlZCB3aGVyZSBhIGRpZ2l0Ci0gICAgICAgICAgICAgICAgICAgaXMgcmVxdWlyZWQuICBUaGUgZGVmYXVsdCB2YWx1ZXMgaXMgIyBjaGFyYWN0ZXIuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJwYXR0ZXJuLXNlcGFyYXRvciIgdHlwZT0ieHNsOmNoYXIiIGRlZmF1bHQ9IjsiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgICBPcHRpb25hbC4gVGhlIGNoYXJhY3RlciB0byBiZSB1c2VkIHRvIHNlcGFyYXRlIHBvc2l0aXZlIGFuZAotICAgICAgICAgICAgICAgICAgIG5lZ2F0aXZlIHN1Yi1wYXR0ZXJucyBpbiBhIHBhdHRlcm4uICBUaGUgZGVmYXVsdCBpcyBhIHNlbWktY29sb24uICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJlbGVtZW50IiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmluc3RydWN0aW9uIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICBDcmVhdGVzIGFuIGVsZW1lbnQgaW4gdGhlIHJlc3VsdCBkb2N1bWVudC4KLSAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZSBtaXhlZD0idHJ1ZSI+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3IiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzbDphdnQiIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgIFJlcXVpcmVkLiAgVGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdG8gYmUgY3JlYXRlZC4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHNsOmF2dCI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsLiBUaGUgbmFtZXNwYWNlIHRoZSBlbGVtZW50IGJlbG9uZ3MuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ1c2UtYXR0cmlidXRlLXNldHMiIHR5cGU9InhzbDpRTmFtZXMiIGRlZmF1bHQ9IiI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsLiAgQSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBhdHRyaWJ1dGUtc2V0IG5hbWVzIHRvIAotICAgICAgICAgICAgICAgICAgIGJlIGluY2x1ZGVkIG9uIHRoZSBlbGVtZW50LgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJmYWxsYmFjayIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDppbnN0cnVjdGlvbiIgdHlwZT0ieHNsOnNlcXVlbmNlLWNvbnN0cnVjdG9yIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgU3BlY2lmaWVzIGFsdGVybmF0ZSBjb2RlIHRvIGJlIHJ1biBpZiB0aGUgWFNMVCBwcm9jZXNzb3IgZG9lc24ndCB1bmRlcnN0YW5kCi0gICAgICAgICAgYSBwYXJ0aWN1bGFyIHhzbCBlbGVtZW50LgotICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0iZm9yLWVhY2giIHN1YnN0aXR1dGlvbkdyb3VwPSJ4c2w6aW5zdHJ1Y3Rpb24iPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgIEEgbG9vcGluZyBjb21tYW5kIHRoYXQgcHJvY2Vzc2VzIGVhY2ggbm9kZSByZXR1cm5lZCBmcm9tIHRoZQotICAgICAgICAgWFBhdGggc2VsZWN0aW9uIGNyaXRlcmlhLgotICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0idHJ1ZSI+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDpnZW5lcmljLWVsZW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzbDpzb3J0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgPHhzOmdyb3VwIHJlZj0ieHNsOnNlcXVlbmNlLWNvbnN0cnVjdG9yLWdyb3VwIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2VsZWN0IiB0eXBlPSJ4c2w6ZXhwcmVzc2lvbiIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgICBSZXF1aXJlZC4gIFRoZSBYUGF0aCBzZWxlY3Rpb24gY3JpdGVyaWEgdG8gYmUgdXNlZCB0byByZXRyaWV2ZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgbm9kZSBzZXQgdG8gYmUgcHJvY2Vzc2VkIGJ5IHRoZSBsb29wLiAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9ImlmIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmluc3RydWN0aW9uIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICBBIGxvZ2ljYWwgY29uc3RydWN0LCB0aGF0IHdpbGwgb25seSBiZSBhcHBsaWVkIHdoZW4gdGhlIFhQYXRoIGV4cHJlc3Npb24KLSAgICAgICAgIHRlc3QgcmV0dXJucyB0cnVlLiAgSXQgZG9lcyBub3Qgc3VwcG9ydCBhIEVsc2Ugc3RhdGVtZW50LCBzZWUgQ2hvb3NlCi0gICAgICAgICBmb3IgaW1wbGVtZW50aW5nIElmL1RoZW4vRWxzZUlmIGxvZ2ljLgotICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0idHJ1ZSI+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3RvciI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idGVzdCIgdHlwZT0ieHNsOmV4cHJlc3Npb24iIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgICAgUmVxdWlyZWQuICBUaGUgWFBhdGggZXhwcmVzc2lvbiB0byB0ZXN0IHRoZSB2YXJpYWJsZSBvciBub2RlIGFnYWluc3QuCi0gICAgICAgICAgICAgICAgICAgIFRoZSBzdGF0ZW1lbnRzIG5lc3RlZCB3aWxsIG9ubHkgYmUgZXhlY3V0ZWQgaWYgdGhlIHRlc3QgcmV0dXJucwotICAgICAgICAgICAgICAgICAgICB0cnVlLgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJpbXBvcnQiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgQWxsb3dzIHRoZSBpbmNsdXNpb24gb2Ygb25lIHN0eWxlc2hlZXQgaW50byBhbm90aGVyLiAgSWYgdGhlcmUgYXJlCi0gICAgICAgIHRlbXBsYXRlcyB0aGF0IGFyZSB0aGUgc2FtZSBpbiB0aGUgcGFyZW50IHN0eWxlc2hlZXQgdGhhdCBhcmUgaW4gdGhlCi0gICAgICAgIHN0eWxlc2hlZXQgYmVpbmcgaW1wb3J0ZWQsIHRoZSBwYXJlbnQgc3R5bGVzaGVldCdzIHRlbXBsYXRlcyB3aWxsIAotICAgICAgICB0YWtlIHByZWNlZGVuY2UuCi0gICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6ZWxlbWVudC1vbmx5LXZlcnNpb25lZC1lbGVtZW50LXR5cGUiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImhyZWYiIHR5cGU9InhzOmFueVVSSSIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgUmVxdWlyZWQuICBUaGUgVVJJIGZvciB0aGUgc3R5bGVzaGVldC4gIFRoaXMgaXMgZWl0aGVyIGEgcmVsYXRpdmUKLSAgICAgICAgICAgICAgICAgIG9yIHBoeXNpY2FsIFVSSS4gIElmIGl0IGlzIHJlbGF0aXZlLCBpdCBpcyByZWxhdGl2ZSB0byB0aGUgbG9jYXRpb24KLSAgICAgICAgICAgICAgICAgIG9mIHRoZSBzdHlsZXNoZWV0LgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi0KLTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGUiIHN1YnN0aXR1dGlvbkdyb3VwPSJ4c2w6ZGVjbGFyYXRpb24iPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgIEluY2x1ZGUgYnJpbmdzIGluIGFub3RoZXIgc3R5bGVzaGVldCBpbnRvIHRoZSBjdXJyZW50IG9uZS4gIFVubGlrZQotICAgICAgICAgdGhlIEltcG9ydCBzdGF0ZW1lbnQsIHRoZSBzdHlsZXNoZWV0IHRlbXBsYXRlcyBoYXZlIHRoZSBzYW1lIHByZWNlZGVuY2UKLSAgICAgICAgIGFzIHRoZSBvbmUgYmVpbmcgaW5jbHVkZWQgaW4gdG8uCi0gICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6ZWxlbWVudC1vbmx5LXZlcnNpb25lZC1lbGVtZW50LXR5cGUiPgotICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaHJlZiIgdHlwZT0ieHM6YW55VVJJIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgICAgICBSZXF1aXJlZC4gIFRoZSBVUkkgZm9yIHRoZSBzdHlsZXNoZWV0LiAgVGhpcyBpcyBlaXRoZXIgYSByZWxhdGl2ZQotICAgICAgICAgICAgICAgICAgICAgb3IgcGh5c2ljYWwgVVJJLiAgSWYgaXQgaXMgcmVsYXRpdmUsIGl0IGlzIHJlbGF0aXZlIHRvIHRoZSBsb2NhdGlvbgotICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHN0eWxlc2hlZXQuCi0gICAgICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9ImtleSIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDpkZWNsYXJhdGlvbiI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICBBIGtleSBpcyBhIHdheSB0byBpbmRleCBhIHNldCBvZiBub2RlcyB0byBiZSByZXRyaWV2ZWQgbGF0ZXIgYnkgdGhlIFhQYXRoCi0gICAgICAgIGtleSgpIGZ1bmN0aW9uLiAgSXQgYWxsb3dzIGZhc3RlciBhY2Nlc3MgdG8gYSBzZXJpZXMgb2Ygbm9kZXMgYmFzZWQgb2ZmIG9mIGEKLSAgICAgICAgdW5pcXVlIGtleSB3aXRoIGluIGEgbGlzdCBvZiBub2Rlcy4KLSAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLQotICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0idHJ1ZSI+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3RvciI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNsOlFOYW1lIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgICBSZXF1aXJlZC4gIFRoZSBuYW1lIG9mIHRoZSBrZXkgdG8gYmUgY3JlYXRlZC4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1hdGNoIiB0eXBlPSJ4c2w6cGF0dGVybiIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgT3B0aW9uYWwuICBEZWZpbmVzIHRoZSBYUGF0aCBleHByZXNzaW9uIHRvIHdoaWNoIHRoZSBub2RlcyB3aWxsCi0gICAgICAgICAgICAgICAgICBiZSBhcHBsaWVkLgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idXNlIiB0eXBlPSJ4c2w6ZXhwcmVzc2lvbiIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgICBSZXF1aXJlZC4gIFRoZSB2YWx1ZSBvZiB0aGUga2V5IGZvciBlYWNoIG9mIHRoZSBub2Rlcy4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJtZXNzYWdlIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmluc3RydWN0aW9uIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICBXcml0ZXMgYSBtZXNzYWdlIHRvIHRoZSBvdXRwdXQsIHVzdWFsbHkgc3Rkb3V0IG9yIHN0ZGVycm8uICBUeXBpY2FsbHkKLSAgICAgICAgIHVzZWQgdG8gcmVwb3J0IGVycm9ycyBkdXJpbmcgcHJvY2Vzc2luZy4KLSAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3IiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InRlcm1pbmF0ZSIgdHlwZT0ieHNsOmF2dCIgZGVmYXVsdD0ibm8iPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgIE9wdGlvbmFsLiAgSW5kaWNhdGVzIHdoZXRoZXIgcHJvY2Vzc2luZyBzaG91bGQgYmUgZW5kZWQgYWZ0ZXIKLSAgICAgICAgICAgICAgICAgIHByb2R1Y2luZyB0aGUgbWVzc2FnZS4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIG5vLgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJuYW1lc3BhY2UtYWxpYXMiIHN1YnN0aXR1dGlvbkdyb3VwPSJ4c2w6ZGVjbGFyYXRpb24iPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgIEFsbG93cyByZXBsYWNpbmcgb2YgYSBwYXJ0aWN1bGFyIG5hbWVzcGFjZSBmcm9tIHRoZSBzdHlsZSBzaGVldCB0byBhIGRpZmZlcmVudAotICAgICAgICAgbmFtZXNwYWNlIHdoZW4gd3JpdGluZyB0aGUgcmVzdWx0IGRvY3VtZW50LgotICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLQotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6ZWxlbWVudC1vbmx5LXZlcnNpb25lZC1lbGVtZW50LXR5cGUiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InN0eWxlc2hlZXQtcHJlZml4IiB0eXBlPSJ4c2w6cHJlZml4LW9yLWRlZmF1bHQiIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgIFJlcXVpcmVkLiAgU3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBwcmVmaXggeW91IHdhbnQgdG8gY2hhbmdlLgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVzdWx0LXByZWZpeCIgdHlwZT0ieHNsOnByZWZpeC1vci1kZWZhdWx0IiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgICBSZXF1aXJlZC4gIFNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgcHJlZml4IHRoZSByZXN1bHQgaXMgdG8gdXNlLgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJudW1iZXIiIHN1YnN0aXR1dGlvbkdyb3VwPSJ4c2w6aW5zdHJ1Y3Rpb24iPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgVXNlZCB0byBkZXRlcm1pbmUgdGhlIGludGVnZXIgcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbm9kZS4gIEFsc28gdXNlZAotICAgICAgICBpbiBmb3JtYXR0aW5nIGEgbnVtYmVyLiAgICAgCi0gICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotCi0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6Z2VuZXJpYy1lbGVtZW50LXR5cGUiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2w6ZXhwcmVzc2lvbiI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgT3B0aW9uYWwuICBBIG51bWJlciBwcm92aWRlZCBieSB0aGUgaW1wbGVtZW50b3IgaW5zdGVhZCBvZgotICAgICAgICAgICAgICAgICAgYSBzeXN0ZW0gZ2VuZXJhdGVkIG51bWJlci4gIFRoZSBwb3NpdGlvbigpIHhwYXRoIGZ1bmN0aW9uIGNhbgotICAgICAgICAgICAgICAgICAgYmUgdXNlZCBhcyB3ZWxsLgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibGV2ZWwiIHR5cGU9InhzbDpsZXZlbCIgZGVmYXVsdD0ic2luZ2xlIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgIE9wdGlvbmFsLiBTcGVjaWZpZXMgaG93IHRoZSBzZXF1ZW5jZSBudW1iZXIgaXMgYXNzaWduZWQuICBWYWxpZCB2YWx1ZXMKLSAgICAgICAgICAgICAgICAgYXJlIHNpbmdsZSAoZGVmYXVsdCksIG11bHRpcGxlLCBhbmQgYW55LgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY291bnQiIHR5cGU9InhzbDpwYXR0ZXJuIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgIE9wdGlvbmFsLiAgQW4gWFBhdGggZXhwcmVzc2lvbiB0aGF0IGluZGljYXRlcyB3aGF0IG5vZGVzIGFyZSB0byBiZQotICAgICAgICAgICAgICAgICBjb3VudGVkLgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZnJvbSIgdHlwZT0ieHNsOnBhdHRlcm4iPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgT3B0aW9uYWwuICBBbiBYUGF0aCBleHByZXNzaW9uIHRoYXQgaW5kaWNhdGVzIHdoZXJlIGNvdW50aW5nIHdpbGwgc3RhcnQuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmb3JtYXQiIHR5cGU9InhzbDphdnQiIGRlZmF1bHQ9IjEiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgT3B0aW9uYWwuICBUaGUgZm9ybWF0IHN0cmluZyBpbiB3aGljaCB0aGUgbnVtYmVyIGlzIHRvIGJlIGZvcm1hdHRlZC4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImxhbmciIHR5cGU9InhzbDphdnQiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgT3B0aW9uYWwuICBUaGUgbGFuZ3VhZ2UgY29kZSB1c2VkIHRvIGluZGljYXRlIHdoYXQgc3Bva2VuIGxhbmd1YWdlIGlzCi0gICAgICAgICAgICAgICAgIHRvIGJlIHVzZWQgZm9yIHRoZSBmb3JtYXQgc3RyaW5nLgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibGV0dGVyLXZhbHVlIiB0eXBlPSJ4c2w6YXZ0Ij4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgIE9wdGlvbmFsLiAgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIG51bWJlciBpcyBhbHBoYWJldGljYWwgb3IgdHJhZGl0aW9uYWwuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJncm91cGluZy1zZXBhcmF0b3IiIHR5cGU9InhzbDphdnQiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgIE9wdGlvbmFsLiBUaGUgY2hhcmFjdGVyIHRvIGJlIHVzZWQgdG8gc2VwZXJhdGUgYSBncm91cCBvZiBudW1iZXJzLgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZ3JvdXBpbmctc2l6ZSIgdHlwZT0ieHNsOmF2dCI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgT3B0aW9uYWwuIEEgbnVtYmVyIGluZGljYXRpbmcgdGhlIG51bWJlciBvZiBkaWdpdHMgaW4gYSBncm91cC4gIFRoZQotICAgICAgICAgICAgICAgICAgZGVmYXVsdCBpcyAzLgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJvdGhlcndpc2UiIHR5cGU9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3RvciI+Ci0gICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgIE90aGVyd2lzZSBpcyB1c2VkIHRvIGluZGljYXRlIHRoZSBkZWZhdWx0IGFjdGlvbiB3aGVuIG5vbmUgb2YgdGhlIAotICAgICAgICAgV2hlbiB0ZXN0cyBhcmUgdHJ1ZSwgaW4gYSBDaG9vc2Ugc3RhdGVtZW50LgotICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICA8L3hzOmFubm90YXRpb24+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9Im91dHB1dCIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDpkZWNsYXJhdGlvbiI+Ci0gICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgIFNwZWNpZmllcyB0aGUgZm9ybWF0IGZvciB0aGUgcmVzdWx0IGRvY3VtZW50LgotICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6Z2VuZXJpYy1lbGVtZW50LXR5cGUiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1ldGhvZCIgdHlwZT0ieHNsOm1ldGhvZCI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICBPcHRpb25hbC4gIFZhbGlkIHZhbHVlcyBhcmUgeG1sLCBodG1sLCBhbmQgdGV4dC4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNkYXRhLXNlY3Rpb24tZWxlbWVudHMiIHR5cGU9InhzbDpRTmFtZXMiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgT3B0aW9uYWwuIEEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgZWxlbWVudHMgd2hvc2UgY29udGVudCBzaG91bGQKLSAgICAgICAgICAgICAgICAgYmUgd3JhcHBlZCB3aXRoIENEQVRBLiAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImRvY3R5cGUtcHVibGljIiB0eXBlPSJ4czpzdHJpbmciPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgT3B0aW9uYWwuIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBQdWJsaWMgZG9jdHlwZSBhdHRyaWJ1dGUuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkb2N0eXBlLXN5c3RlbSIgdHlwZT0ieHM6c3RyaW5nIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgIE9wdGlvbmFsLiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgU3lzdGVtIGRvY3R5cGUgYXR0cmlidXRlLgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZW5jb2RpbmciIHR5cGU9InhzOnN0cmluZyI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICBPcHRpb25hbC4gU3BlY2lmaWVzIHRoZSB0eXBlIG9mIGVuY29kaW5nIHRvIHVzZS4gIGkuZS4gVVRGLTgsIFVURi0xNiwgZXRjLgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaW5kZW50IiB0eXBlPSJ4c2w6eWVzLW9yLW5vIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgIE9wdGlvbmFsLiBTaG91bGQgdGhlIHJlc3VsdCBkb2N1bWVudCBiZSBwcmV0dHktcHJpbnRlZC4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1lZGlhLXR5cGUiIHR5cGU9InhzOnN0cmluZyI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgT3B0aW9uYWwuIFRoZSBtaW1lIHR5cGUgb2YgdGhlIHJlc3VsdCBkb2N1bWVudC4gIGkuZS4gdGV4dC94bWwKLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im9taXQteG1sLWRlY2xhcmF0aW9uIiB0eXBlPSJ4c2w6eWVzLW9yLW5vIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgICBPcHRpb25hbC4gIFdoZXRoZXIgdGhlIHhtbCBkZWNsYXRpb24gc2hvdWxkIGJlIGNyZWF0ZWQgaW4gdGhlIAotICAgICAgICAgICAgICAgICAgcmVzdWx0IGRvY3VtZW50LgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic3RhbmRhbG9uZSIgdHlwZT0ieHNsOnllcy1vci1uby1vci1vbWl0Ij4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgIE9wdGlvbmFsLiBJbmRpY2F0ZXMgaWYgYSBzdGFuZGFsb25lIGRlY2xhcnRpb24gc2hvdWxkIG9jY2N1ciBpbiB0aGUKLSAgICAgICAgICAgICAgICAgcmVzdWx0IGRvY3VtZW50LgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ieHM6Tk1UT0tFTiI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICBPcHRpb25hbC4gU2V0cyB0aGUgVzNDIHZlcnNpb24gbnVtYmVyIHRvIGJlIHVzZWQgd2l0aCB0aGUKLSAgICAgICAgICAgICAgICAgcmVzdWx0IGRvY3VtZW50LiAgT25seSB1c2VkIGZvciBIVE1MIG9yIFhNTCBvdXRwdXQuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9InBhcmFtIj4KLSAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICBVc2VkIHRvIGRlY2xhcmUgYSBsb2NhbCBvciBnbG9iYWwgcGFyYW1ldGVyLgotICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0idHJ1ZSI+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3RvciI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNsOlFOYW1lIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgICBSZXF1aXJlZC4gIFRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgdG8gYmUgY3JlYXRlZC4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNlbGVjdCIgdHlwZT0ieHNsOmV4cHJlc3Npb24iPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgIE9wdGlvbmFsLiAgQW4gWFBhdGggZXhwcmVzc2lvbiB0byBiZSB1c2VkIHRvIHBvcHVsYXRlIHRoZSBwYXJhbWV0ZXIKLSAgICAgICAgICAgICAgICAgIGlmIG5vdGhpbmcgaXMgcGFzc2VkIHRvIGl0LgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi0KLTx4czplbGVtZW50IG5hbWU9InByZXNlcnZlLXNwYWNlIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmRlY2xhcmF0aW9uIj4KLSAgIDx4czphbm5vdGF0aW9uPgotICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgSW5kaWNhdGVzIHRoZSBlbGVtZW50cyB0aGF0IGFyZSB0byBoYXZlIHdoaXRlIHNwYWNlIHByZXNlcnZlZCB3aGVuCi0gICAgICAgICBjcmVhdGluZyB0aGUgcmVzdWx0IGRvY3VtZW50LgotICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDplbGVtZW50LW9ubHktdmVyc2lvbmVkLWVsZW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZWxlbWVudHMiIHR5cGU9InhzbDpuYW1ldGVzdHMiIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgIE9wdGlvbmFsLiAgQSBzcGFjZSBzZXBlcmF0ZWQgbGlzdCBvZiBlbGVtZW50cyBpbiB3aGljaAotICAgICAgICAgICAgICAgICAgd2hpdGUgc3BhY2UgaXMgc2lnbmlmaWNhbnQgYW5kIHNob3VsZCBiZSBwcmVzZXJ2ZWQgd2hlbgotICAgICAgICAgICAgICAgICAgY3JlYXRpbmcgdGhlIHJlc3VsdCBkb2N1bWVudC4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0icHJvY2Vzc2luZy1pbnN0cnVjdGlvbiIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDppbnN0cnVjdGlvbiI+Ci0gICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgIENyZWF0ZXMgYSBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGluIHRoZSByZXN1bHQgZG9jdW1lbnQuCi0gICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0idHJ1ZSI+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3RvciI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNsOmF2dCIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICBSZXF1aXJlZC4gIFRoZSBuYW1lIG9mIHRoZSBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRvIGJlIGNyZWF0ZWQuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9InNvcnQiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgU29ydHMgdGhlIG91dHB1dCBvZiB0aGUgbm9kZSBzZXQuCi0gICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotCi0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3IiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNlbGVjdCIgdHlwZT0ieHNsOmV4cHJlc3Npb24iPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgT3B0aW9uYWwuICBTcGVjaWZpZXMgdGhlIFhQYXRoIGV4cHJlc3Npb24gdG8gYmUgdXNlZCB0byBjcmVhdGUgdGhlIG5vZGVzZXQKLSAgICAgICAgICAgICAgICAgdG8gYmUgc29ydGVkLgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+ICAKLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIiB0eXBlPSJ4c2w6YXZ0Ij4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgICBPcHRpb25hbC4gVGhlIGxhbmd1YWdlIGNvZGUgdG8gYmUgdXNlZCBmb3Igc29ydGluZy4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPiAgICAgICAgCi0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZGF0YS10eXBlIiB0eXBlPSJ4c2w6YXZ0IiBkZWZhdWx0PSJ0ZXh0Ij4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgICBPcHRpb25hbC4gIFRoZSB0eXBlIG9mIGRhdGEgdGhhdCBpcyBiZWluZyBzb3J0ZWQuIFRoZSBkZWZhdWx0Ci0gICAgICAgICAgICAgICAgICBpcyB0ZXh0LgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+ICAgICAgICAKLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJvcmRlciIgdHlwZT0ieHNsOmF2dCIgZGVmYXVsdD0iYXNjZW5kaW5nIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgICBPcHRpb25hbC4gIFRoZSBvcmRlciBpbiB3aGljaCB0aGUgZGF0YSBpcyB0byBiZSBzb3J0ZWQuICBUaGUKLSAgICAgICAgICAgICAgICAgIGRlZmF1bHQgaXMgYXNjZW5kaW5nLgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+ICAgICAgICAKLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjYXNlLW9yZGVyIiB0eXBlPSJ4c2w6YXZ0Ij4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgICBPcHRpb25hbC4gIFNwZWNpZmllcyBpZiB1cHBlciBvciBsb3dlcmNhc2UgbGV0dGVycyBhcmUgdG8gCi0gICAgICAgICAgICAgICAgICBiZSBzb3J0ZWQgZmlyc3QuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9InN0cmlwLXNwYWNlIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmRlY2xhcmF0aW9uIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgIERlZmluZXMgd2hpY2ggZWxlbWVudHMgYXJlIHRvIGhhdmUgd2hpdGUgc3BhY2Ugc3RyaXBwZWQgd2hlbgotICAgICAgICB3cml0aW5nIHRoZSByZXN1bHQgZG9jdW1lbnQuICAgICAKLSAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDplbGVtZW50LW9ubHktdmVyc2lvbmVkLWVsZW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZWxlbWVudHMiIHR5cGU9InhzbDpuYW1ldGVzdHMiIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgUmVxdWlyZWQuICBBIHNwYWNlIHNlcGFyZWF0ZWQgbGlzdCBvZiBlbGVtZW50cyBhcmUgdG8gaGF2ZQotICAgICAgICAgICAgICAgICB3aGl0ZSBzcGFjZSByZW1vdmVkIHdoZW4gd3JpdGluZyB0aGUgcmVzdWx0IGRvY3VtZW50LgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJzdHlsZXNoZWV0IiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOnRyYW5zZm9ybSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgVGhlIHJvb3QgZWxlbWVudCBvZiBhIHN0eWxlIHNoZWV0LiAgQWxzbyBzZWUgdGhlIHRyYW5zZm9ybSBlbGVtZW50LgotICAgICAgICAgRWl0aGVyIHN0eWxlc2hlZXQgb3IgdHJhbnNmb3JtIGNhbiBiZSB1c2VkLiAgVHlwaWNhbGx5IHN0eWxzaGVldCBpcwotICAgICAgICAgdXNlZC4KLSAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9InRlbXBsYXRlIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmRlY2xhcmF0aW9uIj4KLSAgIDx4czphbm5vdGF0aW9uPgotICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICBBIHRlbXBsYXRlIGNvbnRhaW5zIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIGFuZCBjb21tYW5kcyBmb3Igbm9kZXMgaW4gdGhlCi0gICAgICAgIGlucHV0IGRvY3VtZW50IHRoYXQgbWF0Y2ggdGhlIHNwZWNpZmllZCBYUGF0aCBleHByZXNzaW9uLgotICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6Z2VuZXJpYy1lbGVtZW50LXR5cGUiPgotICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4c2w6cGFyYW0iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICA8eHM6Z3JvdXAgcmVmPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3ItZ3JvdXAiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtYXRjaCIgdHlwZT0ieHNsOnBhdHRlcm4iPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgT3B0aW9uYWwuIEFuIFhQYXRoIGV4cHJlc3Npb24gb3IgZXhwcmVzc2lvbnMgdGhhdCB0aGlzIHRlbXBsYXRlIHdpbGwKLSAgICAgICAgICAgICAgICAgYmUgYXBwbGllZCB0by4gIE5vdGUgaWYgdGhpcyBpcyBvbWl0dGVkLCB0aGVuIGEgbmFtZSBhdHRyaWJ1dGUgbXVzdAotICAgICAgICAgICAgICAgICBiZSB1c2VkLiAgRWl0aGVyIGEgbmFtb2Ugb3IgYSBtYXRjaCBhcmUgdG8gYmUgdXNlZCwgYnV0IG5vdCBib3RoLgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icHJpb3JpdHkiIHR5cGU9InhzOmRlY2ltYWwiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgIE9wdGlvbmFsLiAgSW5kaWNhdGVzIHRoZSBudW1lcmljIHByaW9ydGl0eSBmb3IgcHJvY2Vzc2luZyB0aGUKLSAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibW9kZSIgdHlwZT0ieHNsOm1vZGVzIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgICBPcHRpb25hbC4gIFRoZSBuYW1lIG9mIHRoZSBtb2RlIGZvciB0aGlzIHRlbXBsYXRlLiAgVXNlZCB0byBtYXRjaAotICAgICAgICAgICAgICAgICAgdXAgd2l0aCB0aGUgYXBwbHktdGVtcGxhdGVzIG1vZGUgYXR0cmlidXRlLgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNsOlFOYW1lIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgICBPcHRpb25hbC4gIFRoZSBuYW1lIG9mIGEgY2FsbGVkIHRlbXBsYXRlLiAgTm90ZSB0aGF0IGlmIG5hbWUgaXMKLSAgICAgICAgICAgICAgICAgIG5vdCB1c2VkLCB0aGVuIG1hdGNoIG11c3QgYmUgdXNlZC4gIFlvdSBjYW4gaGF2ZSBvbmUgb3IgdGhlIG90aGVyCi0gICAgICAgICAgICAgICAgICBidXQgbm90IGJvdGguCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czpjb21wbGV4VHlwZSBuYW1lPSJ0ZXh0LWVsZW1lbnQtYmFzZS10eXBlIj4KLSAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzbDpnZW5lcmljLWVsZW1lbnQtdHlwZSI+Ci0KLSAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIi8+Ci0gICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJza2lwIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVDb250ZW50PgotPC94czpjb21wbGV4VHlwZT4KLQotPHhzOmVsZW1lbnQgbmFtZT0idGV4dCIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDppbnN0cnVjdGlvbiI+Ci0gICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgV3JpdGVzIHRleHQgZGF0YSB0byB0aGUgb3V0cHV0LiAgaS5lLiAjUENEYXRhCi0gICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6dGV4dC1lbGVtZW50LWJhc2UtdHlwZSI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmciIHR5cGU9InhzbDp5ZXMtb3Itbm8iIGRlZmF1bHQ9Im5vIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgIE9wdGlvbmFsLiAgSW5kaWNhdGVzIGlmIG5vbiBmcmllbmRseSBodG1sIGFuZCB4bWwgY29udGVudCBzaG91bGQgYmUgY29udmVydGVkCi0gICAgICAgICAgICAgICAgIHRvIHRoZWlyIGVudGl0eSB0eXBlcy4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNmb3JtLWVsZW1lbnQtYmFzZS10eXBlIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOmVsZW1lbnQtb25seS12ZXJzaW9uZWQtZWxlbWVudC10eXBlIj4KLSAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ieHM6ZGVjaW1hbCIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICBSZXF1aXJlZC4gIFRoZSB2ZXJzaW9uIG51bWJlciBjb3JyZXNwb25kaW5nIHRoZSB0aGUKLSAgICAgICAgICAgICAgICAgWFNMVCBzcGVjaWZpY2F0aW9uIGJlaW5nIHVzZWQuICBGb3IgWFNMVCAxLjAsIHRoaXMgd2lsbAotICAgICAgICAgICAgICAgICBiZSAxLjAuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImV4Y2x1ZGUtcmVzdWx0LXByZWZpeGVzIiB0eXBlPSJ4c2w6cHJlZml4ZXMiIHVzZT0ib3B0aW9uYWwiPgotICAgICAgCTx4czphbm5vdGF0aW9uPgotICAgICAgCQk8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6L3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAJCQlPcHRpb25hbC4gQSBsaXN0IG9mIG5hbWVzcGFjZSBwcmVmaXhlcyB0byBleGNsdWRlIGZyb20gdGhlIHJlc3VsdCBkb2N1bWVudC4KLSAgICAgIAkJPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgCTwveHM6YW5ub3RhdGlvbj4KLSAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJleHRlbnNpb24tZWxlbWVudC1wcmVmaXhlcyIgdHlwZT0ieHNsOnByZWZpeGVzIiB1c2U9Im9wdGlvbmFsIj4KLSAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgT3B0aW9uYWwuICBBIGxpc3Qgb2YgZXh0ZW5zaW9uIG5hbWVzcGFjZSBwcmVmaXhlcy4gIFRoaXMgaXMgdXNlZCB0byBpZGVudGlmeSBuYW1lc3BhY2VzIHRoYXQKLSAgICAgICAgICAgICAgIGNvbnRhaW4gWFNMVCBwcm9jZXNzb3IgZXh0ZW5zaW9ucy4KLSAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ic2tpcCIvPgotICAgIDwveHM6ZXh0ZW5zaW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotPC94czpjb21wbGV4VHlwZT4KLQotPHhzOmVsZW1lbnQgbmFtZT0idHJhbnNmb3JtIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICBUaGUgcm9vdCBlbGVtZW50IG9mIGEgc3R5bGUgc2hlZXQuICBBbHNvIHNlZSB0aGUgc3R5bGVzaGVldCBlbGVtZW50LgotICAgICAgICAgRWl0aGVyIHN0eWxlc2hlZXQgb3IgdHJhbnNmb3JtIGNhbiBiZSB1c2VkLiAgVHlwaWNhbGx5IHN0eWxzaGVldCBpcwotICAgICAgICAgdXNlZC4KLSAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDp0cmFuc2Zvcm0tZWxlbWVudC1iYXNlLXR5cGUiPgotICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4c2w6aW1wb3J0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieHNsOmRlY2xhcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzbDp2YXJpYWJsZSIvPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4c2w6cGFyYW0iLz4gICAgICAgICAgICAgIAotICAgICAgICAgICAgPHhzOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ic2tpcCIvPiA8IS0tIHdlYWtlciB0aGFuIFhTTFQgMS4wIC0tPgotICAgICAgICAgIDwveHM6Y2hvaWNlPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4czpJRCI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICBPcHRpb25hbC4gIEEgdW5pcXVlIElEIGZvciB0aGUgc3R5bGVzaGVldC4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0idmFsdWUtb2YiIHN1YnN0aXR1dGlvbkdyb3VwPSJ4c2w6aW5zdHJ1Y3Rpb24iPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgVXNlZCB0byBwdWxsIHRoZSBkYXRhIHZhbHVlIGZyb20gdGhlIHNlbGVjdGVkIG5vZGUgb3IgWFBhdGggZXhwcmVzc2lvbi4KLSAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0idHJ1ZSI+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3RvciI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2VsZWN0IiB0eXBlPSJ4c2w6ZXhwcmVzc2lvbiIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICBSZXF1aXJlZC4gIFRoZSBYUGF0aCBleHByZXNzaW9uIG9yIGN1cnJlbnQgbm9kZSB0byBiZSB1c2VkCi0gICAgICAgICAgICAgICAgIHRvIHB1bGwgdGhlIGRhdGEgZnJvbS4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImRpc2FibGUtb3V0cHV0LWVzY2FwaW5nIiB0eXBlPSJ4c2w6eWVzLW9yLW5vIiBkZWZhdWx0PSJubyI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgT3B0aW9uYWwuIFdoZXRoZXIgbm9uLXhtbCBmcmllbmRseSBkYXRhIHNob3VsZCBiZSBlbnRpdHkgZXNjYXBlZC4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0idmFyaWFibGUiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgRGVjbGFyZXMgYSBsb2NhbCBvciBnbG9iYWwgdmFyaWFibGUgdG8gYmUgdXNlZCBkdXJpbmcgcHJvY2Vzc2luZy4KLSAgICAgICAgVGhlIGNvbnRlbnRzIG9mIHZhcmlhYmxlIGNhbiBiZSBwb3B1bGF0ZWQgYnkgZWl0aGVyIGEgc2VyaWVzIG9mCi0gICAgICAgIFhTTFQgY29tbWFuZHMgb3IgWFBhdGggZXhwcmVzc2lvbnMuCi0gICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotCi0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3IiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzbDpRTmFtZSIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICBSZXF1aXJlZC4gIFRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZS4gIFRoaXMgaXMgaG93IHRoZQotICAgICAgICAgICAgICAgICB2YXJpYWJsZSBpcyBhY2Nlc3NlZCBsYXRlciBpbiB0aGUgc3R5bGVzaGVldC4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNlbGVjdCIgdHlwZT0ieHNsOmV4cHJlc3Npb24iIHVzZT0ib3B0aW9uYWwiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgIE9wdGlvbmFsLiAgVGhlIFhQYXRoIGV4cHJlc3Npb24gaW4gd2hpY2ggdGhlIHZhcmlhYmxlIGlzCi0gICAgICAgICAgICAgICAgICBwb3B1bGF0ZWQgZnJvbS4gIFRoaXMgc3BlY2lmaWVzIHdoZXJlIHRoZSB2YXJpYWJsZSBpcyB0byBnZXQKLSAgICAgICAgICAgICAgICAgIGl0J3MgZGF0YSB2YWx1ZSBmcm9tLgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJ3aGVuIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICBBIGNvbmRpdGlvbmFsIHN0YXRlbWVudCBzaW1pbGlhciB0byBhbiBpZiBzdGF0ZW1lbnQsIHVzZWQgdG8gdGVzdAotICAgICAgICAgaWYgYSBwYXJ0aWN1bGFyIGV4cHJlc3Npb24gaXMgdHJ1ZSBvciBmYWxzZS4gIFVzZSB3aXRoIHRoZSBDaG9vc2UgYW5kCi0gICAgICAgICBPdGhlciB3aXNlIGVsZW1lbnRzLgotICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLQotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50IG1peGVkPSJ0cnVlIj4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOnNlcXVlbmNlLWNvbnN0cnVjdG9yIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0ZXN0IiB0eXBlPSJ4c2w6ZXhwcmVzc2lvbiIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICBBbiBYUGF0aCBleHByZXNzaW9uIHRoYXQgdGVzdHMgdG8gdHJ1ZSBvciBmYWxzZS4gIElmIHRydWUKLSAgICAgICAgICAgICAgICAgdGhlIHN0YXRlbWVudHMgd2l0aGluIGFyZSBleGVjdXRlZC4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0id2l0aC1wYXJhbSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICBEZWZpbmVzIHRoZSB2YWx1ZSBvZiBhIHBhcmFtZXRlciB0byBiZSBwYXNzZWQgdG8gYSBjYWxsZWQgdGVtcGxhdGUuCi0gICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotCi0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3IiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzbDpRTmFtZSIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgUmVxdWlyZWQuICBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIHRvIGJlIHNldC4gIFRoaXMKLSAgICAgICAgICAgICAgICAgIG11c3QgZXhpc3QgaW4gdGhlIHRlbXBsYXRlIHRoYXQgaXMgYmVpbmcgY2FsbGVkLgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2VsZWN0IiB0eXBlPSJ4c2w6ZXhwcmVzc2lvbiI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgT3B0aW9uYWwuICBBbiBYUGF0aCBleHByZXNzaW9uIHRoYXQgaXMgdXNlZCB0byBzZXQKLSAgICAgICAgICAgICAgICAgIHRoZSB2YWx1ZSBmb3IgdGhlIHBhcmFtZXRlciBiZWluZyBwYXNzZWQgdG8gYSB0ZW1wbGF0ZS4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPCEtLSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KLTx4czphbm5vdGF0aW9uPgotICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICBQQVJUIEM6IGRlZmluaXRpb24gb2YgbGl0ZXJhbCByZXN1bHQgZWxlbWVudHMKLSAgICAKLSAgICBUaGVyZSBhcmUgdGhyZWUgd2F5cyB0byBkZWZpbmUgdGhlIGxpdGVyYWwgcmVzdWx0IGVsZW1lbnRzCi0gICAgcGVybWlzc2libGUgaW4gYSBzdHlsZXNoZWV0LgotICAgIAotICAgIChhKSBkbyBub3RoaW5nLiBUaGlzIGFsbG93cyBhbnkgZWxlbWVudCB0byBiZSB1c2VkIGFzIGEgbGl0ZXJhbAotICAgICAgICByZXN1bHQgZWxlbWVudCwgcHJvdmlkZWQgaXQgaXMgbm90IGluIHRoZSBYU0xUIG5hbWVzcGFjZQotICAgIAotICAgIChiKSBkZWNsYXJlIGFsbCBwZXJtaXR0ZWQgbGl0ZXJhbCByZXN1bHQgZWxlbWVudHMgYXMgbWVtYmVycwotICAgICAgICBvZiB0aGUgeHNsOmxpdGVyYWwtcmVzdWx0LWVsZW1lbnQgc3Vic3RpdHV0aW9uIGdyb3VwCi0gICAgICAgIAotICAgIChjKSByZWRlZmluZSB0aGUgbW9kZWwgZ3JvdXAgeHNsOnJlc3VsdC1lbGVtZW50cyB0byBhY2NvbW1vZGF0ZQotICAgICAgICBhbGwgcGVybWl0dGVkIGxpdGVyYWwgcmVzdWx0IGVsZW1lbnRzLgotICAgICAgICAKLSAgICBMaXRlcmFsIHJlc3VsdCBlbGVtZW50cyBhcmUgYWxsb3dlZCB0byB0YWtlIGNlcnRhaW4gYXR0cmlidXRlcwotICAgIGluIHRoZSBYU0xUIG5hbWVzcGFjZS4gVGhlc2UgYXJlIGRlZmluZWQgaW4gdGhlIGF0dHJpYnV0ZSBncm91cAotICAgIGxpdGVyYWwtcmVzdWx0LWVsZW1lbnQtYXR0cmlidXRlcywgd2hpY2ggY2FuIGJlIGluY2x1ZGVkIGluIHRoZQotICAgIGRlZmluaXRpb24gb2YgYW55IGxpdGVyYWwgcmVzdWx0IGVsZW1lbnQuCi0gICAgCi0gIDwveHM6ZG9jdW1lbnRhdGlvbj4KLQotPC94czphbm5vdGF0aW9uPiAgIAotPCEtLSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KLQotPHhzOmVsZW1lbnQgbmFtZT0ibGl0ZXJhbC1yZXN1bHQtZWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIHR5cGU9InhzOmFueVR5cGUiLz4KLQotPHhzOmF0dHJpYnV0ZUdyb3VwIG5hbWU9ImxpdGVyYWwtcmVzdWx0LWVsZW1lbnQtYXR0cmlidXRlcyI+Ci0gIDx4czphdHRyaWJ1dGUgbmFtZT0iZGVmYXVsdC1jb2xsYXRpb24iIGZvcm09InF1YWxpZmllZCIgdHlwZT0ieHNsOnVyaS1saXN0Ii8+Ci0gIDx4czphdHRyaWJ1dGUgbmFtZT0iZXh0ZW5zaW9uLWVsZW1lbnQtcHJlZml4ZXMiIGZvcm09InF1YWxpZmllZCIgdHlwZT0ieHNsOnByZWZpeGVzIi8+Ci0gIDx4czphdHRyaWJ1dGUgbmFtZT0iZXhjbHVkZS1yZXN1bHQtcHJlZml4ZXMiIGZvcm09InF1YWxpZmllZCIgdHlwZT0ieHNsOnByZWZpeGVzIi8+Ci0gIDx4czphdHRyaWJ1dGUgbmFtZT0ieHBhdGgtZGVmYXVsdC1uYW1lc3BhY2UiIGZvcm09InF1YWxpZmllZCIgdHlwZT0ieHM6YW55VVJJIi8+ICAgIAotICA8eHM6YXR0cmlidXRlIG5hbWU9ImluaGVyaXQtbmFtZXNwYWNlcyIgZm9ybT0icXVhbGlmaWVkIiB0eXBlPSJ4c2w6eWVzLW9yLW5vIiBkZWZhdWx0PSJ5ZXMiLz4KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ1c2UtYXR0cmlidXRlLXNldHMiIGZvcm09InF1YWxpZmllZCIgdHlwZT0ieHNsOlFOYW1lcyIgZGVmYXVsdD0iIi8+Ci0KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ1c2Utd2hlbiIgZm9ybT0icXVhbGlmaWVkIiB0eXBlPSJ4c2w6ZXhwcmVzc2lvbiIvPgotICA8eHM6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIGZvcm09InF1YWxpZmllZCIgdHlwZT0ieHM6ZGVjaW1hbCIvPgotICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIGZvcm09InF1YWxpZmllZCIgdHlwZT0ieHNsOlFOYW1lIi8+Ci0gIDx4czphdHRyaWJ1dGUgbmFtZT0idmFsaWRhdGlvbiIgZm9ybT0icXVhbGlmaWVkIiB0eXBlPSJ4c2w6dmFsaWRhdGlvbi10eXBlIi8+Ci08L3hzOmF0dHJpYnV0ZUdyb3VwPgotCi08eHM6Z3JvdXAgbmFtZT0icmVzdWx0LWVsZW1lbnRzIj4KLSAgPHhzOmNob2ljZT4KLSAgICA8eHM6ZWxlbWVudCByZWY9InhzbDpsaXRlcmFsLXJlc3VsdC1lbGVtZW50Ii8+Ci0gICAgPHhzOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ic2tpcCIvPgotCi0gICAgPHhzOmFueSBuYW1lc3BhY2U9IiMjbG9jYWwiIHByb2Nlc3NDb250ZW50cz0ic2tpcCIvPgotICA8L3hzOmNob2ljZT4KLTwveHM6Z3JvdXA+Ci0KLQotPCEtLSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KLTx4czphbm5vdGF0aW9uPgotICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICBQQVJUIEQ6IGRlZmluaXRpb25zIG9mIHNpbXBsZSB0eXBlcyB1c2VkIGluIHN0eWxlc2hlZXQgYXR0cmlidXRlcyAKLSAgPC94czpkb2N1bWVudGF0aW9uPgotPC94czphbm5vdGF0aW9uPiAgIAotPCEtLSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KLQotPHhzOnNpbXBsZVR5cGUgbmFtZT0iYXZ0Ij4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBUaGlzIHR5cGUgaXMgdXNlZCBmb3IgYWxsIGF0dHJpYnV0ZXMgdGhhdCBhbGxvdyBhbiBhdHRyaWJ1dGUgdmFsdWUgdGVtcGxhdGUuCi0gICAgICBUaGUgZ2VuZXJhbCBydWxlcyBmb3IgdGhlIHN5bnRheCBvZiBhdHRyaWJ1dGUgdmFsdWUgdGVtcGxhdGVzLCBhbmQgdGhlIHNwZWNpZmljCi0gICAgICBydWxlcyBmb3IgZWFjaCBzdWNoIGF0dHJpYnV0ZSwgYXJlIGRlc2NyaWJlZCBpbiB0aGUgWFNMVCAyLjAgUmVjb21tZW5kYXRpb24uCi0gICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciLz4KLTwveHM6c2ltcGxlVHlwZT4KLQotPHhzOnNpbXBsZVR5cGUgbmFtZT0iY2hhciI+Ci0gIDx4czphbm5vdGF0aW9uPgotCi0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBBIHN0cmluZyBjb250YWluaW5nIGV4YWN0bHkgb25lIGNoYXJhY3Rlci4KLSAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0gICAgPHhzOmxlbmd0aCB2YWx1ZT0iMSIvPgotICA8L3hzOnJlc3RyaWN0aW9uPgotPC94czpzaW1wbGVUeXBlPgotCi08eHM6c2ltcGxlVHlwZSBuYW1lPSJleHByZXNzaW9uIj4KLSAgPHhzOmFubm90YXRpb24+Ci0KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIEFuIFhQYXRoIDIuMCBleHByZXNzaW9uLgotICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgIDx4czpwYXR0ZXJuIHZhbHVlPSIuKyIvPgotICA8L3hzOnJlc3RyaWN0aW9uPgotPC94czpzaW1wbGVUeXBlPgotCi08eHM6c2ltcGxlVHlwZSBuYW1lPSJpbnB1dC10eXBlLWFubm90YXRpb25zLXR5cGUiPgotICA8eHM6YW5ub3RhdGlvbj4KLQotICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgRGVzY3JpYmVzIGhvdyB0eXBlIGFubm90YXRpb25zIGluIHNvdXJjZSBkb2N1bWVudHMgYXJlIGhhbmRsZWQuCi0gICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+Ci0gICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJwcmVzZXJ2ZSIvPgotICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ic3RyaXAiLz4gICAKLSAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InVuc3BlY2lmaWVkIi8+ICAgICAgICAKLSAgPC94czpyZXN0cmljdGlvbj4KLTwveHM6c2ltcGxlVHlwZT4KLQotPHhzOnNpbXBsZVR5cGUgbmFtZT0ibGV2ZWwiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIFRoZSBsZXZlbCBhdHRyaWJ1dGUgb2YgeHNsOm51bWJlcjogCi0gICAgICBvbmUgb2Ygc2luZ2xlLCBtdWx0aXBsZSwgb3IgYW55LgotICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6TkNOYW1lIj4KLSAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InNpbmdsZSIvPgotICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibXVsdGlwbGUiLz4KLSAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImFueSIvPgotCi0gIDwveHM6cmVzdHJpY3Rpb24+Ci08L3hzOnNpbXBsZVR5cGU+Ci0KLTx4czpzaW1wbGVUeXBlIG5hbWU9Im1vZGUiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIFRoZSBtb2RlIGF0dHJpYnV0ZSBvZiB4c2w6YXBwbHktdGVtcGxhdGVzOiAKLSAgICAgIGVpdGhlciBhIFFOYW1lLCBvciAjY3VycmVudCwgb3IgI2RlZmF1bHQuCi0gICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czp1bmlvbiBtZW1iZXJUeXBlcz0ieHNsOlFOYW1lIj4KLSAgICA8eHM6c2ltcGxlVHlwZT4KLQotICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLSAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIjZGVmYXVsdCIvPgotICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IiNjdXJyZW50Ii8+Ci0gICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgPC94czp1bmlvbj4KLTwveHM6c2ltcGxlVHlwZT4KLQotPHhzOnNpbXBsZVR5cGUgbmFtZT0ibW9kZXMiPgotICA8eHM6YW5ub3RhdGlvbj4KLQotICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgVGhlIG1vZGUgYXR0cmlidXRlIG9mIHhzbDp0ZW1wbGF0ZTogCi0gICAgICBlaXRoZXIgYSBsaXN0LCBlYWNoIG1lbWJlciBiZWluZyBlaXRoZXIgYSBRTmFtZSBvciAjZGVmYXVsdDsKLSAgICAgIG9yIHRoZSB2YWx1ZSAjYWxsCi0gICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czp1bmlvbj4KLSAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgIDx4czpsaXN0PgotICAgICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICAgICA8eHM6dW5pb24gbWVtYmVyVHlwZXM9InhzbDpRTmFtZSI+Ci0KLSAgICAgICAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iI2RlZmF1bHQiLz4KLSAgICAgICAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICAgICAgICA8L3hzOnVuaW9uPgotICAgICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgICA8L3hzOmxpc3Q+Ci0gICAgPC94czpzaW1wbGVUeXBlPgotCi0gICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IiNhbGwiLz4KLSAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgPC94czpzaW1wbGVUeXBlPgotICA8L3hzOnVuaW9uPgotPC94czpzaW1wbGVUeXBlPgotCi08eHM6c2ltcGxlVHlwZSBuYW1lPSJuYW1ldGVzdHMiPgotICA8eHM6YW5ub3RhdGlvbj4KLQotICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgQSBsaXN0IG9mIE5hbWVUZXN0cywgYXMgZGVmaW5lZCBpbiB0aGUgWFBhdGggMi4wIFJlY29tbWVuZGF0aW9uLgotICAgICAgRWFjaCBOYW1lVGVzdCBpcyBlaXRoZXIgYSBRTmFtZSwgb3IgIioiLCBvciAicHJlZml4OioiLCBvciAiKjpsb2NhbG5hbWUiCi0gICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpsaXN0PgotICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgPHhzOnVuaW9uIG1lbWJlclR5cGVzPSJ4c2w6UU5hbWUiPgotICAgICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotCi0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IioiLz4KLSAgICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+Ci0gICAgICAgICAgICA8eHM6cGF0dGVybiB2YWx1ZT0iXGlcYyo6XCoiLz4KLSAgICAgICAgICAgIDx4czpwYXR0ZXJuIHZhbHVlPSJcKjpcaVxjKiIvPiAgICAgICAgICAgIAotICAgICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgICAgIDwveHM6c2ltcGxlVHlwZT4KLQotICAgICAgPC94czp1bmlvbj4KLSAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gIDwveHM6bGlzdD4KLTwveHM6c2ltcGxlVHlwZT4KLQotPHhzOnNpbXBsZVR5cGUgbmFtZT0icHJlZml4ZXMiPgotICA8eHM6bGlzdCBpdGVtVHlwZT0ieHM6TkNOYW1lIi8+Ci08L3hzOnNpbXBsZVR5cGU+Ci0KLTx4czpzaW1wbGVUeXBlIG5hbWU9InByZWZpeC1saXN0LW9yLWFsbCI+Ci0gIDx4czp1bmlvbiBtZW1iZXJUeXBlcz0ieHNsOnByZWZpeC1saXN0Ij4KLSAgICA8eHM6c2ltcGxlVHlwZT4KLQotICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLSAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIjYWxsIi8+Ci0gICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgPC94czp1bmlvbj4KLTwveHM6c2ltcGxlVHlwZT4KLSAgICAgIAotPHhzOnNpbXBsZVR5cGUgbmFtZT0icHJlZml4LWxpc3QiPgotICA8eHM6bGlzdCBpdGVtVHlwZT0ieHNsOnByZWZpeC1vci1kZWZhdWx0Ii8+Ci08L3hzOnNpbXBsZVR5cGU+Ci0KLTx4czpzaW1wbGVUeXBlIG5hbWU9Im1ldGhvZCI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgVGhlIG1ldGhvZCBhdHRyaWJ1dGUgb2YgeHNsOm91dHB1dDoKLSAgICAgIEVpdGhlciBvbmUgb2YgdGhlIHJlY29nbml6ZWQgbmFtZXMgInhtbCIsICJ4aHRtbCIsICJodG1sIiwgInRleHQiLAotICAgICAgb3IgYSBRTmFtZSB0aGF0IG11c3QgaW5jbHVkZSBhIHByZWZpeC4KLSAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOnVuaW9uPgotICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5DTmFtZSI+Ci0gICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ieG1sIi8+Ci0KLSAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ4aHRtbCIvPgotICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Imh0bWwiLz4KLSAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ0ZXh0Ii8+Ci0gICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4c2w6UU5hbWUiPgotICAgICAgICA8eHM6cGF0dGVybiB2YWx1ZT0iXGMqOlxjKiIvPgotICAgICAgPC94czpyZXN0cmljdGlvbj4KLQotICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgPC94czp1bmlvbj4KLTwveHM6c2ltcGxlVHlwZT4KLQotPHhzOnNpbXBsZVR5cGUgbmFtZT0icGF0dGVybiI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgQSBtYXRjaCBwYXR0ZXJuIGFzIGRlZmluZWQgaW4gdGhlIFhTTFQgMi4wIFJlY29tbWVuZGF0aW9uLgotICAgICAgVGhlIHN5bnRheCBmb3IgcGF0dGVybnMgaXMgYSByZXN0cmljdGVkIGZvcm0gb2YgdGhlIHN5bnRheCBmb3IKLSAgICAgIFhQYXRoIDIuMCBleHByZXNzaW9ucy4KLSAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzbDpleHByZXNzaW9uIi8+Ci0KLTwveHM6c2ltcGxlVHlwZT4KLQotPHhzOnNpbXBsZVR5cGUgbmFtZT0icHJlZml4LW9yLWRlZmF1bHQiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIEVpdGhlciBhIG5hbWVzcGFjZSBwcmVmaXgsIG9yICNkZWZhdWx0LgotICAgICAgVXNlZCBpbiB0aGUgeHNsOm5hbWVzcGFjZS1hbGlhcyBlbGVtZW50LgotICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6dW5pb24gbWVtYmVyVHlwZXM9InhzOk5DTmFtZSI+Ci0gICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotCi0gICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iI2RlZmF1bHQiLz4KLSAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgPC94czpzaW1wbGVUeXBlPgotICA8L3hzOnVuaW9uPgotPC94czpzaW1wbGVUeXBlPgotCi08eHM6c2ltcGxlVHlwZSBuYW1lPSJRTmFtZXMiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIEEgbGlzdCBvZiBRTmFtZXMuCi0gICAgICBVc2VkIGluIHRoZSBbeHNsOl11c2UtYXR0cmlidXRlLXNldHMgYXR0cmlidXRlIG9mIHZhcmlvdXMgZWxlbWVudHMsCi0gICAgICBhbmQgaW4gdGhlIGNkYXRhLXNlY3Rpb24tZWxlbWVudHMgYXR0cmlidXRlIG9mIHhzbDpvdXRwdXQKLSAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6bGlzdCBpdGVtVHlwZT0ieHNsOlFOYW1lIi8+ICAgICAgICAgIAotPC94czpzaW1wbGVUeXBlPgotCi08eHM6c2ltcGxlVHlwZSBuYW1lPSJRTmFtZSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgQSBRTmFtZS4KLSAgICAgIFRoaXMgc2NoZW1hIGRvZXMgbm90IHVzZSB0aGUgYnVpbHQtaW4gdHlwZSB4czpRTmFtZSwgYnV0IHJhdGhlciBkZWZpbmVzIGl0cyBvd24KLSAgICAgIFFOYW1lIHR5cGUuIEFsdGhvdWdoIHhzOlFOYW1lIHdvdWxkIGRlZmluZSB0aGUgY29ycmVjdCB2YWxpZGF0aW9uIG9uIHRoZXNlIGF0dHJpYnV0ZXMsCi0gICAgICBhIHNjaGVtYSBwcm9jZXNzb3Igd291bGQgZXhwYW5kIHVucHJlZml4ZWQgUU5hbWVzIGluY29ycmVjdGx5IHdoZW4gY29uc3RydWN0aW5nIHRoZSBQU1ZJLAotICAgICAgYmVjYXVzZSAoYXMgZGVmaW5lZCBpbiBYTUwgU2NoZW1hIGVycmF0YSkgYW4gdW5wcmVmaXhlZCB4czpRTmFtZSBpcyBhc3N1bWVkIHRvIGJlIGluCi0gICAgICB0aGUgZGVmYXVsdCBuYW1lc3BhY2UsIHdoaWNoIGlzIG5vdCB0aGUgY29ycmVjdCBhc3N1bXB0aW9uIGZvciBYU0xULgotICAgICAgVGhlIGRhdGEgdHlwZSBpcyBkZWZpbmVkIGFzIGEgcmVzdHJpY3Rpb24gb2YgdGhlIGJ1aWx0LWluIHR5cGUgTmFtZSwgcmVzdHJpY3RlZAotICAgICAgc28gdGhhdCBpdCBjYW4gb25seSBjb250YWluIG9uZSBjb2xvbiB3aGljaCBtdXN0IG5vdCBiZSB0aGUgZmlyc3Qgb3IgbGFzdCBjaGFyYWN0ZXIuCi0gICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOYW1lIj4KLQotICAgIDx4czpwYXR0ZXJuIHZhbHVlPSIoW146XSs6KT9bXjpdKyIvPiAgICAgIAotICA8L3hzOnJlc3RyaWN0aW9uPiAgICAgICAgCi08L3hzOnNpbXBsZVR5cGU+Ci0KLTx4czpzaW1wbGVUeXBlIG5hbWU9InNlcXVlbmNlLXR5cGUiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIFRoZSBkZXNjcmlwdGlvbiBvZiBhIGRhdGEgdHlwZSwgY29uZm9ybWluZyB0byB0aGUKLSAgICAgIFNlcXVlbmNlVHlwZSBwcm9kdWN0aW9uIGRlZmluZWQgaW4gdGhlIFhQYXRoIDIuMCBSZWNvbW1lbmRhdGlvbgotICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotCi0gICAgPHhzOnBhdHRlcm4gdmFsdWU9Ii4rIi8+ICAgICAgCi0gIDwveHM6cmVzdHJpY3Rpb24+Ci08L3hzOnNpbXBsZVR5cGU+Ci0KLTx4czpzaW1wbGVUeXBlIG5hbWU9InVyaS1saXN0Ij4KLSAgPHhzOmxpc3QgaXRlbVR5cGU9InhzOmFueVVSSSIvPgotPC94czpzaW1wbGVUeXBlPgotCi08eHM6c2ltcGxlVHlwZSBuYW1lPSJ2YWxpZGF0aW9uLXN0cmlwLW9yLXByZXNlcnZlIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBEZXNjcmliZXMgZGlmZmVyZW50IHdheXMgb2YgdHlwZS1hbm5vdGF0aW5nIGFuIGVsZW1lbnQgb3IgYXR0cmlidXRlLgotICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLQotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4c2w6dmFsaWRhdGlvbi10eXBlIj4KLSAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InByZXNlcnZlIi8+Ci0gICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJzdHJpcCIvPiAgICAKLSAgPC94czpyZXN0cmljdGlvbj4KLTwveHM6c2ltcGxlVHlwZT4KLQotPHhzOnNpbXBsZVR5cGUgbmFtZT0idmFsaWRhdGlvbi10eXBlIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBEZXNjcmliZXMgZGlmZmVyZW50IHdheXMgb2YgdHlwZS1hbm5vdGF0aW5nIGFuIGVsZW1lbnQgb3IgYXR0cmlidXRlLgotICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLQotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+Ci0gICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJzdHJpY3QiLz4KLSAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImxheCIvPgotICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0icHJlc2VydmUiLz4KLSAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InN0cmlwIi8+ICAgIAotICA8L3hzOnJlc3RyaWN0aW9uPgotPC94czpzaW1wbGVUeXBlPgotCi08eHM6c2ltcGxlVHlwZSBuYW1lPSJ5ZXMtb3Itbm8iPgotICA8eHM6YW5ub3RhdGlvbj4KLQotICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgT25lIG9mIHRoZSB2YWx1ZXMgInllcyIgb3IgIm5vIi4KLSAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLSAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InllcyIvPgotICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibm8iLz4KLSAgPC94czpyZXN0cmljdGlvbj4KLTwveHM6c2ltcGxlVHlwZT4KLQotPHhzOnNpbXBsZVR5cGUgbmFtZT0ieWVzLW9yLW5vLW9yLW9taXQiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIE9uZSBvZiB0aGUgdmFsdWVzICJ5ZXMiIG9yICJubyIgb3IgIm9taXQiLgotICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ieWVzIi8+Ci0gICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJubyIvPgotICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ib21pdCIvPgotCi0gIDwveHM6cmVzdHJpY3Rpb24+Ci08L3hzOnNpbXBsZVR5cGU+Ci0KLTwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUveHNsdC1zY2hlbWFzL3hzbHQtMi4wLnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3hzbHQtc2NoZW1hcy94c2x0LTIuMC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxZmQyMDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUveHNsdC1zY2hlbWFzL3hzbHQtMi4wLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExNzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyAtIFczQywgU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsLAotICogYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERhdmlkIENhcnZlciAtIDIwMDgwMzMwIC0gU1RBUiAtIGJ1ZyAyMjQ4MTkgLSBjaGFuZ2VkIHByb2Nlc0NvbnRlbnRzIGZyb20gbGF4IHRvIHNraXAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBXM0PCriBTT0ZUV0FSRSBOT1RJQ0UgQU5EIExJQ0VOU0UKLSAqIGh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvY29weXJpZ2h0LXNvZnR3YXJlLTE5OTgwNzIwCi0gKgotICogQ29weXJpZ2h0IMKpIDE5OTQtMjAwMiBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtLCAoTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YKLSAqIFRlY2hub2xvZ3ksIEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgZW4gQXV0b21hdGlxdWUsCi0gKiBLZWlvIFVuaXZlcnNpdHkpLiBBbGwgUmlnaHRzIFJlc2VydmVkLiBodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsLwotICoKLSAqIFRoaXMgVzNDIHdvcmsgKGluY2x1ZGluZyBzb2Z0d2FyZSwgZG9jdW1lbnRzLCBvciBvdGhlciByZWxhdGVkIGl0ZW1zKSBpcyBiZWluZwotICogcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIHVuZGVyIHRoZSBmb2xsb3dpbmcgbGljZW5zZS4gQnkgb2J0YWluaW5nLAotICogdXNpbmcgYW5kL29yIGNvcHlpbmcgdGhpcyB3b3JrLCB5b3UgKHRoZSBsaWNlbnNlZSkgYWdyZWUgdGhhdCB5b3UgaGF2ZSByZWFkLAotICogdW5kZXJzdG9vZCwgYW5kIHdpbGwgY29tcGx5IHdpdGggdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9uczoKLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKLSAqIGRvY3VtZW50YXRpb24sIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sICBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlCi0gKiBvciByb3lhbHR5IGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHlvdSBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgb24gQUxMIGNvcGllcwotICogb2YgdGhlIHNvZnR3YXJlIGFuZCBkb2N1bWVudGF0aW9uIG9yIHBvcnRpb25zIHRoZXJlb2YsIGluY2x1ZGluZyBtb2RpZmljYXRpb25zLCB0aGF0Ci0gKiB5b3UgbWFrZToKLSAqCi0gKiAgMS4gVGhlIGZ1bGwgdGV4dCBvZiB0aGlzIE5PVElDRSBpbiBhIGxvY2F0aW9uIHZpZXdhYmxlIHRvIHVzZXJzIG9mIHRoZSByZWRpc3RyaWJ1dGVkCi0gKiAgICAgb3IgZGVyaXZhdGl2ZSB3b3JrLgotICogIDIuIEFueSBwcmUtZXhpc3RpbmcgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGRpc2NsYWltZXJzLCBub3RpY2VzLCBvciB0ZXJtcyBhbmQKLSAqICAgICBjb25kaXRpb25zLiBJZiBub25lIGV4aXN0LCBhIHNob3J0IG5vdGljZSBvZiB0aGUgZm9sbG93aW5nIGZvcm0gKGh5cGVydGV4dCBpcyBwcmVmZXJyZWQsIHRleHQgaXMgcGVybWl0dGVkKSBzaG91bGQgYmUgdXNlZCB3aXRoaW4gdGhlIGJvZHkgb2YgYW55IHJlZGlzdHJpYnV0ZWQgb3IgZGVyaXZhdGl2ZSBjb2RlOiAiQ29weXJpZ2h0IMKpIFskZGF0ZS1vZi1zb2Z0d2FyZV0gV29ybGQgV2lkZSBXZWIgQ29uc29ydGl1bSwgKE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgZW4gQXV0b21hdGlxdWUsIEtlaW8gVW5pdmVyc2l0eSkuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIGh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvIgotICogIDMuIE5vdGljZSBvZiBhbnkgY2hhbmdlcyBvciBtb2RpZmljYXRpb25zIHRvIHRoZSBXM0MgZmlsZXMsIGluY2x1ZGluZyB0aGUgZGF0ZSBjaGFuZ2VzCi0gKiAgICAgd2VyZSBtYWRlLiAoV2UgcmVjb21tZW5kIHlvdSBwcm92aWRlIFVSSXMgdG8gdGhlIGxvY2F0aW9uIGZyb20gd2hpY2ggdGhlIGNvZGUgaXMKLSAqICAgICBkZXJpdmVkLikKLSAqCi0gKiBUSElTIFNPRlRXQVJFIEFORCBET0NVTUVOVEFUSU9OIElTIFBST1ZJREVEICJBUyBJUywiIEFORCBDT1BZUklHSFQgSE9MREVSUyBNQUtFIE5PIAotICogUkVQUkVTRU5UQVRJT05TIE9SIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTywgCi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBTlkgUEFSVElDVUxBUiBQVVJQT1NFIE9SIFRIQVQgVEhFIFVTRSBPRgotICogVEhFIFNPRlRXQVJFIE9SIERPQ1VNRU5UQVRJT04gV0lMTCBOT1QgSU5GUklOR0UgQU5ZIFRISVJEIFBBUlRZIFBBVEVOVFMsIENPUFlSSUdIVFMsCi0gKiBUUkFERU1BUktTIE9SIE9USEVSIFJJR0hUUy4KLSAqCi0gKiBDT1BZUklHSFQgSE9MREVSUyBXSUxMIE5PVCBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBTUEVDSUFMIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgQU5ZIFVTRSBPRiBUSEUgU09GVFdBUkUgT1IgRE9DVU1FTlRBVElPTi4KLSAqCi0gKiBUaGUgbmFtZSBhbmQgdHJhZGVtYXJrcyBvZiBjb3B5cmlnaHQgaG9sZGVycyBtYXkgTk9UIGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5Ci0gKiBwZXJ0YWluaW5nIHRvIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uIFRpdGxlIHRvIGNvcHlyaWdodAotICogaW4gdGhpcyBzb2Z0d2FyZSBhbmQgYW55IGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiB3aWxsIGF0IGFsbCB0aW1lcyByZW1haW4gd2l0aCBjb3B5cmlnaHQKLSAqIGhvbGRlcnMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAtLT4KLTx4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIj4KLQotPCEtLSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KLTx4czphbm5vdGF0aW9uPgotICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgCi0gICAgVGhpcyBpcyBhIHNjaGVtYSBmb3IgWFNMVCAyLjAgc3R5bGVzaGVldHMuCi0gICAgCi0gICAgSXQgZGVmaW5lcyBhbGwgdGhlIGVsZW1lbnRzIHRoYXQgYXBwZWFyIGluIHRoZSBYU0xUIG5hbWVzcGFjZTsgaXQgYWxzbwotICAgIHByb3ZpZGVzIGhvb2tzIHRoYXQgYWxsb3cgdGhlIGluY2x1c2lvbiBvZiB1c2VyLWRlZmluZWQgbGl0ZXJhbCByZXN1bHQgZWxlbWVudHMsCi0gICAgZXh0ZW5zaW9uIGluc3RydWN0aW9ucywgYW5kIHRvcC1sZXZlbCBkYXRhIGVsZW1lbnRzLgotICAgIAotICAgIFRoZSBzY2hlbWEgaXMgZGVyaXZlZCAod2l0aCBraW5kIHBlcm1pc3Npb24pIGZyb20gYSBzY2hlbWEgZm9yIFhTTFQgMS4wIHN0eWxlc2hlZXRzCi0gICAgcHJvZHVjZWQgYnkgQXNpciBTIFZlZGFtdXRodSBvZiBXZWJNZXRob2RzIEluYy4KLSAgICAKLSAgICBUaGlzIHNjaGVtYSBpcyBhdmFpbGFibGUgZm9yIHVzZSB1bmRlciB0aGUgY29uZGl0aW9ucyBvZiB0aGUgVzNDIFNvZnR3YXJlIExpY2Vuc2UKLSAgICBwdWJsaXNoZWQgYXQgaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC9jb3B5cmlnaHQtc29mdHdhcmUtMTk5ODA3MjAKLSAgICAKLSAgICBUaGUgc2NoZW1hIGlzIG9yZ2FuaXplZCBhcyBmb2xsb3dzOgotICAgIAotICAgIFBBUlQgQTogZGVmaW5pdGlvbnMgb2YgY29tcGxleCB0eXBlcyBhbmQgbW9kZWwgZ3JvdXBzIHVzZWQgYXMgdGhlIGJhc2lzIAotICAgICAgICAgICAgZm9yIGVsZW1lbnQgZGVmaW5pdGlvbnMKLSAgICBQQVJUIEI6IGRlZmluaXRpb25zIG9mIGluZGl2aWR1YWwgWFNMVCBlbGVtZW50cwotICAgIFBBUlQgQzogZGVmaW5pdGlvbnMgZm9yIGxpdGVyYWwgcmVzdWx0IGVsZW1lbnRzCi0gICAgUEFSVCBEOiBkZWZpbml0aW9ucyBvZiBzaW1wbGUgdHlwZXMgdXNlZCBpbiBhdHRyaWJ1dGUgZGVmaW5pdGlvbnMKLSAgICAKLSAgICBUaGlzIHNjaGVtYSBkb2VzIG5vdCBhdHRlbXB0IHRvIGRlZmluZSBhbGwgdGhlIGNvbnN0cmFpbnRzIHRoYXQgYXBwbHkgdG8gYSB2YWxpZAotICAgIFhTTFQgMi4wIHN0eWxlc2hlZXQgbW9kdWxlLiBJdCBpcyB0aGUgaW50ZW50aW9uIHRoYXQgYWxsIHZhbGlkIHN0eWxlc2hlZXQgbW9kdWxlcyAKLSAgICBzaG91bGQgY29uZm9ybSB0byB0aGlzIHNjaGVtYTsgaG93ZXZlciwgdGhlIHNjaGVtYSBpcyBub24tbm9ybWF0aXZlIGFuZCBpbiB0aGUgZXZlbnQgCi0gICAgb2YgYW55IGNvbmZsaWN0LCB0aGUgdGV4dCBvZiB0aGUgUmVjb21tZW5kYXRpb24gdGFrZXMgcHJlY2VkZW5jZS4KLQotICAgIFRoaXMgc2NoZW1hIGRvZXMgbm90IGltcGxlbWVudCB0aGUgc3BlY2lhbCBydWxlcyB0aGF0IGFwcGx5IHdoZW4gYSBzdHlsZXNoZWV0Ci0gICAgaGFzIHNlY3Rpb25zIHRoYXQgdXNlIGZvcndhcmRzLWNvbXBhdGlibGUtbW9kZS4gSW4gdGhpcyBtb2RlLCBzZXR0aW5nIHZlcnNpb249IjMuMCIKLSAgICBhbGxvd3MgZWxlbWVudHMgZnJvbSB0aGUgWFNMVCBuYW1lc3BhY2UgdG8gYmUgdXNlZCB0aGF0IGFyZSBub3QgZGVmaW5lZCBpbiBYU0xUIDIuMC4KLQotICAgIFNpbXBsaWZpZWQgc3R5bGVzaGVldHMgKHRob3NlIHdpdGggYSBsaXRlcmFsIHJlc3VsdCBlbGVtZW50IGFzIHRoZSBvdXRlcm1vc3QgZWxlbWVudCkKLSAgICB3aWxsIHZhbGlkYXRlIGFnYWluc3QgdGhpcyBzY2hlbWEgb25seSBpZiB2YWxpZGF0aW9uIHN0YXJ0cyBpbiBsYXggbW9kZS4KLSAgICAKLSAgICBUaGlzIHZlcnNpb24gaXMgZGF0ZWQgMjAwNS0wMi0xMQotICAgIEF1dGhvcnM6IE1pY2hhZWwgSCBLYXksIFNheG9uaWNhIExpbWl0ZWQKLSAgICAgICAgICAgICBKZW5pIFRlbm5pc29uLCBKZW5pIFRlbm5pc29uIENvbnN1bHRpbmcgTHRkLgotICAgIAotICA8L3hzOmRvY3VtZW50YXRpb24+Ci08L3hzOmFubm90YXRpb24+ICAgCi08IS0tICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgotIAotPCEtLQotVGhlIGRlY2xhcmF0aW9uIG9mIHhtbDpzcGFjZSBhbmQgeG1sOmxhbmcgbWF5IG5lZWQgdG8gYmUgY29tbWVudGVkIG91dCBiZWNhdXNlCi1vZiBwcm9ibGVtcyBwcm9jZXNzaW5nIHRoZSBzY2hlbWEgdXNpbmcgdmFyaW91cyB0b29scwotLS0+Ci0gICAgICAKLTx4czppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiIAotICBzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIi8+Ci0KLTwhLS0gCi0gICAgQW4gWFNMVCBzdHlsZXNoZWV0IG1heSBjb250YWluIGFuIGluLWxpbmUgc2NoZW1hIHdpdGhpbiBhbiB4c2w6aW1wb3J0LXNjaGVtYSBlbGVtZW50LAotICAgIHNvIHRoZSBTY2hlbWEgZm9yIHNjaGVtYXMgbmVlZHMgdG8gYmUgaW1wb3J0ZWQKLS0tPgotICAKLTx4czppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICAgICAgICAgIHNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS54c2QiLz4KLQotPCEtLSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KLTx4czphbm5vdGF0aW9uPgotICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICBQQVJUIEE6IGRlZmluaXRpb25zIG9mIGNvbXBsZXggdHlwZXMgYW5kIG1vZGVsIGdyb3VwcyB1c2VkIGFzIHRoZSBiYXNpcyAKLSAgICAgICAgICAgIGZvciBlbGVtZW50IGRlZmluaXRpb25zCi0gIDwveHM6ZG9jdW1lbnRhdGlvbj4KLTwveHM6YW5ub3RhdGlvbj4gICAKLTwhLS0gKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+Ci0KLTx4czpjb21wbGV4VHlwZSBuYW1lPSJnZW5lcmljLWVsZW1lbnQtdHlwZSIgbWl4ZWQ9InRydWUiPgotICA8eHM6YXR0cmlidXRlIG5hbWU9ImRlZmF1bHQtY29sbGF0aW9uIiB0eXBlPSJ4c2w6dXJpLWxpc3QiLz4KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJleGNsdWRlLXJlc3VsdC1wcmVmaXhlcyIgdHlwZT0ieHNsOnByZWZpeC1saXN0LW9yLWFsbCIvPgotICA8eHM6YXR0cmlidXRlIG5hbWU9ImV4dGVuc2lvbi1lbGVtZW50LXByZWZpeGVzIiB0eXBlPSJ4c2w6cHJlZml4LWxpc3QiLz4KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ1c2Utd2hlbiIgdHlwZT0ieHNsOmV4cHJlc3Npb24iLz4KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4cGF0aC1kZWZhdWx0LW5hbWVzcGFjZSIgdHlwZT0ieHM6YW55VVJJIi8+Ci0gIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9InNraXAiLz4KLTwveHM6Y29tcGxleFR5cGU+Ci0KLTx4czpjb21wbGV4VHlwZSBuYW1lPSJ2ZXJzaW9uZWQtZWxlbWVudC10eXBlIiBtaXhlZD0idHJ1ZSI+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDpnZW5lcmljLWVsZW1lbnQtdHlwZSI+ICAgIAotICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJ4czpkZWNpbWFsIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgPC94czpleHRlbnNpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci08L3hzOmNvbXBsZXhUeXBlPgotCi08eHM6Y29tcGxleFR5cGUgbmFtZT0iZWxlbWVudC1vbmx5LXZlcnNpb25lZC1lbGVtZW50LXR5cGUiIG1peGVkPSJmYWxzZSI+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHNsOnZlcnNpb25lZC1lbGVtZW50LXR5cGUiPgotICAgICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ic2tpcCIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci08L3hzOmNvbXBsZXhUeXBlPgotCi08eHM6Y29tcGxleFR5cGUgbmFtZT0ic2VxdWVuY2UtY29uc3RydWN0b3IiPgotICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOnZlcnNpb25lZC1lbGVtZW50LXR5cGUiPiAgICAKLSAgICAgIDx4czpncm91cCByZWY9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3Rvci1ncm91cCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHM6ZXh0ZW5zaW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotPC94czpjb21wbGV4VHlwZT4KLQotPHhzOmdyb3VwIG5hbWU9InNlcXVlbmNlLWNvbnN0cnVjdG9yLWdyb3VwIj4KLSAgPHhzOmNob2ljZT4KLSAgICA8eHM6ZWxlbWVudCByZWY9InhzbDp2YXJpYWJsZSIvPgotICAgIDx4czplbGVtZW50IHJlZj0ieHNsOmluc3RydWN0aW9uIi8+Ci0gICAgPHhzOmdyb3VwIHJlZj0ieHNsOnJlc3VsdC1lbGVtZW50cyIvPgotICA8L3hzOmNob2ljZT4KLTwveHM6Z3JvdXA+Ci0KLTx4czplbGVtZW50IG5hbWU9ImRlY2xhcmF0aW9uIiB0eXBlPSJ4c2w6Z2VuZXJpYy1lbGVtZW50LXR5cGUiIGFic3RyYWN0PSJ0cnVlIi8+Ci0KLTx4czplbGVtZW50IG5hbWU9Imluc3RydWN0aW9uIiB0eXBlPSJ4c2w6dmVyc2lvbmVkLWVsZW1lbnQtdHlwZSIgYWJzdHJhY3Q9InRydWUiLz4KLQotPCEtLSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KLTx4czphbm5vdGF0aW9uPgotICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICBQQVJUIEI6IGRlZmluaXRpb25zIG9mIGluZGl2aWR1YWwgWFNMVCBlbGVtZW50cyAgICAKLSAgICBFbGVtZW50cyBhcmUgbGlzdGVkIGluIGFscGhhYmV0aWNhbCBvcmRlci4gICAgCi0gIDwveHM6ZG9jdW1lbnRhdGlvbj4KLTwveHM6YW5ub3RhdGlvbj4gICAKLTwhLS0gKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+Ci0KLTx4czplbGVtZW50IG5hbWU9ImFuYWx5emUtc3RyaW5nIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmluc3RydWN0aW9uIj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOmVsZW1lbnQtb25seS12ZXJzaW9uZWQtZWxlbWVudC10eXBlIj4KLSAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieHNsOm1hdGNoaW5nLXN1YnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4c2w6bm9uLW1hdGNoaW5nLXN1YnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4c2w6ZmFsbGJhY2siIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzZWxlY3QiIHR5cGU9InhzbDpleHByZXNzaW9uIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVnZXgiIHR5cGU9InhzbDphdnQiIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmbGFncyIgdHlwZT0ieHNsOmF2dCIgZGVmYXVsdD0iIi8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJhcHBseS1pbXBvcnRzIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmluc3RydWN0aW9uIj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOmVsZW1lbnQtb25seS12ZXJzaW9uZWQtZWxlbWVudC10eXBlIj4KLSAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieHNsOndpdGgtcGFyYW0iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9ImFwcGx5LXRlbXBsYXRlcyIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDppbnN0cnVjdGlvbiI+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDplbGVtZW50LW9ubHktdmVyc2lvbmVkLWVsZW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4c2w6c29ydCIvPgotICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieHNsOndpdGgtcGFyYW0iLz4KLSAgICAgICAgPC94czpjaG9pY2U+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2VsZWN0IiB0eXBlPSJ4c2w6ZXhwcmVzc2lvbiIgZGVmYXVsdD0iY2hpbGQ6Om5vZGUoKSIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1vZGUiIHR5cGU9InhzbDptb2RlIi8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUiIHN1YnN0aXR1dGlvbkdyb3VwPSJ4c2w6aW5zdHJ1Y3Rpb24iPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50IG1peGVkPSJ0cnVlIj4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOnNlcXVlbmNlLWNvbnN0cnVjdG9yIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2w6YXZ0IiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJ4c2w6YXZ0Ii8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2VsZWN0IiB0eXBlPSJ4c2w6ZXhwcmVzc2lvbiIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNlcGFyYXRvciIgdHlwZT0ieHNsOmF2dCIvPiAgIAotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzbDpRTmFtZSIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZhbGlkYXRpb24iIHR5cGU9InhzbDp2YWxpZGF0aW9uLXR5cGUiLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+ICAgICAgICAKLQotPHhzOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLXNldCIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDpkZWNsYXJhdGlvbiI+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDplbGVtZW50LW9ubHktdmVyc2lvbmVkLWVsZW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4czpzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzbDphdHRyaWJ1dGUiLz4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2w6UU5hbWUiIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ1c2UtYXR0cmlidXRlLXNldHMiIHR5cGU9InhzbDpRTmFtZXMiIGRlZmF1bHQ9IiIvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0iY2FsbC10ZW1wbGF0ZSIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDppbnN0cnVjdGlvbiI+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDplbGVtZW50LW9ubHktdmVyc2lvbmVkLWVsZW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzbDp3aXRoLXBhcmFtIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNsOlFOYW1lIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJjaGFyYWN0ZXItbWFwIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmRlY2xhcmF0aW9uIj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOmVsZW1lbnQtb25seS12ZXJzaW9uZWQtZWxlbWVudC10eXBlIj4KLSAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieHNsOm91dHB1dC1jaGFyYWN0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2w6UU5hbWUiIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ1c2UtY2hhcmFjdGVyLW1hcHMiIHR5cGU9InhzbDpRTmFtZXMiIGRlZmF1bHQ9IiIvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0iY2hvb3NlIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmluc3RydWN0aW9uIj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOmVsZW1lbnQtb25seS12ZXJzaW9uZWQtZWxlbWVudC10eXBlIj4KLSAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieHNsOndoZW4iIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4c2w6b3RoZXJ3aXNlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9ImNvbW1lbnQiIHN1YnN0aXR1dGlvbkdyb3VwPSJ4c2w6aW5zdHJ1Y3Rpb24iPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50IG1peGVkPSJ0cnVlIj4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOnNlcXVlbmNlLWNvbnN0cnVjdG9yIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzZWxlY3QiIHR5cGU9InhzbDpleHByZXNzaW9uIi8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJjb3B5IiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmluc3RydWN0aW9uIj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0idHJ1ZSI+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3RvciI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY29weS1uYW1lc3BhY2VzIiB0eXBlPSJ4c2w6eWVzLW9yLW5vIiBkZWZhdWx0PSJ5ZXMiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJpbmhlcml0LW5hbWVzcGFjZXMiIHR5cGU9InhzbDp5ZXMtb3Itbm8iIGRlZmF1bHQ9InllcyIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InVzZS1hdHRyaWJ1dGUtc2V0cyIgdHlwZT0ieHNsOlFOYW1lcyIgZGVmYXVsdD0iIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHNsOlFOYW1lIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmFsaWRhdGlvbiIgdHlwZT0ieHNsOnZhbGlkYXRpb24tdHlwZSIvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0iY29weS1vZiIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDppbnN0cnVjdGlvbiI+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6dmVyc2lvbmVkLWVsZW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2VsZWN0IiB0eXBlPSJ4c2w6ZXhwcmVzc2lvbiIgdXNlPSJyZXF1aXJlZCIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNvcHktbmFtZXNwYWNlcyIgdHlwZT0ieHNsOnllcy1vci1ubyIgZGVmYXVsdD0ieWVzIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHNsOlFOYW1lIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmFsaWRhdGlvbiIgdHlwZT0ieHNsOnZhbGlkYXRpb24tdHlwZSIvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0iZGVjaW1hbC1mb3JtYXQiIHN1YnN0aXR1dGlvbkdyb3VwPSJ4c2w6ZGVjbGFyYXRpb24iPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6ZWxlbWVudC1vbmx5LXZlcnNpb25lZC1lbGVtZW50LXR5cGUiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzbDpRTmFtZSIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImRlY2ltYWwtc2VwYXJhdG9yIiB0eXBlPSJ4c2w6Y2hhciIgZGVmYXVsdD0iLiIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Imdyb3VwaW5nLXNlcGFyYXRvciIgdHlwZT0ieHNsOmNoYXIiIGRlZmF1bHQ9IiwiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJpbmZpbml0eSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSJJbmZpbml0eSIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1pbnVzLXNpZ24iIHR5cGU9InhzbDpjaGFyIiBkZWZhdWx0PSItIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iTmFOIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9Ik5hTiIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InBlcmNlbnQiIHR5cGU9InhzbDpjaGFyIiBkZWZhdWx0PSIlIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icGVyLW1pbGxlIiB0eXBlPSJ4c2w6Y2hhciIgZGVmYXVsdD0iJiN4MjAzMDsiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ6ZXJvLWRpZ2l0IiB0eXBlPSJ4c2w6Y2hhciIgZGVmYXVsdD0iMCIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImRpZ2l0IiB0eXBlPSJ4c2w6Y2hhciIgZGVmYXVsdD0iIyIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InBhdHRlcm4tc2VwYXJhdG9yIiB0eXBlPSJ4c2w6Y2hhciIgZGVmYXVsdD0iOyIvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0iZWxlbWVudCIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDppbnN0cnVjdGlvbiI+Ci0gIDx4czpjb21wbGV4VHlwZSBtaXhlZD0idHJ1ZSI+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3IiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzbDphdnQiIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InhzbDphdnQiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJpbmhlcml0LW5hbWVzcGFjZXMiIHR5cGU9InhzbDp5ZXMtb3Itbm8iIGRlZmF1bHQ9InllcyIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InVzZS1hdHRyaWJ1dGUtc2V0cyIgdHlwZT0ieHNsOlFOYW1lcyIgZGVmYXVsdD0iIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHNsOlFOYW1lIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmFsaWRhdGlvbiIgdHlwZT0ieHNsOnZhbGlkYXRpb24tdHlwZSIvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0iZmFsbGJhY2siIHN1YnN0aXR1dGlvbkdyb3VwPSJ4c2w6aW5zdHJ1Y3Rpb24iIHR5cGU9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3RvciIvPgotCi08eHM6ZWxlbWVudCBuYW1lPSJmb3ItZWFjaCIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDppbnN0cnVjdGlvbiI+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6dmVyc2lvbmVkLWVsZW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzbDpzb3J0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgPHhzOmdyb3VwIHJlZj0ieHNsOnNlcXVlbmNlLWNvbnN0cnVjdG9yLWdyb3VwIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2VsZWN0IiB0eXBlPSJ4c2w6ZXhwcmVzc2lvbiIgdXNlPSJyZXF1aXJlZCIvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0iZm9yLWVhY2gtZ3JvdXAiIHN1YnN0aXR1dGlvbkdyb3VwPSJ4c2w6aW5zdHJ1Y3Rpb24iPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50IG1peGVkPSJ0cnVlIj4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOnZlcnNpb25lZC1lbGVtZW50LXR5cGUiPgotICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4c2w6c29ydCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDx4czpncm91cCByZWY9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3Rvci1ncm91cCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNlbGVjdCIgdHlwZT0ieHNsOmV4cHJlc3Npb24iIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJncm91cC1ieSIgdHlwZT0ieHNsOmV4cHJlc3Npb24iLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJncm91cC1hZGphY2VudCIgdHlwZT0ieHNsOmV4cHJlc3Npb24iLz4gICAgICAgICAgICAKLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJncm91cC1zdGFydGluZy13aXRoIiB0eXBlPSJ4c2w6cGF0dGVybiIvPiAgICAgICAgICAgIAotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Imdyb3VwLWVuZGluZy13aXRoIiB0eXBlPSJ4c2w6cGF0dGVybiIvPiAgICAgICAgICAgIAotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNvbGxhdGlvbiIgdHlwZT0ieHM6YW55VVJJIi8+ICAgICAgICAgICAgCi0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJmdW5jdGlvbiIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDpkZWNsYXJhdGlvbiI+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6dmVyc2lvbmVkLWVsZW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzbDpwYXJhbSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDx4czpncm91cCByZWY9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3Rvci1ncm91cCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzbDpRTmFtZSIgdXNlPSJyZXF1aXJlZCIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im92ZXJyaWRlIiB0eXBlPSJ4c2w6eWVzLW9yLW5vIiBkZWZhdWx0PSJ5ZXMiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJhcyIgdHlwZT0ieHNsOnNlcXVlbmNlLXR5cGUiIGRlZmF1bHQ9Iml0ZW0oKSoiLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9ImlmIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmluc3RydWN0aW9uIj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0idHJ1ZSI+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3RvciI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idGVzdCIgdHlwZT0ieHNsOmV4cHJlc3Npb24iIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9ImltcG9ydCI+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDplbGVtZW50LW9ubHktdmVyc2lvbmVkLWVsZW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaHJlZiIgdHlwZT0ieHM6YW55VVJJIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJpbXBvcnQtc2NoZW1hIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmRlY2xhcmF0aW9uIj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOmVsZW1lbnQtb25seS12ZXJzaW9uZWQtZWxlbWVudC10eXBlIj4KLSAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6c2NoZW1hIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6YW55VVJJIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hLWxvY2F0aW9uIiB0eXBlPSJ4czphbnlVUkkiLz4gICAgICAgICAgICAgICAgICAKLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGUiIHN1YnN0aXR1dGlvbkdyb3VwPSJ4c2w6ZGVjbGFyYXRpb24iPgotICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6ZWxlbWVudC1vbmx5LXZlcnNpb25lZC1lbGVtZW50LXR5cGUiPgotICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaHJlZiIgdHlwZT0ieHM6YW55VVJJIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0ia2V5IiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmRlY2xhcmF0aW9uIj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0idHJ1ZSI+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3RvciI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNsOlFOYW1lIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWF0Y2giIHR5cGU9InhzbDpwYXR0ZXJuIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idXNlIiB0eXBlPSJ4c2w6ZXhwcmVzc2lvbiIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNvbGxhdGlvbiIgdHlwZT0ieHM6YW55VVJJIi8+ICAgICAgICAgICAgICAgCi0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJtYXRjaGluZy1zdWJzdHJpbmciIHR5cGU9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3RvciIvPgotCi08eHM6ZWxlbWVudCBuYW1lPSJtZXNzYWdlIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmluc3RydWN0aW9uIj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0idHJ1ZSI+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3RvciI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2VsZWN0IiB0eXBlPSJ4c2w6ZXhwcmVzc2lvbiIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InRlcm1pbmF0ZSIgdHlwZT0ieHNsOmF2dCIgZGVmYXVsdD0ibm8iLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9Im5hbWVzcGFjZSIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDppbnN0cnVjdGlvbiI+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3IiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzbDphdnQiIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzZWxlY3QiIHR5cGU9InhzbDpleHByZXNzaW9uIi8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJuYW1lc3BhY2UtYWxpYXMiIHN1YnN0aXR1dGlvbkdyb3VwPSJ4c2w6ZGVjbGFyYXRpb24iPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6ZWxlbWVudC1vbmx5LXZlcnNpb25lZC1lbGVtZW50LXR5cGUiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InN0eWxlc2hlZXQtcHJlZml4IiB0eXBlPSJ4c2w6cHJlZml4LW9yLWRlZmF1bHQiIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtcHJlZml4IiB0eXBlPSJ4c2w6cHJlZml4LW9yLWRlZmF1bHQiIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9Im5leHQtbWF0Y2giIHN1YnN0aXR1dGlvbkdyb3VwPSJ4c2w6aW5zdHJ1Y3Rpb24iPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6ZWxlbWVudC1vbmx5LXZlcnNpb25lZC1lbGVtZW50LXR5cGUiPgotICAgICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieHNsOndpdGgtcGFyYW0iLz4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzbDpmYWxsYmFjayIvPgotICAgICAgICA8L3hzOmNob2ljZT4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9Im5vbi1tYXRjaGluZy1zdWJzdHJpbmciIHR5cGU9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3RvciIvPgotCi08eHM6ZWxlbWVudCBuYW1lPSJudW1iZXIiIHN1YnN0aXR1dGlvbkdyb3VwPSJ4c2w6aW5zdHJ1Y3Rpb24iPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50IG1peGVkPSJ0cnVlIj4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOnZlcnNpb25lZC1lbGVtZW50LXR5cGUiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2w6ZXhwcmVzc2lvbiIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNlbGVjdCIgdHlwZT0ieHNsOmV4cHJlc3Npb24iLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJsZXZlbCIgdHlwZT0ieHNsOmxldmVsIiBkZWZhdWx0PSJzaW5nbGUiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjb3VudCIgdHlwZT0ieHNsOnBhdHRlcm4iLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmcm9tIiB0eXBlPSJ4c2w6cGF0dGVybiIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZvcm1hdCIgdHlwZT0ieHNsOmF2dCIgZGVmYXVsdD0iMSIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImxhbmciIHR5cGU9InhzbDphdnQiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJsZXR0ZXItdmFsdWUiIHR5cGU9InhzbDphdnQiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJvcmRpbmFsIiB0eXBlPSJ4c2w6YXZ0Ii8+ICAgICAgICAKLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJncm91cGluZy1zZXBhcmF0b3IiIHR5cGU9InhzbDphdnQiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJncm91cGluZy1zaXplIiB0eXBlPSJ4c2w6YXZ0Ii8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJvdGhlcndpc2UiIHR5cGU9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3RvciIvPgotCi08eHM6ZWxlbWVudCBuYW1lPSJvdXRwdXQiIHN1YnN0aXR1dGlvbkdyb3VwPSJ4c2w6ZGVjbGFyYXRpb24iPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50IG1peGVkPSJ0cnVlIj4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOmdlbmVyaWMtZWxlbWVudC10eXBlIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2w6UU5hbWUiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QiIHR5cGU9InhzbDptZXRob2QiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJieXRlLW9yZGVyLW1hcmsiIHR5cGU9InhzbDp5ZXMtb3Itbm8iLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjZGF0YS1zZWN0aW9uLWVsZW1lbnRzIiB0eXBlPSJ4c2w6UU5hbWVzIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZG9jdHlwZS1wdWJsaWMiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImRvY3R5cGUtc3lzdGVtIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJlbmNvZGluZyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZXNjYXBlLXVyaS1hdHRyaWJ1dGVzIiB0eXBlPSJ4c2w6eWVzLW9yLW5vIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaW5jbHVkZS1jb250ZW50LXR5cGUiIHR5cGU9InhzbDp5ZXMtb3Itbm8iLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJpbmRlbnQiIHR5cGU9InhzbDp5ZXMtb3Itbm8iLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtZWRpYS10eXBlIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJub3JtYWxpemF0aW9uLWZvcm0iIHR5cGU9InhzOk5NVE9LRU4iLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJvbWl0LXhtbC1kZWNsYXJhdGlvbiIgdHlwZT0ieHNsOnllcy1vci1ubyIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InN0YW5kYWxvbmUiIHR5cGU9InhzbDp5ZXMtb3Itbm8tb3Itb21pdCIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InVuZGVjbGFyZS1wcmVmaXhlcyIgdHlwZT0ieHNsOnllcy1vci1ubyIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InVzZS1jaGFyYWN0ZXItbWFwcyIgdHlwZT0ieHNsOlFOYW1lcyIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InhzOk5NVE9LRU4iLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9Im91dHB1dC1jaGFyYWN0ZXIiPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6ZWxlbWVudC1vbmx5LXZlcnNpb25lZC1lbGVtZW50LXR5cGUiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNoYXJhY3RlciIgdHlwZT0ieHNsOmNoYXIiIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzdHJpbmciIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0icGFyYW0iPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50IG1peGVkPSJ0cnVlIj4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOnNlcXVlbmNlLWNvbnN0cnVjdG9yIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2w6UU5hbWUiIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzZWxlY3QiIHR5cGU9InhzbDpleHByZXNzaW9uIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYXMiIHR5cGU9InhzbDpzZXF1ZW5jZS10eXBlIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVxdWlyZWQiIHR5cGU9InhzbDp5ZXMtb3Itbm8iLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0dW5uZWwiIHR5cGU9InhzbDp5ZXMtb3Itbm8iLz4gICAgICAgIAotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0icGVyZm9ybS1zb3J0IiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmluc3RydWN0aW9uIj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0idHJ1ZSI+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDp2ZXJzaW9uZWQtZWxlbWVudC10eXBlIj4KLSAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieHNsOnNvcnQiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICA8eHM6Z3JvdXAgcmVmPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3ItZ3JvdXAiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzZWxlY3QiIHR5cGU9InhzbDpleHByZXNzaW9uIi8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJwcmVzZXJ2ZS1zcGFjZSIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDpkZWNsYXJhdGlvbiI+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDplbGVtZW50LW9ubHktdmVyc2lvbmVkLWVsZW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZWxlbWVudHMiIHR5cGU9InhzbDpuYW1ldGVzdHMiIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9InByb2Nlc3NpbmctaW5zdHJ1Y3Rpb24iIHN1YnN0aXR1dGlvbkdyb3VwPSJ4c2w6aW5zdHJ1Y3Rpb24iPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50IG1peGVkPSJ0cnVlIj4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOnNlcXVlbmNlLWNvbnN0cnVjdG9yIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2w6YXZ0IiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2VsZWN0IiB0eXBlPSJ4c2w6ZXhwcmVzc2lvbiIvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0icmVzdWx0LWRvY3VtZW50IiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmluc3RydWN0aW9uIj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0idHJ1ZSI+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3RvciI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZm9ybWF0IiB0eXBlPSJ4c2w6UU5hbWUiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJocmVmIiB0eXBlPSJ4c2w6YXZ0Ii8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHNsOlFOYW1lIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmFsaWRhdGlvbiIgdHlwZT0ieHNsOnZhbGlkYXRpb24tdHlwZSIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1ldGhvZCIgdHlwZT0ieHNsOmF2dCIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImJ5dGUtb3JkZXItbWFyayIgdHlwZT0ieHNsOmF2dCIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNkYXRhLXNlY3Rpb24tZWxlbWVudHMiIHR5cGU9InhzbDphdnQiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkb2N0eXBlLXB1YmxpYyIgdHlwZT0ieHNsOmF2dCIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImRvY3R5cGUtc3lzdGVtIiB0eXBlPSJ4c2w6YXZ0Ii8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZW5jb2RpbmciIHR5cGU9InhzbDphdnQiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJlc2NhcGUtdXJpLWF0dHJpYnV0ZXMiIHR5cGU9InhzbDphdnQiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJpbmNsdWRlLWNvbnRlbnQtdHlwZSIgdHlwZT0ieHNsOmF2dCIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImluZGVudCIgdHlwZT0ieHNsOmF2dCIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1lZGlhLXR5cGUiIHR5cGU9InhzbDphdnQiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJub3JtYWxpemF0aW9uLWZvcm0iIHR5cGU9InhzbDphdnQiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJvbWl0LXhtbC1kZWNsYXJhdGlvbiIgdHlwZT0ieHNsOmF2dCIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InN0YW5kYWxvbmUiIHR5cGU9InhzbDphdnQiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ1bmRlY2xhcmUtcHJlZml4ZXMiIHR5cGU9InhzbDphdnQiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ1c2UtY2hhcmFjdGVyLW1hcHMiIHR5cGU9InhzbDpRTmFtZXMiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJvdXRwdXQtdmVyc2lvbiIgdHlwZT0ieHNsOmF2dCIvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UiIHN1YnN0aXR1dGlvbkdyb3VwPSJ4c2w6aW5zdHJ1Y3Rpb24iPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50IG1peGVkPSJ0cnVlIj4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOnNlcXVlbmNlLWNvbnN0cnVjdG9yIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzZWxlY3QiIHR5cGU9InhzbDpleHByZXNzaW9uIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYXMiIHR5cGU9InhzbDpzZXF1ZW5jZS10eXBlIi8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJzb3J0Ij4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0idHJ1ZSI+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3RvciI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2VsZWN0IiB0eXBlPSJ4c2w6ZXhwcmVzc2lvbiIvPiAgCi0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibGFuZyIgdHlwZT0ieHNsOmF2dCIvPiAgICAgICAgCi0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZGF0YS10eXBlIiB0eXBlPSJ4c2w6YXZ0IiBkZWZhdWx0PSJ0ZXh0Ii8+ICAgICAgICAKLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJvcmRlciIgdHlwZT0ieHNsOmF2dCIgZGVmYXVsdD0iYXNjZW5kaW5nIi8+ICAgICAgICAKLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjYXNlLW9yZGVyIiB0eXBlPSJ4c2w6YXZ0Ii8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY29sbGF0aW9uIiB0eXBlPSJ4c2w6YXZ0Ii8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic3RhYmxlIiB0eXBlPSJ4c2w6eWVzLW9yLW5vIi8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJzdHJpcC1zcGFjZSIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDpkZWNsYXJhdGlvbiI+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDplbGVtZW50LW9ubHktdmVyc2lvbmVkLWVsZW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZWxlbWVudHMiIHR5cGU9InhzbDpuYW1ldGVzdHMiIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9InN0eWxlc2hlZXQiIHN1YnN0aXR1dGlvbkdyb3VwPSJ4c2w6dHJhbnNmb3JtIi8+Ci0KLTx4czplbGVtZW50IG5hbWU9InRlbXBsYXRlIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmRlY2xhcmF0aW9uIj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0idHJ1ZSI+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDp2ZXJzaW9uZWQtZWxlbWVudC10eXBlIj4KLSAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieHNsOnBhcmFtIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgPHhzOmdyb3VwIHJlZj0ieHNsOnNlcXVlbmNlLWNvbnN0cnVjdG9yLWdyb3VwIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWF0Y2giIHR5cGU9InhzbDpwYXR0ZXJuIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icHJpb3JpdHkiIHR5cGU9InhzOmRlY2ltYWwiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtb2RlIiB0eXBlPSJ4c2w6bW9kZXMiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2w6UU5hbWUiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJhcyIgdHlwZT0ieHNsOnNlcXVlbmNlLXR5cGUiIGRlZmF1bHQ9Iml0ZW0oKSoiLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czpjb21wbGV4VHlwZSBuYW1lPSJ0ZXh0LWVsZW1lbnQtYmFzZS10eXBlIj4KLSAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzbDp2ZXJzaW9uZWQtZWxlbWVudC10eXBlIj4KLSAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIi8+Ci0gICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJza2lwIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpzaW1wbGVDb250ZW50PgotPC94czpjb21wbGV4VHlwZT4KLQotPHhzOmVsZW1lbnQgbmFtZT0idGV4dCIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDppbnN0cnVjdGlvbiI+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOnRleHQtZWxlbWVudC1iYXNlLXR5cGUiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImRpc2FibGUtb3V0cHV0LWVzY2FwaW5nIiB0eXBlPSJ4c2w6eWVzLW9yLW5vIiBkZWZhdWx0PSJubyIvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNmb3JtLWVsZW1lbnQtYmFzZS10eXBlIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4c2w6ZWxlbWVudC1vbmx5LXZlcnNpb25lZC1lbGVtZW50LXR5cGUiPgotICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJ4czpkZWNpbWFsIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJza2lwIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLTwveHM6Y29tcGxleFR5cGU+Ci0KLTx4czplbGVtZW50IG5hbWU9InRyYW5zZm9ybSI+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDp0cmFuc2Zvcm0tZWxlbWVudC1iYXNlLXR5cGUiPgotICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4c2w6aW1wb3J0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieHNsOmRlY2xhcmF0aW9uIi8+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzbDp2YXJpYWJsZSIvPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4c2w6cGFyYW0iLz4gICAgICAgICAgICAgIAotICAgICAgICAgICAgPHhzOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ic2tpcCIvPiA8IS0tIHdlYWtlciB0aGFuIFhTTFQgMS4wIC0tPgotICAgICAgICAgIDwveHM6Y2hvaWNlPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4czpJRCIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImRlZmF1bHQtdmFsaWRhdGlvbiIgdHlwZT0ieHNsOnZhbGlkYXRpb24tc3RyaXAtb3ItcHJlc2VydmUiIGRlZmF1bHQ9InN0cmlwIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaW5wdXQtdHlwZS1hbm5vdGF0aW9ucyIgdHlwZT0ieHNsOmlucHV0LXR5cGUtYW5ub3RhdGlvbnMtdHlwZSIgZGVmYXVsdD0idW5zcGVjaWZpZWQiLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9InZhbHVlLW9mIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmluc3RydWN0aW9uIj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0idHJ1ZSI+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3RvciI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2VsZWN0IiB0eXBlPSJ4c2w6ZXhwcmVzc2lvbiIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNlcGFyYXRvciIgdHlwZT0ieHNsOmF2dCIvPiAgICAgICAgICAgIAotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImRpc2FibGUtb3V0cHV0LWVzY2FwaW5nIiB0eXBlPSJ4c2w6eWVzLW9yLW5vIiBkZWZhdWx0PSJubyIvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0idmFyaWFibGUiPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50IG1peGVkPSJ0cnVlIj4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOnNlcXVlbmNlLWNvbnN0cnVjdG9yIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2w6UU5hbWUiIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzZWxlY3QiIHR5cGU9InhzbDpleHByZXNzaW9uIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYXMiIHR5cGU9InhzbDpzZXF1ZW5jZS10eXBlIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJ3aGVuIj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0idHJ1ZSI+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3RvciI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idGVzdCIgdHlwZT0ieHNsOmV4cHJlc3Npb24iIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9IndpdGgtcGFyYW0iPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50IG1peGVkPSJ0cnVlIj4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOnNlcXVlbmNlLWNvbnN0cnVjdG9yIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2w6UU5hbWUiIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzZWxlY3QiIHR5cGU9InhzbDpleHByZXNzaW9uIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYXMiIHR5cGU9InhzbDpzZXF1ZW5jZS10eXBlIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHVubmVsIiB0eXBlPSJ4c2w6eWVzLW9yLW5vIi8+ICAgCi0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08IS0tICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgotPHhzOmFubm90YXRpb24+Ci0gIDx4czpkb2N1bWVudGF0aW9uPgotICAgIFBBUlQgQzogZGVmaW5pdGlvbiBvZiBsaXRlcmFsIHJlc3VsdCBlbGVtZW50cwotICAgIAotICAgIFRoZXJlIGFyZSB0aHJlZSB3YXlzIHRvIGRlZmluZSB0aGUgbGl0ZXJhbCByZXN1bHQgZWxlbWVudHMKLSAgICBwZXJtaXNzaWJsZSBpbiBhIHN0eWxlc2hlZXQuCi0gICAgCi0gICAgKGEpIGRvIG5vdGhpbmcuIFRoaXMgYWxsb3dzIGFueSBlbGVtZW50IHRvIGJlIHVzZWQgYXMgYSBsaXRlcmFsCi0gICAgICAgIHJlc3VsdCBlbGVtZW50LCBwcm92aWRlZCBpdCBpcyBub3QgaW4gdGhlIFhTTFQgbmFtZXNwYWNlCi0gICAgCi0gICAgKGIpIGRlY2xhcmUgYWxsIHBlcm1pdHRlZCBsaXRlcmFsIHJlc3VsdCBlbGVtZW50cyBhcyBtZW1iZXJzCi0gICAgICAgIG9mIHRoZSB4c2w6bGl0ZXJhbC1yZXN1bHQtZWxlbWVudCBzdWJzdGl0dXRpb24gZ3JvdXAKLSAgICAgICAgCi0gICAgKGMpIHJlZGVmaW5lIHRoZSBtb2RlbCBncm91cCB4c2w6cmVzdWx0LWVsZW1lbnRzIHRvIGFjY29tbW9kYXRlCi0gICAgICAgIGFsbCBwZXJtaXR0ZWQgbGl0ZXJhbCByZXN1bHQgZWxlbWVudHMuCi0gICAgICAgIAotICAgIExpdGVyYWwgcmVzdWx0IGVsZW1lbnRzIGFyZSBhbGxvd2VkIHRvIHRha2UgY2VydGFpbiBhdHRyaWJ1dGVzCi0gICAgaW4gdGhlIFhTTFQgbmFtZXNwYWNlLiBUaGVzZSBhcmUgZGVmaW5lZCBpbiB0aGUgYXR0cmlidXRlIGdyb3VwCi0gICAgbGl0ZXJhbC1yZXN1bHQtZWxlbWVudC1hdHRyaWJ1dGVzLCB3aGljaCBjYW4gYmUgaW5jbHVkZWQgaW4gdGhlCi0gICAgZGVmaW5pdGlvbiBvZiBhbnkgbGl0ZXJhbCByZXN1bHQgZWxlbWVudC4KLSAgICAKLSAgPC94czpkb2N1bWVudGF0aW9uPgotPC94czphbm5vdGF0aW9uPiAgIAotPCEtLSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KLQotPHhzOmVsZW1lbnQgbmFtZT0ibGl0ZXJhbC1yZXN1bHQtZWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIHR5cGU9InhzOmFueVR5cGUiLz4KLQotPHhzOmF0dHJpYnV0ZUdyb3VwIG5hbWU9ImxpdGVyYWwtcmVzdWx0LWVsZW1lbnQtYXR0cmlidXRlcyI+Ci0gIDx4czphdHRyaWJ1dGUgbmFtZT0iZGVmYXVsdC1jb2xsYXRpb24iIGZvcm09InF1YWxpZmllZCIgdHlwZT0ieHNsOnVyaS1saXN0Ii8+Ci0gIDx4czphdHRyaWJ1dGUgbmFtZT0iZXh0ZW5zaW9uLWVsZW1lbnQtcHJlZml4ZXMiIGZvcm09InF1YWxpZmllZCIgdHlwZT0ieHNsOnByZWZpeGVzIi8+Ci0gIDx4czphdHRyaWJ1dGUgbmFtZT0iZXhjbHVkZS1yZXN1bHQtcHJlZml4ZXMiIGZvcm09InF1YWxpZmllZCIgdHlwZT0ieHNsOnByZWZpeGVzIi8+Ci0gIDx4czphdHRyaWJ1dGUgbmFtZT0ieHBhdGgtZGVmYXVsdC1uYW1lc3BhY2UiIGZvcm09InF1YWxpZmllZCIgdHlwZT0ieHM6YW55VVJJIi8+ICAgIAotICA8eHM6YXR0cmlidXRlIG5hbWU9ImluaGVyaXQtbmFtZXNwYWNlcyIgZm9ybT0icXVhbGlmaWVkIiB0eXBlPSJ4c2w6eWVzLW9yLW5vIiBkZWZhdWx0PSJ5ZXMiLz4KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ1c2UtYXR0cmlidXRlLXNldHMiIGZvcm09InF1YWxpZmllZCIgdHlwZT0ieHNsOlFOYW1lcyIgZGVmYXVsdD0iIi8+Ci0gIDx4czphdHRyaWJ1dGUgbmFtZT0idXNlLXdoZW4iIGZvcm09InF1YWxpZmllZCIgdHlwZT0ieHNsOmV4cHJlc3Npb24iLz4KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiBmb3JtPSJxdWFsaWZpZWQiIHR5cGU9InhzOmRlY2ltYWwiLz4KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiBmb3JtPSJxdWFsaWZpZWQiIHR5cGU9InhzbDpRTmFtZSIvPgotICA8eHM6YXR0cmlidXRlIG5hbWU9InZhbGlkYXRpb24iIGZvcm09InF1YWxpZmllZCIgdHlwZT0ieHNsOnZhbGlkYXRpb24tdHlwZSIvPgotPC94czphdHRyaWJ1dGVHcm91cD4KLQotPHhzOmdyb3VwIG5hbWU9InJlc3VsdC1lbGVtZW50cyI+Ci0gIDx4czpjaG9pY2U+Ci0gICAgPHhzOmVsZW1lbnQgcmVmPSJ4c2w6bGl0ZXJhbC1yZXN1bHQtZWxlbWVudCIvPgotICAgIDx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9InNraXAiLz4KLSAgICA8eHM6YW55IG5hbWVzcGFjZT0iIyNsb2NhbCIgcHJvY2Vzc0NvbnRlbnRzPSJza2lwIi8+Ci0gIDwveHM6Y2hvaWNlPgotPC94czpncm91cD4KLQotCi08IS0tICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgotPHhzOmFubm90YXRpb24+Ci0gIDx4czpkb2N1bWVudGF0aW9uPgotICAgIFBBUlQgRDogZGVmaW5pdGlvbnMgb2Ygc2ltcGxlIHR5cGVzIHVzZWQgaW4gc3R5bGVzaGVldCBhdHRyaWJ1dGVzIAotICA8L3hzOmRvY3VtZW50YXRpb24+Ci08L3hzOmFubm90YXRpb24+ICAgCi08IS0tICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgotCi08eHM6c2ltcGxlVHlwZSBuYW1lPSJhdnQiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIFRoaXMgdHlwZSBpcyB1c2VkIGZvciBhbGwgYXR0cmlidXRlcyB0aGF0IGFsbG93IGFuIGF0dHJpYnV0ZSB2YWx1ZSB0ZW1wbGF0ZS4KLSAgICAgIFRoZSBnZW5lcmFsIHJ1bGVzIGZvciB0aGUgc3ludGF4IG9mIGF0dHJpYnV0ZSB2YWx1ZSB0ZW1wbGF0ZXMsIGFuZCB0aGUgc3BlY2lmaWMKLSAgICAgIHJ1bGVzIGZvciBlYWNoIHN1Y2ggYXR0cmlidXRlLCBhcmUgZGVzY3JpYmVkIGluIHRoZSBYU0xUIDIuMCBSZWNvbW1lbmRhdGlvbi4KLSAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyIvPgotPC94czpzaW1wbGVUeXBlPgotCi08eHM6c2ltcGxlVHlwZSBuYW1lPSJjaGFyIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBBIHN0cmluZyBjb250YWluaW5nIGV4YWN0bHkgb25lIGNoYXJhY3Rlci4KLSAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0gICAgPHhzOmxlbmd0aCB2YWx1ZT0iMSIvPgotICA8L3hzOnJlc3RyaWN0aW9uPgotPC94czpzaW1wbGVUeXBlPgotCi08eHM6c2ltcGxlVHlwZSBuYW1lPSJleHByZXNzaW9uIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBBbiBYUGF0aCAyLjAgZXhwcmVzc2lvbi4KLSAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLSAgICA8eHM6cGF0dGVybiB2YWx1ZT0iLisiLz4KLSAgPC94czpyZXN0cmljdGlvbj4KLTwveHM6c2ltcGxlVHlwZT4KLQotPHhzOnNpbXBsZVR5cGUgbmFtZT0iaW5wdXQtdHlwZS1hbm5vdGF0aW9ucy10eXBlIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBEZXNjcmliZXMgaG93IHR5cGUgYW5ub3RhdGlvbnMgaW4gc291cmNlIGRvY3VtZW50cyBhcmUgaGFuZGxlZC4KLSAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLSAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InByZXNlcnZlIi8+Ci0gICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJzdHJpcCIvPiAgIAotICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0idW5zcGVjaWZpZWQiLz4gICAgICAgIAotICA8L3hzOnJlc3RyaWN0aW9uPgotPC94czpzaW1wbGVUeXBlPgotCi08eHM6c2ltcGxlVHlwZSBuYW1lPSJsZXZlbCI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgVGhlIGxldmVsIGF0dHJpYnV0ZSBvZiB4c2w6bnVtYmVyOiAKLSAgICAgIG9uZSBvZiBzaW5nbGUsIG11bHRpcGxlLCBvciBhbnkuCi0gICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOQ05hbWUiPgotICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ic2luZ2xlIi8+Ci0gICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJtdWx0aXBsZSIvPgotICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iYW55Ii8+Ci0gIDwveHM6cmVzdHJpY3Rpb24+Ci08L3hzOnNpbXBsZVR5cGU+Ci0KLTx4czpzaW1wbGVUeXBlIG5hbWU9Im1vZGUiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIFRoZSBtb2RlIGF0dHJpYnV0ZSBvZiB4c2w6YXBwbHktdGVtcGxhdGVzOiAKLSAgICAgIGVpdGhlciBhIFFOYW1lLCBvciAjY3VycmVudCwgb3IgI2RlZmF1bHQuCi0gICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czp1bmlvbiBtZW1iZXJUeXBlcz0ieHNsOlFOYW1lIj4KLSAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+Ci0gICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iI2RlZmF1bHQiLz4KLSAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIjY3VycmVudCIvPgotICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gIDwveHM6dW5pb24+Ci08L3hzOnNpbXBsZVR5cGU+Ci0KLTx4czpzaW1wbGVUeXBlIG5hbWU9Im1vZGVzIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBUaGUgbW9kZSBhdHRyaWJ1dGUgb2YgeHNsOnRlbXBsYXRlOiAKLSAgICAgIGVpdGhlciBhIGxpc3QsIGVhY2ggbWVtYmVyIGJlaW5nIGVpdGhlciBhIFFOYW1lIG9yICNkZWZhdWx0OwotICAgICAgb3IgdGhlIHZhbHVlICNhbGwKLSAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOnVuaW9uPgotICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgPHhzOmxpc3Q+Ci0gICAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgICAgIDx4czp1bmlvbiBtZW1iZXJUeXBlcz0ieHNsOlFOYW1lIj4KLSAgICAgICAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iI2RlZmF1bHQiLz4KLSAgICAgICAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICAgICAgICA8L3hzOnVuaW9uPgotICAgICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgICA8L3hzOmxpc3Q+Ci0gICAgPC94czpzaW1wbGVUeXBlPgotICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLSAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIjYWxsIi8+Ci0gICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgPC94czp1bmlvbj4KLTwveHM6c2ltcGxlVHlwZT4KLQotPHhzOnNpbXBsZVR5cGUgbmFtZT0ibmFtZXRlc3RzIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBBIGxpc3Qgb2YgTmFtZVRlc3RzLCBhcyBkZWZpbmVkIGluIHRoZSBYUGF0aCAyLjAgUmVjb21tZW5kYXRpb24uCi0gICAgICBFYWNoIE5hbWVUZXN0IGlzIGVpdGhlciBhIFFOYW1lLCBvciAiKiIsIG9yICJwcmVmaXg6KiIsIG9yICIqOmxvY2FsbmFtZSIKLSAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmxpc3Q+Ci0gICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICA8eHM6dW5pb24gbWVtYmVyVHlwZXM9InhzbDpRTmFtZSI+Ci0gICAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IioiLz4KLSAgICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+Ci0gICAgICAgICAgICA8eHM6cGF0dGVybiB2YWx1ZT0iXGlcYyo6XCoiLz4KLSAgICAgICAgICAgIDx4czpwYXR0ZXJuIHZhbHVlPSJcKjpcaVxjKiIvPiAgICAgICAgICAgIAotICAgICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICAgIDwveHM6dW5pb24+Ci0gICAgPC94czpzaW1wbGVUeXBlPgotICA8L3hzOmxpc3Q+Ci08L3hzOnNpbXBsZVR5cGU+Ci0KLTx4czpzaW1wbGVUeXBlIG5hbWU9InByZWZpeGVzIj4KLSAgPHhzOmxpc3QgaXRlbVR5cGU9InhzOk5DTmFtZSIvPgotPC94czpzaW1wbGVUeXBlPgotCi08eHM6c2ltcGxlVHlwZSBuYW1lPSJwcmVmaXgtbGlzdC1vci1hbGwiPgotICA8eHM6dW5pb24gbWVtYmVyVHlwZXM9InhzbDpwcmVmaXgtbGlzdCI+Ci0gICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IiNhbGwiLz4KLSAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgPC94czpzaW1wbGVUeXBlPgotICA8L3hzOnVuaW9uPgotPC94czpzaW1wbGVUeXBlPgotICAgICAgCi08eHM6c2ltcGxlVHlwZSBuYW1lPSJwcmVmaXgtbGlzdCI+Ci0gIDx4czpsaXN0IGl0ZW1UeXBlPSJ4c2w6cHJlZml4LW9yLWRlZmF1bHQiLz4KLTwveHM6c2ltcGxlVHlwZT4KLQotPHhzOnNpbXBsZVR5cGUgbmFtZT0ibWV0aG9kIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBUaGUgbWV0aG9kIGF0dHJpYnV0ZSBvZiB4c2w6b3V0cHV0OgotICAgICAgRWl0aGVyIG9uZSBvZiB0aGUgcmVjb2duaXplZCBuYW1lcyAieG1sIiwgInhodG1sIiwgImh0bWwiLCAidGV4dCIsCi0gICAgICBvciBhIFFOYW1lIHRoYXQgbXVzdCBpbmNsdWRlIGEgcHJlZml4LgotICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6dW5pb24+Ci0gICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6TkNOYW1lIj4KLSAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ4bWwiLz4KLSAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ4aHRtbCIvPgotICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Imh0bWwiLz4KLSAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ0ZXh0Ii8+Ci0gICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4c2w6UU5hbWUiPgotICAgICAgICA8eHM6cGF0dGVybiB2YWx1ZT0iXGMqOlxjKiIvPgotICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gIDwveHM6dW5pb24+Ci08L3hzOnNpbXBsZVR5cGU+Ci0KLTx4czpzaW1wbGVUeXBlIG5hbWU9InBhdHRlcm4iPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIEEgbWF0Y2ggcGF0dGVybiBhcyBkZWZpbmVkIGluIHRoZSBYU0xUIDIuMCBSZWNvbW1lbmRhdGlvbi4KLSAgICAgIFRoZSBzeW50YXggZm9yIHBhdHRlcm5zIGlzIGEgcmVzdHJpY3RlZCBmb3JtIG9mIHRoZSBzeW50YXggZm9yCi0gICAgICBYUGF0aCAyLjAgZXhwcmVzc2lvbnMuCi0gICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4c2w6ZXhwcmVzc2lvbiIvPgotPC94czpzaW1wbGVUeXBlPgotCi08eHM6c2ltcGxlVHlwZSBuYW1lPSJwcmVmaXgtb3ItZGVmYXVsdCI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgRWl0aGVyIGEgbmFtZXNwYWNlIHByZWZpeCwgb3IgI2RlZmF1bHQuCi0gICAgICBVc2VkIGluIHRoZSB4c2w6bmFtZXNwYWNlLWFsaWFzIGVsZW1lbnQuCi0gICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czp1bmlvbiBtZW1iZXJUeXBlcz0ieHM6TkNOYW1lIj4KLSAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+Ci0gICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iI2RlZmF1bHQiLz4KLSAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgPC94czpzaW1wbGVUeXBlPgotICA8L3hzOnVuaW9uPgotPC94czpzaW1wbGVUeXBlPgotCi08eHM6c2ltcGxlVHlwZSBuYW1lPSJRTmFtZXMiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIEEgbGlzdCBvZiBRTmFtZXMuCi0gICAgICBVc2VkIGluIHRoZSBbeHNsOl11c2UtYXR0cmlidXRlLXNldHMgYXR0cmlidXRlIG9mIHZhcmlvdXMgZWxlbWVudHMsCi0gICAgICBhbmQgaW4gdGhlIGNkYXRhLXNlY3Rpb24tZWxlbWVudHMgYXR0cmlidXRlIG9mIHhzbDpvdXRwdXQKLSAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmxpc3QgaXRlbVR5cGU9InhzbDpRTmFtZSIvPiAgICAgICAgICAKLTwveHM6c2ltcGxlVHlwZT4KLQotPHhzOnNpbXBsZVR5cGUgbmFtZT0iUU5hbWUiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIEEgUU5hbWUuCi0gICAgICBUaGlzIHNjaGVtYSBkb2VzIG5vdCB1c2UgdGhlIGJ1aWx0LWluIHR5cGUgeHM6UU5hbWUsIGJ1dCByYXRoZXIgZGVmaW5lcyBpdHMgb3duCi0gICAgICBRTmFtZSB0eXBlLiBBbHRob3VnaCB4czpRTmFtZSB3b3VsZCBkZWZpbmUgdGhlIGNvcnJlY3QgdmFsaWRhdGlvbiBvbiB0aGVzZSBhdHRyaWJ1dGVzLAotICAgICAgYSBzY2hlbWEgcHJvY2Vzc29yIHdvdWxkIGV4cGFuZCB1bnByZWZpeGVkIFFOYW1lcyBpbmNvcnJlY3RseSB3aGVuIGNvbnN0cnVjdGluZyB0aGUgUFNWSSwKLSAgICAgIGJlY2F1c2UgKGFzIGRlZmluZWQgaW4gWE1MIFNjaGVtYSBlcnJhdGEpIGFuIHVucHJlZml4ZWQgeHM6UU5hbWUgaXMgYXNzdW1lZCB0byBiZSBpbgotICAgICAgdGhlIGRlZmF1bHQgbmFtZXNwYWNlLCB3aGljaCBpcyBub3QgdGhlIGNvcnJlY3QgYXNzdW1wdGlvbiBmb3IgWFNMVC4KLSAgICAgIFRoZSBkYXRhIHR5cGUgaXMgZGVmaW5lZCBhcyBhIHJlc3RyaWN0aW9uIG9mIHRoZSBidWlsdC1pbiB0eXBlIE5hbWUsIHJlc3RyaWN0ZWQKLSAgICAgIHNvIHRoYXQgaXQgY2FuIG9ubHkgY29udGFpbiBvbmUgY29sb24gd2hpY2ggbXVzdCBub3QgYmUgdGhlIGZpcnN0IG9yIGxhc3QgY2hhcmFjdGVyLgotICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6TmFtZSI+Ci0gICAgPHhzOnBhdHRlcm4gdmFsdWU9IihbXjpdKzopP1teOl0rIi8+ICAgICAgCi0gIDwveHM6cmVzdHJpY3Rpb24+ICAgICAgICAKLTwveHM6c2ltcGxlVHlwZT4KLQotPHhzOnNpbXBsZVR5cGUgbmFtZT0ic2VxdWVuY2UtdHlwZSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgVGhlIGRlc2NyaXB0aW9uIG9mIGEgZGF0YSB0eXBlLCBjb25mb3JtaW5nIHRvIHRoZQotICAgICAgU2VxdWVuY2VUeXBlIHByb2R1Y3Rpb24gZGVmaW5lZCBpbiB0aGUgWFBhdGggMi4wIFJlY29tbWVuZGF0aW9uCi0gICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+Ci0gICAgPHhzOnBhdHRlcm4gdmFsdWU9Ii4rIi8+ICAgICAgCi0gIDwveHM6cmVzdHJpY3Rpb24+Ci08L3hzOnNpbXBsZVR5cGU+Ci0KLTx4czpzaW1wbGVUeXBlIG5hbWU9InVyaS1saXN0Ij4KLSAgPHhzOmxpc3QgaXRlbVR5cGU9InhzOmFueVVSSSIvPgotPC94czpzaW1wbGVUeXBlPgotCi08eHM6c2ltcGxlVHlwZSBuYW1lPSJ2YWxpZGF0aW9uLXN0cmlwLW9yLXByZXNlcnZlIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBEZXNjcmliZXMgZGlmZmVyZW50IHdheXMgb2YgdHlwZS1hbm5vdGF0aW5nIGFuIGVsZW1lbnQgb3IgYXR0cmlidXRlLgotICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHNsOnZhbGlkYXRpb24tdHlwZSI+Ci0gICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJwcmVzZXJ2ZSIvPgotICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ic3RyaXAiLz4gICAgCi0gIDwveHM6cmVzdHJpY3Rpb24+Ci08L3hzOnNpbXBsZVR5cGU+Ci0KLTx4czpzaW1wbGVUeXBlIG5hbWU9InZhbGlkYXRpb24tdHlwZSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgRGVzY3JpYmVzIGRpZmZlcmVudCB3YXlzIG9mIHR5cGUtYW5ub3RhdGluZyBhbiBlbGVtZW50IG9yIGF0dHJpYnV0ZS4KLSAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLSAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InN0cmljdCIvPgotICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibGF4Ii8+Ci0gICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJwcmVzZXJ2ZSIvPgotICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ic3RyaXAiLz4gICAgCi0gIDwveHM6cmVzdHJpY3Rpb24+Ci08L3hzOnNpbXBsZVR5cGU+Ci0KLTx4czpzaW1wbGVUeXBlIG5hbWU9Inllcy1vci1ubyI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgT25lIG9mIHRoZSB2YWx1ZXMgInllcyIgb3IgIm5vIi4KLSAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLSAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InllcyIvPgotICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibm8iLz4KLSAgPC94czpyZXN0cmljdGlvbj4KLTwveHM6c2ltcGxlVHlwZT4KLQotPHhzOnNpbXBsZVR5cGUgbmFtZT0ieWVzLW9yLW5vLW9yLW9taXQiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIE9uZSBvZiB0aGUgdmFsdWVzICJ5ZXMiIG9yICJubyIgb3IgIm9taXQiLgotICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ieWVzIi8+Ci0gICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJubyIvPgotICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ib21pdCIvPgotICA8L3hzOnJlc3RyaWN0aW9uPgotPC94czpzaW1wbGVUeXBlPgotCi08L3hzOnNjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy51aS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhjOTFhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy51aS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTZmNzlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuYXBpLnRvb2xzLmFwaUFuYWx5c2lzQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuYXBpLnRvb2xzLmFwaUFuYWx5c2lzTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NTU0OTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotI1R1ZSBGZWIgMTAgMDU6MjY6MDAgR01UIDIwMDkKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3M9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ0Rlc2NyaXB0aW9uPXJldHVybl90YWcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTBiNTg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy51aTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy51aS5pbnRlcm5hbC5KQVhQRGVidWdVSVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXZlbmRvck5hbWUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5kZWJ1Zy51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZztidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZztidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamZhY2UudGV4dDtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhzbC51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjMwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvcjtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC40MDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuZGVidWcudWk7YnVuZGxlLXZlcnNpb249IlszLjMuMCw0LjAuMCkiCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDMwMDAzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5BdWd1c3QsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcudWkvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0N2ZjYzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpL2ljb25zL3hzbHRfcHJvY2Vzc29yLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpL2ljb25zL3hzbHRfcHJvY2Vzc29yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU3MTI4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy51aS9pY29ucy94c2x0X3Byb2Nlc3Nvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy51aS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODEyMzZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0jUHJvcGVydGllcyBmaWxlIGZvciBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcudWkKLXZlbmRvck5hbWUgPSBFY2xpcHNlLm9yZwotcGx1Z2luTmFtZSA9IFhTTCBKQVhQIERlYnVnIFVJIChJbmN1YmF0aW5nKQotcGFnZU5hbWVKYXZhUHJvY2Vzc29ycyA9IEphdmEgUHJvY2Vzc29ycwotdmlld05hbWVSZXN1bHQgPSBSZXN1bHQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy51aS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY5NzJkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZGVidWcudWkubGF1bmNoQ29uZmlndXJhdGlvblRhYnMiPgotCQk8dGFiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpLmludGVybmFsLnRhYnMucHJvY2Vzc29yLlhTTFByb2Nlc3NvclRhYjIiCi0JCQlncm91cD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXAueHNsdCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpLmpheHAudGFicy5wcm9jZXNzb3IiIG5hbWU9IlByb2Nlc3NvciI+Ci0JCQk8YXNzb2NpYXRlZERlbGVnYXRlCi0JCQkJZGVsZWdhdGU9Im9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmludGVybmFsLmpheHAuSkFYUExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZSI+Ci0JCQk8L2Fzc29jaWF0ZWREZWxlZ2F0ZT4KLQkJCTxwbGFjZW1lbnQgYWZ0ZXI9Im9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5vdXRwdXQiPgotCQkJPC9wbGFjZW1lbnQ+Ci0JCTwvdGFiPgotCQk8dGFiIGNsYXNzPSJvcmcuZWNsaXBzZS5qZHQuZGVidWcudWkubGF1bmNoQ29uZmlndXJhdGlvbnMuSmF2YUpSRVRhYiIKLQkJCWdyb3VwPSJvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cC54c2x0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpkdC5kZWJ1Zy51aS5qYXZhSlJFVGFiIiBuYW1lPSJKUkUiPgotCQkJPGFzc29jaWF0ZWREZWxlZ2F0ZQotCQkJCWRlbGVnYXRlPSJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5pbnRlcm5hbC5qYXhwLkpBWFBMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUiPgotCQkJPC9hc3NvY2lhdGVkRGVsZWdhdGU+Ci0JCQk8cGxhY2VtZW50IGFmdGVyPSJvcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpLmpheHAudGFicy5wcm9jZXNzb3IiPgotCQkJPC9wbGFjZW1lbnQ+Ci0JCTwvdGFiPgotCQk8dGFiIGNsYXNzPSJvcmcuZWNsaXBzZS5qZHQuZGVidWcudWkubGF1bmNoQ29uZmlndXJhdGlvbnMuSmF2YUNsYXNzcGF0aFRhYiIKLQkJCWdyb3VwPSJvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cC54c2x0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpkdC5kZWJ1Zy51aS5qYXZhQ2xhc3NwYXRoVGFiIiBuYW1lPSJDbGFzc3BhdGgiPgotCQkJPGFzc29jaWF0ZWREZWxlZ2F0ZQotCQkJCWRlbGVnYXRlPSJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5pbnRlcm5hbC5qYXhwLkpBWFBMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUiPgotCQkJPC9hc3NvY2lhdGVkRGVsZWdhdGU+Ci0JCQk8cGxhY2VtZW50IGFmdGVyPSJvcmcuZWNsaXBzZS5qZHQuZGVidWcudWkuamF2YUpSRVRhYiI+Ci0JCQk8L3BsYWNlbWVudD4KLQkJPC90YWI+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KLQkJPHBhZ2UgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC54c2wudWkucHJlZmVyZW5jZXMuQmFzZVByZWZlcmVuY2VQYWdlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5Qcm9jZXNzb3JzUHJlZmVyZW5jZVBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC51aS5wcmVmZXJlbmNlcy5qYXZhIiBuYW1lPSIlcGFnZU5hbWVKYXZhUHJvY2Vzc29ycyI+Ci0JCTwvcGFnZT4KLQk8L2V4dGVuc2lvbj4KLSA8ZXh0ZW5zaW9uCi0gICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIj4KLSAgICA8dmlldwotICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcudWkuaW50ZXJuYWwudmlld3MuUmVzdWx0VmlldyIKLSAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpLnJlc3VsdHZpZXciCi0gICAgICAgICAgbmFtZT0iJXZpZXdOYW1lUmVzdWx0IgotICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3QueG1sIj4KLSAgICA8L3ZpZXc+Ci0gPC9leHRlbnNpb24+Ci0gIDxleHRlbnNpb24KLSAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBlcnNwZWN0aXZlRXh0ZW5zaW9ucyI+Ci0gICAgIDxwZXJzcGVjdGl2ZUV4dGVuc2lvbgotICAgICAgICAgICB0YXJnZXRJRD0ib3JnLmVjbGlwc2UuZGVidWcudWkuRGVidWdQZXJzcGVjdGl2ZSI+Ci0gICAgICAgIDx2aWV3Ci0gICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcudWkudmlldzEiCi0gICAgICAgICAgICAgIG1pbmltaXplZD0iZmFsc2UiCi0gICAgICAgICAgICAgIHJlbGF0aW9uc2hpcD0ic3RhY2siCi0gICAgICAgICAgICAgIHJlbGF0aXZlPSJvcmcuZWNsaXBzZS51aS5jb25zb2xlLkNvbnNvbGVWaWV3IgotICAgICAgICAgICAgICB2aXNpYmxlPSJmYWxzZSI+Ci0gICAgICAgIDwvdmlldz4KLSAgICAgPC9wZXJzcGVjdGl2ZUV4dGVuc2lvbj4KLSAgPC9leHRlbnNpb24+Ci0gCi0gCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmNvbnRleHRWaWV3QmluZGluZ3MiPgotCQk8Y29udGV4dFZpZXdCaW5kaW5nCi0JCQljb250ZXh0SWQ9Im9yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkuY29udGV4dCIKLQkJCXZpZXdJZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpLnJlc3VsdHZpZXciPgotCQk8L2NvbnRleHRWaWV3QmluZGluZz4KLQk8L2V4dGVuc2lvbj4KLSAKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9kZWJ1Zy91aS9pbnRlcm5hbC9KQVhQRGVidWdVSVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9kZWJ1Zy91aS9pbnRlcm5hbC9KQVhQRGVidWdVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODJkM2U1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvZGVidWcvdWkvaW50ZXJuYWwvSkFYUERlYnVnVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKi8KLXB1YmxpYyBjbGFzcyBKQVhQRGVidWdVSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCi0JLy8gVGhlIHBsdWctaW4gSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpIjsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBKQVhQRGVidWdVSVBsdWdpbiBwbHVnaW47Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEpBWFBEZWJ1Z1VJUGx1Z2luKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKgotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSkFYUERlYnVnVUlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvZGVidWcvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvQWRkUHJvY2Vzc29yRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2RlYnVnL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0FkZFByb2Nlc3NvckRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWI5MmIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvZGVidWcvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvQWRkUHJvY2Vzc29yRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5TdGF0dXNEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuWFNMRGVidWdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcudWkuaW50ZXJuYWwudGFicy5wcm9jZXNzb3IuSW5zdGFsbFN0YW5kaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5JRGVidWdnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5JUHJvY2Vzc29ySW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLklQcm9jZXNzb3JKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5JUHJvY2Vzc29yVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLkpBWFBSdW50aW1lOwotCi1wdWJsaWMgY2xhc3MgQWRkUHJvY2Vzc29yRGlhbG9nIGV4dGVuZHMgU3RhdHVzRGlhbG9nCi17Ci0JcHJpdmF0ZSBmaW5hbCBJbnN0YWxsU3RhbmRpbiBzdGFuZGluUHJvY2Vzc29yOwotCXByaXZhdGUgZmluYWwgSVByb2Nlc3NvclR5cGVbXSBwcm9jZXNzb3JUeXBlczsKLQlwcml2YXRlIElQcm9jZXNzb3JUeXBlIHNlbGVjdGVkUHJvY2Vzc29yVHlwZTsKLQlwcml2YXRlIENvbWJvVmlld2VyIHByb2Nlc3NvclR5cGVGaWVsZDsKLQlwcml2YXRlIFByb2Nlc3NvckxpYnJhcnlCbG9jayBmTGlicmFyeUJsb2NrOwotCXByaXZhdGUgVGV4dCBwcm9jZXNzb3JOYW1lRmllbGQ7Ci0JcHJpdmF0ZSBmaW5hbCBJU3RhdHVzW10gZlN0YXRpOwotCXByaXZhdGUgaW50IGZQcmV2SW5kZXggPSAtMTsKLQlwcml2YXRlIGZpbmFsIEluc3RhbGxlZFByb2Nlc3NvcnNCbG9jayBibG9jazsKLQlwcml2YXRlIGJvb2xlYW4gYWRkaW5nOwotCi0JcHVibGljIEFkZFByb2Nlc3NvckRpYWxvZyhJbnN0YWxsZWRQcm9jZXNzb3JzQmxvY2sgYmxvY2ssIFNoZWxsIHBhcmVudCwgSVByb2Nlc3NvclR5cGVbXSB0eXBlcywgSVByb2Nlc3Nvckluc3RhbGwgaW5zdGFsbCkKLQl7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRSk7Ci0JCXRoaXMuYmxvY2sgPSBibG9jazsKLQkJZlN0YXRpID0gbmV3IElTdGF0dXNbNV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZlN0YXRpLmxlbmd0aDsgaSsrKQotCQl7Ci0JCQlmU3RhdGlbaV0gPSBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JCXByb2Nlc3NvclR5cGVzID0gdHlwZXM7Ci0JCXNlbGVjdGVkUHJvY2Vzc29yVHlwZSA9IGluc3RhbGwgIT0gbnVsbCA/IGluc3RhbGwuZ2V0UHJvY2Vzc29yVHlwZSgpIDogdHlwZXNbMF07Ci0JCUluc3RhbGxTdGFuZGluIHN0YW5kaW4gPSBudWxsOwotCQlpZiAoaW5zdGFsbCA9PSBudWxsKQotCQl7Ci0JCQlhZGRpbmcgPSB0cnVlOwotCQkJc3RhbmRpbiA9IG5ldyBJbnN0YWxsU3RhbmRpbihKQVhQUnVudGltZS5jcmVhdGVVbmlxdWVQcm9jZXNzb3JJZChzZWxlY3RlZFByb2Nlc3NvclR5cGUpLCAiIiwgc2VsZWN0ZWRQcm9jZXNzb3JUeXBlLmdldElkKCksIG51bGwsIG5ldyBJUHJvY2Vzc29ySmFyWzBdKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UKLQkJewotCQkJc3RhbmRpbiA9IG5ldyBJbnN0YWxsU3RhbmRpbihpbnN0YWxsKTsKLQkJfQotCQlzdGFuZGluUHJvY2Vzc29yID0gc3RhbmRpbjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBuZXdTaGVsbCkKLQl7Ci0JCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKG5ld1NoZWxsKTsKLQkJLy8gVE9ETyBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwLi4uCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGlhbG9nRmllbGRzKENvbXBvc2l0ZSBwYXJlbnQpCi0JewotCQlHcmlkRGF0YSBnZDsKLQkJTGFiZWwgbGFiZWw7Ci0KLQkJbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoTWVzc2FnZXMuQWRkUHJvY2Vzc29yRGlhbG9nX3Byb2Nlc3Nvck5hbWUpOwotCQlwcm9jZXNzb3JOYW1lRmllbGQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShTV1QuTk9ORSwgU1dULk5PTkUsIGZhbHNlLCBmYWxzZSk7Ci0JCWdkLndpZHRoSGludCA9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscyg1MCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJcHJvY2Vzc29yTmFtZUZpZWxkLnNldExheW91dERhdGEoZ2QpOwotCi0JCWxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLkFkZFByb2Nlc3NvckRpYWxvZ19wcm9jZXNzb3JUeXBlKTsKLQkJcHJvY2Vzc29yVHlwZUZpZWxkID0gbmV3IENvbWJvVmlld2VyKHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJcHJvY2Vzc29yVHlwZUZpZWxkLmdldENvbWJvKCkuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXByb2Nlc3NvclR5cGVGaWVsZC5zZXRDb250ZW50UHJvdmlkZXIobmV3IElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKCkKLQkJewotCi0JCQlwcml2YXRlIE9iamVjdCBpbnB1dDsKLQotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpCi0JCQl7Ci0JCQkJcmV0dXJuIChJUHJvY2Vzc29yVHlwZVtdKSBpbnB1dDsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpCi0JCQl7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkKLQkJCXsKLQkJCQlpbnB1dCA9IG5ld0lucHV0OwotCQkJfQotCQl9KTsKLQkJcHJvY2Vzc29yVHlwZUZpZWxkLnNldExhYmVsUHJvdmlkZXIobmV3IExhYmVsUHJvdmlkZXIoKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkKLQkJCXsKLQkJCQlyZXR1cm4gKChJUHJvY2Vzc29yVHlwZSkgZWxlbWVudCkuZ2V0TGFiZWwoKTsKLQkJCX0KLQkJfSk7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGaWVsZExpc3RlbmVycygpCi0JewotCQlwcm9jZXNzb3JUeXBlRmllbGQuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkKLQkJewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0JCQl7Ci0JCQkJdXBkYXRlUHJvY2Vzc29yVHlwZSgpOwotCQkJfQotCQl9KTsKLQotCQlwcm9jZXNzb3JOYW1lRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkKLQkJewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKQotCQkJewotCQkJCXNldFByb2Nlc3Nvck5hbWVTdGF0dXModmFsaWRhdGVQcm9jZXNzb3JOYW1lKCkpOwotCQkJCXVwZGF0ZVN0YXR1c0xpbmUoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9jZXNzb3JOYW1lKCkKLQl7Ci0JCXJldHVybiBwcm9jZXNzb3JOYW1lRmllbGQuZ2V0VGV4dCgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIGFuY2VzdG9yKQotCXsKLQkJQ29tcG9zaXRlIHBhcmVudCA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEoYW5jZXN0b3IpOwotCQkoKEdyaWRMYXlvdXQpIHBhcmVudC5nZXRMYXlvdXQoKSkubnVtQ29sdW1ucyA9IDM7Ci0vLwkJKChHcmlkRGF0YSkgcGFyZW50LmdldExheW91dERhdGEoKSkuaGVpZ2h0SGludCA9IDQwMDsKLS8vCQkoKEdyaWREYXRhKSBwYXJlbnQuZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSA0MDA7Ci0KLQkJY3JlYXRlRGlhbG9nRmllbGRzKHBhcmVudCk7Ci0KLQkJTGFiZWwgbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJbC5zZXRUZXh0KE1lc3NhZ2VzLkFkZFByb2Nlc3NvckRpYWxvZ19qYXJzKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlsLnNldExheW91dERhdGEoZ2QpOwotCi0JCWZMaWJyYXJ5QmxvY2sgPSBuZXcgUHJvY2Vzc29yTGlicmFyeUJsb2NrKHRoaXMpOwotCQlDb250cm9sIGJsb2NrID0gZkxpYnJhcnlCbG9jay5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJYmxvY2suc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJaW5pdGlhbGl6ZUZpZWxkcygpOwotCQljcmVhdGVGaWVsZExpc3RlbmVycygpOwotCQlhcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQkJCi0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVByb2Nlc3NvclR5cGUoKQotCXsKLQkJaW50IHNlbEluZGV4ID0gcHJvY2Vzc29yVHlwZUZpZWxkLmdldENvbWJvKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJaWYgKHNlbEluZGV4ID09IGZQcmV2SW5kZXgpCi0JCXsKLQkJCXJldHVybjsKLQkJfQotCQlmUHJldkluZGV4ID0gc2VsSW5kZXg7Ci0JCWlmIChzZWxJbmRleCA+PSAwICYmIHNlbEluZGV4IDwgcHJvY2Vzc29yVHlwZXMubGVuZ3RoKQotCQl7Ci0JCQlzZWxlY3RlZFByb2Nlc3NvclR5cGUgPSBwcm9jZXNzb3JUeXBlc1tzZWxJbmRleF07Ci0JCX0KLQkJZkxpYnJhcnlCbG9jay5pbml0aWFsaXplRnJvbShzdGFuZGluUHJvY2Vzc29yLCBzZWxlY3RlZFByb2Nlc3NvclR5cGUpOwotCQl1cGRhdGVTdGF0dXNMaW5lKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgY3JlYXRlKCkKLQl7Ci0JCXN1cGVyLmNyZWF0ZSgpOwotCQlwcm9jZXNzb3JOYW1lRmllbGQuc2V0Rm9jdXMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUZpZWxkcygpCi0JewotCQlwcm9jZXNzb3JUeXBlRmllbGQuc2V0SW5wdXQocHJvY2Vzc29yVHlwZXMpOwotCQlpZiAoYWRkaW5nKQotCQl7Ci0JCQlwcm9jZXNzb3JOYW1lRmllbGQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCXByb2Nlc3NvclR5cGVGaWVsZC5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ocHJvY2Vzc29yVHlwZXNbMF0pKTsKLQkJCWZMaWJyYXJ5QmxvY2suaW5pdGlhbGl6ZUZyb20oc3RhbmRpblByb2Nlc3Nvciwgc2VsZWN0ZWRQcm9jZXNzb3JUeXBlKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXByb2Nlc3NvclR5cGVGaWVsZC5nZXRDb21ibygpLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJcHJvY2Vzc29yVHlwZUZpZWxkLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzdGFuZGluUHJvY2Vzc29yLmdldFByb2Nlc3NvclR5cGUoKSkpOwotCQkJcHJvY2Vzc29yTmFtZUZpZWxkLnNldFRleHQoc3RhbmRpblByb2Nlc3Nvci5nZXROYW1lKCkpOwotCi0JCQlmTGlicmFyeUJsb2NrLmluaXRpYWxpemVGcm9tKHN0YW5kaW5Qcm9jZXNzb3IsIHNlbGVjdGVkUHJvY2Vzc29yVHlwZSk7Ci0JCX0KLQkJc2V0UHJvY2Vzc29yTmFtZVN0YXR1cyh2YWxpZGF0ZVByb2Nlc3Nvck5hbWUoKSk7Ci0JCXVwZGF0ZVN0YXR1c0xpbmUoKTsKLQl9Ci0KLQlwcml2YXRlIElTdGF0dXMgdmFsaWRhdGVQcm9jZXNzb3JOYW1lKCkKLQl7Ci0JCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJU3RyaW5nIG5hbWUgPSBwcm9jZXNzb3JOYW1lRmllbGQuZ2V0VGV4dCgpOwotCQlpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUudHJpbSgpLmxlbmd0aCgpID09IDApCi0JCXsKLQkJCXN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLCBYU0xEZWJ1Z1VJUGx1Z2luLlBMVUdJTl9JRCwgSVN0YXR1cy5PSywgTWVzc2FnZXMuQWRkUHJvY2Vzc29yRGlhbG9nX2VudGVyTmFtZSwgbnVsbCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlpZiAoYmxvY2suaXNEdXBsaWNhdGVOYW1lKG5hbWUpICYmIChzdGFuZGluUHJvY2Vzc29yID09IG51bGwgfHwgIW5hbWUuZXF1YWxzKHN0YW5kaW5Qcm9jZXNzb3IuZ2V0TmFtZSgpKSkpCi0JCQl7Ci0JCQkJc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBYU0xEZWJ1Z1VJUGx1Z2luLlBMVUdJTl9JRCwgSVN0YXR1cy5PSywgTWVzc2FnZXMuQWRkUHJvY2Vzc29yRGlhbG9nX2R1cGxpY2F0ZU5hbWUsIG51bGwpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCS8vIElTdGF0dXMgcyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS52YWxpZGF0ZU5hbWUobmFtZSwKLQkJCQkvLyBJUmVzb3VyY2UuRklMRSk7Ci0JCQkJLy8gaWYgKCFzLmlzT0soKSkKLQkJCQkvLyB7Ci0JCQkJLy8gc3RhdHVzLnNldEVycm9yKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KE1lc3NhZ2VzLkFkZFByb2Nlc3NvckRpYWxvZ19Qcm9jZXNzb3JfbmFtZV9tdXN0X2JlX2FfdmFsaWRfZmlsZV9uYW1lLAotCQkJCS8vIG5ldyBTdHJpbmdbXQotCQkJCS8vIHsgcy5nZXRNZXNzYWdlKCkgfSkpOwotCQkJCS8vIH0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCXByb3RlY3RlZCBJU3RhdHVzIHZhbGlkYXRlVmVyc2lvblN0YXR1cygpCi0JewotCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3RhdHVzTGluZSgpCi0JewotCQlJU3RhdHVzIG1heCA9IG51bGw7Ci0JCWZvciAoSVN0YXR1cyBjdXJyIDogZlN0YXRpKQotCQl7Ci0JCQlpZiAoY3Vyci5tYXRjaGVzKElTdGF0dXMuRVJST1IpKQotCQkJewotCQkJCXVwZGF0ZVN0YXR1cyhjdXJyKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAobWF4ID09IG51bGwgfHwgY3Vyci5nZXRTZXZlcml0eSgpID4gbWF4LmdldFNldmVyaXR5KCkpCi0JCQl7Ci0JCQkJbWF4ID0gY3VycjsKLQkJCX0KLQkJfQotCQl1cGRhdGVTdGF0dXMobWF4KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKQotCXsKLQkJZG9Pa1ByZXNzZWQoKTsKLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRvT2tQcmVzc2VkKCkKLQl7Ci0JCWlmIChhZGRpbmcpCi0JCXsKLQkJCXNldEZpZWxkVmFsdWVzVG9Qcm9jZXNzb3Ioc3RhbmRpblByb2Nlc3Nvcik7Ci0JCQlibG9jay5wcm9jZXNzb3JBZGRlZChzdGFuZGluUHJvY2Vzc29yKTsKLQkJfQotLy8JCWVsc2UKLS8vCQkJc2V0RmllbGRWYWx1ZXNUb1Byb2Nlc3NvcigoUHJvY2Vzc29ySW5zdGFsbCllZGl0ZWRQcm9jZXNzb3IpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEZpZWxkVmFsdWVzVG9Qcm9jZXNzb3IoSW5zdGFsbFN0YW5kaW4gcHJvY2Vzc29yKQotCXsKLQkJcHJvY2Vzc29yLnNldE5hbWUocHJvY2Vzc29yTmFtZUZpZWxkLmdldFRleHQoKSk7Ci0JCXByb2Nlc3Nvci5zZXRQcm9jZXNzb3JUeXBlSWQoc2VsZWN0ZWRQcm9jZXNzb3JUeXBlLmdldElkKCkpOwotCi0JCUlEZWJ1Z2dlcltdIGRlYnVnZ2VycyA9IEpBWFBSdW50aW1lLmdldERlYnVnZ2VycygpOwotCQlmb3IgKElEZWJ1Z2dlciBlbGVtZW50IDogZGVidWdnZXJzKQotCQl7Ci0JCQlpZiAoZWxlbWVudC5nZXRQcm9jZXNzb3JUeXBlKCkuZXF1YWxzKHNlbGVjdGVkUHJvY2Vzc29yVHlwZSkpCi0JCQkJcHJvY2Vzc29yLnNldERlYnVnZ2VySWQoZWxlbWVudC5nZXRJZCgpKTsKLQkJfQotCi0JCWZMaWJyYXJ5QmxvY2sucGVyZm9ybUFwcGx5KHByb2Nlc3Nvcik7Ci0JfQotCi0JcHJvdGVjdGVkIEZpbGUgZ2V0QWJzb2x1dGVGaWxlT3JFbXB0eShTdHJpbmcgcGF0aCkKLQl7Ci0JCWlmIChwYXRoID09IG51bGwgfHwgcGF0aC5sZW5ndGgoKSA9PSAwKQotCQl7Ci0JCQlyZXR1cm4gbmV3IEZpbGUoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG5ldyBGaWxlKHBhdGgpLmdldEFic29sdXRlRmlsZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRQcm9jZXNzb3JOYW1lU3RhdHVzKElTdGF0dXMgc3RhdHVzKQotCXsKLQkJZlN0YXRpWzBdID0gc3RhdHVzOwotCX0KLQotCXByb3RlY3RlZCBJU3RhdHVzIGdldFN5c3RlbUxpYnJhcnlTdGF0dXMoKQotCXsKLQkJcmV0dXJuIGZTdGF0aVszXTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTeXN0ZW1MaWJyYXJ5U3RhdHVzKElTdGF0dXMgc3RhdHVzKQotCXsKLQkJZlN0YXRpWzNdID0gc3RhdHVzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFZlcnNpb25TdGF0dXMoSVN0YXR1cyBzdGF0dXMpCi0JewotCQlmU3RhdGlbMl0gPSBzdGF0dXM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQnV0dG9uc0VuYWJsZVN0YXRlKElTdGF0dXMgc3RhdHVzKQotCXsKLQkJQnV0dG9uIG9rID0gZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpOwotCQlpZiAob2sgIT0gbnVsbCAmJiAhb2suaXNEaXNwb3NlZCgpKQotCQkJb2suc2V0RW5hYmxlZChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLk9LKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRCdXR0b25MYXlvdXREYXRhKEJ1dHRvbiBidXR0b24pCi0JewotCQlzdXBlci5zZXRCdXR0b25MYXlvdXREYXRhKGJ1dHRvbik7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREaWFsb2dTZXR0aW5nc1NlY3Rpb25OYW1lKCkKLQl7Ci0JCXJldHVybiAiQUREX1BST0NFU1NPUl9ESUFMT0dfU0VDVElPTiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSURpYWxvZ1NldHRpbmdzIGdldERpYWxvZ0JvdW5kc1NldHRpbmdzKCkKLQl7Ci0vLwkJSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzID0gWFNMRGVidWdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLS8vCQlJRGlhbG9nU2V0dGluZ3Mgc2VjdGlvbiA9IHNldHRpbmdzLmdldFNlY3Rpb24oZ2V0RGlhbG9nU2V0dGluZ3NTZWN0aW9uTmFtZSgpKTsKLS8vCQlpZiAoc2VjdGlvbiA9PSBudWxsKQotLy8JCXsKLS8vCQkJc2VjdGlvbiA9IHNldHRpbmdzLmFkZE5ld1NlY3Rpb24oZ2V0RGlhbG9nU2V0dGluZ3NTZWN0aW9uTmFtZSgpKTsKLS8vCQl9Ci0vLwkJcmV0dXJuIHNlY3Rpb247Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvZGVidWcvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvQmFzZVByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2RlYnVnL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0Jhc2VQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2RiNmJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvZGVidWcvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvQmFzZVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotCi1wdWJsaWMgY2xhc3MgQmFzZVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UKLXsKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KQotCXsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkKLQl7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9kZWJ1Zy91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9JbnN0YWxsZWRQcm9jZXNzb3JzQmxvY2suamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvZGVidWcvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSW5zdGFsbGVkUHJvY2Vzc29yc0Jsb2NrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxZDA2YjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9kZWJ1Zy91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9JbnN0YWxsZWRQcm9jZXNzb3JzQmxvY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UubGF5b3V0LkdyaWREYXRhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRG91YmxlQ2xpY2tMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLkFic3RyYWN0VGFibGVCbG9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLlhTTERlYnVnVUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5YU0xEZWJ1Z1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy51aS5pbnRlcm5hbC50YWJzLnByb2Nlc3Nvci5JbnN0YWxsU3RhbmRpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLklQcm9jZXNzb3JJbnN0YWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuSVByb2Nlc3NvclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5KQVhQUnVudGltZTsKLQotcHVibGljIGNsYXNzIEluc3RhbGxlZFByb2Nlc3NvcnNCbG9jayBleHRlbmRzIEFic3RyYWN0VGFibGVCbG9jayBpbXBsZW1lbnRzIElTZWxlY3Rpb25Qcm92aWRlcgotewotCXByaXZhdGUgQ29tcG9zaXRlIGZDb250cm9sOwotCXByaXZhdGUgZmluYWwgTGlzdDxJUHJvY2Vzc29ySW5zdGFsbD4gcHJvY2Vzc29ycyA9IG5ldyBBcnJheUxpc3Q8SVByb2Nlc3Nvckluc3RhbGw+KCk7Ci0JcHJpdmF0ZSBDaGVja2JveFRhYmxlVmlld2VyIHRhYmxlVmlld2VyOwotCXByaXZhdGUgQnV0dG9uIGZBZGRCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gZlJlbW92ZUJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBmRWRpdEJ1dHRvbjsKLQlwcml2YXRlIGZpbmFsIExpc3RlbmVyTGlzdCBmU2VsZWN0aW9uTGlzdGVuZXJzID0gbmV3IExpc3RlbmVyTGlzdCgpOwotCXByaXZhdGUgSVNlbGVjdGlvbiBmUHJldlNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCk7Ci0KLQlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikKLQl7Ci0JCWZTZWxlY3Rpb25MaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikKLQl7Ci0JCWZTZWxlY3Rpb25MaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKQotCXsKLQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHRhYmxlVmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0JewotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JCXsKLQkJCWlmICghc2VsZWN0aW9uLmVxdWFscyhmUHJldlNlbGVjdGlvbikpCi0JCQl7Ci0JCQkJZlByZXZTZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JCQkJT2JqZWN0IGpyZSA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJaWYgKGpyZSA9PSBudWxsKQotCQkJCXsKLQkJCQkJdGFibGVWaWV3ZXIuc2V0Q2hlY2tlZEVsZW1lbnRzKG5ldyBPYmplY3RbMF0pOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQl0YWJsZVZpZXdlci5zZXRDaGVja2VkRWxlbWVudHMobmV3IE9iamVjdFtdCi0JCQkJCXsganJlIH0pOwotCQkJCQl0YWJsZVZpZXdlci5yZXZlYWwoanJlKTsKLQkJCQl9Ci0JCQkJZmlyZVNlbGVjdGlvbkNoYW5nZWQoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIGFuY2VzdG9yKQotCXsKLQotCQlDb21wb3NpdGUgcGFyZW50ID0gbmV3IENvbXBvc2l0ZShhbmNlc3RvciwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCXBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJRm9udCBmb250ID0gYW5jZXN0b3IuZ2V0Rm9udCgpOwotCQlwYXJlbnQuc2V0Rm9udChmb250KTsKLQkJZkNvbnRyb2wgPSBwYXJlbnQ7Ci0KLQkJR3JpZERhdGEgZGF0YTsKLQotCQlMYWJlbCB0YWJsZUxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQl0YWJsZUxhYmVsLnNldFRleHQoTWVzc2FnZXMuSW5zdGFsbGVkUHJvY2Vzc29yc0Jsb2NrXzApOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQl0YWJsZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXRhYmxlTGFiZWwuc2V0Rm9udChmb250KTsKLQotCQlUYWJsZSBmVGFibGUgPSBuZXcgVGFibGUocGFyZW50LCBTV1QuQ0hFQ0sgfCBTV1QuQk9SREVSIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULlZfU0NST0xMKTsKLQotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gNDUwOwotCQlmVGFibGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZlRhYmxlLnNldEZvbnQoZm9udCk7Ci0KLQkJZlRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCWZUYWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0KLQkJVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbihmVGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uMS5zZXRXaWR0aCgxODApOwotCQljb2x1bW4xLnNldFJlc2l6YWJsZSh0cnVlKTsKLQkJY29sdW1uMS5zZXRUZXh0KE1lc3NhZ2VzLkluc3RhbGxlZFByb2Nlc3NvcnNCbG9ja18xKTsKLQkJY29sdW1uMS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLQkJCXsKLQkJCQlzb3J0QnlOYW1lKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCVRhYmxlQ29sdW1uIGNvbHVtbjIgPSBuZXcgVGFibGVDb2x1bW4oZlRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbjIuc2V0V2lkdGgoOTApOwotCQljb2x1bW4yLnNldFJlc2l6YWJsZSh0cnVlKTsKLQkJY29sdW1uMi5zZXRUZXh0KE1lc3NhZ2VzLkluc3RhbGxlZFByb2Nlc3NvcnNCbG9ja18yKTsKLQkJY29sdW1uMi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLQkJCXsKLQkJCQlzb3J0QnlUeXBlKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCVRhYmxlQ29sdW1uIGNvbHVtbjQgPSBuZXcgVGFibGVDb2x1bW4oZlRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbjQuc2V0V2lkdGgoMTgwKTsKLQkJY29sdW1uNC5zZXRSZXNpemFibGUodHJ1ZSk7Ci0JCWNvbHVtbjQuc2V0VGV4dChNZXNzYWdlcy5JbnN0YWxsZWRQcm9jZXNzb3JzQmxvY2tfNCk7Ci0JCWNvbHVtbjQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0JCQl7Ci0JCQkJc29ydEJ5VmVyc2lvbigpOwotCQkJfQotCQl9KTsKLQotCQl0YWJsZVZpZXdlciA9IG5ldyBDaGVja2JveFRhYmxlVmlld2VyKGZUYWJsZSk7Ci0JCXRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFZNTGFiZWxQcm92aWRlcigpKTsKLQkJdGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBQcm9jZXNzb3JzQ29udGVudFByb3ZpZGVyKCkpOwotCi0JCXRhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpCi0JCXsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2dCkKLQkJCXsKLQkJCQllbmFibGVCdXR0b25zKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXRhYmxlVmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihuZXcgSUNoZWNrU3RhdGVMaXN0ZW5lcigpCi0JCXsKLQkJCXB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpCi0JCQl7Ci0JCQkJaWYgKGV2ZW50LmdldENoZWNrZWQoKSkKLQkJCQl7Ci0JCQkJCXNldENoZWNrZWRJbnN0YWxsKChJUHJvY2Vzc29ySW5zdGFsbCkgZXZlbnQuZ2V0RWxlbWVudCgpKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJc2V0Q2hlY2tlZEluc3RhbGwobnVsbCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQl0YWJsZVZpZXdlci5hZGREb3VibGVDbGlja0xpc3RlbmVyKG5ldyBJRG91YmxlQ2xpY2tMaXN0ZW5lcigpCi0JCXsKLQkJCXB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZSkKLQkJCXsKLQkJCQlpZiAoIXRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSkKLQkJCQl7Ci0JCQkJCWVkaXRQcm9jZXNzb3IoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlmVGFibGUuYWRkS2V5TGlzdGVuZXIobmV3IEtleUFkYXB0ZXIoKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZXZlbnQpCi0JCQl7Ci0JCQkJaWYgKGV2ZW50LmNoYXJhY3RlciA9PSBTV1QuREVMICYmIGV2ZW50LnN0YXRlTWFzayA9PSAwKQotCQkJCXsKLQkJCQkJcmVtb3ZlUHJvY2Vzc29ycygpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJQ29tcG9zaXRlIGJ1dHRvbnMgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlidXR0b25zLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORykpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJYnV0dG9ucy5zZXRMYXlvdXQobGF5b3V0KTsKLQkJYnV0dG9ucy5zZXRGb250KGZvbnQpOwotCi0JCWZBZGRCdXR0b24gPSBjcmVhdGVQdXNoQnV0dG9uKGJ1dHRvbnMsIE1lc3NhZ2VzLkluc3RhbGxlZFByb2Nlc3NvcnNCbG9ja181KTsKLQkJZkFkZEJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKQotCQl7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldnQpCi0JCQl7Ci0JCQkJYWRkUHJvY2Vzc29yKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWZFZGl0QnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihidXR0b25zLCBNZXNzYWdlcy5JbnN0YWxsZWRQcm9jZXNzb3JzQmxvY2tfNik7Ci0JCWZFZGl0QnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpCi0JCXsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2dCkKLQkJCXsKLQkJCQllZGl0UHJvY2Vzc29yKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWZSZW1vdmVCdXR0b24gPSBjcmVhdGVQdXNoQnV0dG9uKGJ1dHRvbnMsIE1lc3NhZ2VzLkluc3RhbGxlZFByb2Nlc3NvcnNCbG9ja183KTsKLQkJZlJlbW92ZUJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKQotCQl7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldnQpCi0JCQl7Ci0JCQkJcmVtb3ZlUHJvY2Vzc29ycygpOwotCQkJfQotCQl9KTsKLQotCQkvLyBjb3BpZWQgZnJvbSBMaXN0RGlhbG9nRmllbGQuQ3JlYXRlU2VwYXJhdG9yKCkKLQkJTGFiZWwgc2VwYXJhdG9yID0gbmV3IExhYmVsKGJ1dHRvbnMsIFNXVC5OT05FKTsKLQkJc2VwYXJhdG9yLnNldFZpc2libGUoZmFsc2UpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ2QudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5CRUdJTk5JTkc7Ci0JCWdkLmhlaWdodEhpbnQgPSA0OwotCQlzZXBhcmF0b3Iuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJZmlsbFdpdGhXb3Jrc3BhY2VQcm9jZXNzb3JzKCk7Ci0JCWVuYWJsZUJ1dHRvbnMoKTsKLQotCQlyZXN0b3JlQ29sdW1uU2V0dGluZ3MoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaWxsV2l0aFdvcmtzcGFjZVByb2Nlc3NvcnMoKQotCXsKLQkJTGlzdDxJbnN0YWxsU3RhbmRpbj4gc3RhbmRpbnMgPSBuZXcgQXJyYXlMaXN0PEluc3RhbGxTdGFuZGluPigpOwotCQlJUHJvY2Vzc29yVHlwZVtdIHR5cGVzID0gSkFYUFJ1bnRpbWUuZ2V0UHJvY2Vzc29yVHlwZXMoKTsKLQkJZm9yIChJUHJvY2Vzc29yVHlwZSB0eXBlIDogdHlwZXMpCi0JCXsKLQkJCUlQcm9jZXNzb3JJbnN0YWxsW10gaW5zdGFsbHMgPSBKQVhQUnVudGltZS5nZXRQcm9jZXNzb3JzKHR5cGUuZ2V0SWQoKSk7Ci0JCQlmb3IgKElQcm9jZXNzb3JJbnN0YWxsIGluc3RhbGwgOiBpbnN0YWxscykKLQkJCXsKLQkJCQlzdGFuZGlucy5hZGQobmV3IEluc3RhbGxTdGFuZGluKGluc3RhbGwpKTsKLQkJCX0KLQkJfQotCQlzZXRQcm9jZXNzb3JzKHN0YW5kaW5zLnRvQXJyYXkobmV3IElQcm9jZXNzb3JJbnN0YWxsW3N0YW5kaW5zLnNpemUoKV0pKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmlyZVNlbGVjdGlvbkNoYW5nZWQoKQotCXsKLQkJU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50ID0gbmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudCh0aGlzLCBnZXRTZWxlY3Rpb24oKSk7Ci0JCU9iamVjdFtdIGxpc3RlbmVycyA9IGZTZWxlY3Rpb25MaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7Ci0JCWZvciAoT2JqZWN0IGVsZW1lbnQgOiBsaXN0ZW5lcnMpCi0JCXsKLQkJCUlTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgPSAoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikgZWxlbWVudDsKLQkJCWxpc3RlbmVyLnNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU29ydHMgYnkgdHlwZSwgYW5kIG5hbWUgd2l0aGluIHR5cGUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNvcnRCeVR5cGUoKQotCXsKLQkJdGFibGVWaWV3ZXIuc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikKLQkJCXsKLQkJCQlJUHJvY2Vzc29ySW5zdGFsbCBsZWZ0ID0gKElQcm9jZXNzb3JJbnN0YWxsKSBlMTsKLQkJCQlJUHJvY2Vzc29ySW5zdGFsbCByaWdodCA9IChJUHJvY2Vzc29ySW5zdGFsbCkgZTI7Ci0JCQkJcmV0dXJuIGxlZnQuZ2V0UHJvY2Vzc29yVHlwZSgpLmdldExhYmVsKCkuY29tcGFyZVRvSWdub3JlQ2FzZShyaWdodC5nZXRQcm9jZXNzb3JUeXBlKCkuZ2V0TGFiZWwoKSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gaXNTb3J0ZXJQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KQotCQkJewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc29ydEJ5VmVyc2lvbigpCi0JewotCQl0YWJsZVZpZXdlci5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKQotCQkJewotCQkJCUlQcm9jZXNzb3JJbnN0YWxsIGxlZnQgPSAoSVByb2Nlc3Nvckluc3RhbGwpIGUxOwotCQkJCUlQcm9jZXNzb3JJbnN0YWxsIHJpZ2h0ID0gKElQcm9jZXNzb3JJbnN0YWxsKSBlMjsKLQkJCQlyZXR1cm4gbGVmdC5nZXRTdXBwb3J0cygpLmNvbXBhcmVUb0lnbm9yZUNhc2UocmlnaHQuZ2V0U3VwcG9ydHMoKSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gaXNTb3J0ZXJQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KQotCQkJewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBTb3J0cyBieSBuYW1lLgotCSAqLwotCXByaXZhdGUgdm9pZCBzb3J0QnlOYW1lKCkKLQl7Ci0JCXRhYmxlVmlld2VyLnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpCi0JCQl7Ci0JCQkJaWYgKChlMSBpbnN0YW5jZW9mIElQcm9jZXNzb3JJbnN0YWxsKSAmJiAoZTIgaW5zdGFuY2VvZiBJUHJvY2Vzc29ySW5zdGFsbCkpCi0JCQkJewotCQkJCQlJUHJvY2Vzc29ySW5zdGFsbCBsZWZ0ID0gKElQcm9jZXNzb3JJbnN0YWxsKSBlMTsKLQkJCQkJSVByb2Nlc3Nvckluc3RhbGwgcmlnaHQgPSAoSVByb2Nlc3Nvckluc3RhbGwpIGUyOwotCQkJCQlyZXR1cm4gbGVmdC5nZXROYW1lKCkuY29tcGFyZVRvSWdub3JlQ2FzZShyaWdodC5nZXROYW1lKCkpOwotCQkJCX0KLQkJCQlyZXR1cm4gc3VwZXIuY29tcGFyZSh2aWV3ZXIsIGUxLCBlMik7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gaXNTb3J0ZXJQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KQotCQkJewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZW5hYmxlQnV0dG9ucygpCi0JewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQlpbnQgc2VsZWN0aW9uQ291bnQgPSBzZWxlY3Rpb24uc2l6ZSgpOwotCQlmRWRpdEJ1dHRvbi5zZXRFbmFibGVkKHNlbGVjdGlvbkNvdW50ID09IDEgJiYgISgoSVByb2Nlc3Nvckluc3RhbGwpc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKS5pc0NvbnRyaWJ1dGVkKCkpOwotCQlpZiAoc2VsZWN0aW9uQ291bnQgPiAwICYmIHNlbGVjdGlvbkNvdW50IDwgdGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSkKLQkJewotCQkJSXRlcmF0b3I8Pz4gaXRlcmF0b3IgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0JCQl7Ci0JCQkJSVByb2Nlc3Nvckluc3RhbGwgaW5zdGFsbCA9IChJUHJvY2Vzc29ySW5zdGFsbCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmIChpbnN0YWxsLmlzQ29udHJpYnV0ZWQoKSkKLQkJCQl7Ci0JCQkJCWZSZW1vdmVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQlmUmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlmUmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEJ1dHRvbiBjcmVhdGVQdXNoQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbCkKLQl7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotCQlidXR0b24uc2V0VGV4dChsYWJlbCk7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKEdyaWREYXRhRmFjdG9yeS5maWxsRGVmYXVsdHMoKS5jcmVhdGUoKSk7Ci0JCXJldHVybiBidXR0b247Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpCi0JewotCQlyZXR1cm4gZkNvbnRyb2w7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJvY2Vzc29ycyhJUHJvY2Vzc29ySW5zdGFsbFtdIHZtcykKLQl7Ci0JCXByb2Nlc3NvcnMuY2xlYXIoKTsKLQkJZm9yIChJUHJvY2Vzc29ySW5zdGFsbCBlbGVtZW50IDogdm1zKQotCQl7Ci0JCQlwcm9jZXNzb3JzLmFkZChlbGVtZW50KTsKLQkJfQotCQl0YWJsZVZpZXdlci5zZXRJbnB1dChwcm9jZXNzb3JzKTsKLQkJLy8gdGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCX0KLQotCXB1YmxpYyBJUHJvY2Vzc29ySW5zdGFsbFtdIGdldFByb2Nlc3NvcnMoKQotCXsKLQkJcmV0dXJuIHByb2Nlc3NvcnMudG9BcnJheShuZXcgSVByb2Nlc3Nvckluc3RhbGxbcHJvY2Vzc29ycy5zaXplKCldKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkUHJvY2Vzc29yKCkKLQl7Ci0JCUFkZFByb2Nlc3NvckRpYWxvZyBkaWFsb2cgPSBuZXcgQWRkUHJvY2Vzc29yRGlhbG9nKHRoaXMsIGdldFNoZWxsKCksIEpBWFBSdW50aW1lLmdldFByb2Nlc3NvclR5cGVzRXhjbEpSRURlZmF1bHQoKSwgbnVsbCk7Ci0JCWRpYWxvZy5zZXRUaXRsZShNZXNzYWdlcy5BZGRQcm9jZXNzb3JEaWFsb2dfQWRkX1RpdGxlKTsKLQkJaWYgKGRpYWxvZy5vcGVuKCkgIT0gV2luZG93Lk9LKQotCQl7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9jZXNzb3JBZGRlZChJUHJvY2Vzc29ySW5zdGFsbCBpbnN0YWxsKQotCXsKLQkJcHJvY2Vzc29ycy5hZGQoaW5zdGFsbCk7Ci0JCXRhYmxlVmlld2VyLmFkZChpbnN0YWxsKTsKLQkJdGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGluc3RhbGwpLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0R1cGxpY2F0ZU5hbWUoU3RyaW5nIG5hbWUpCi0JewotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2Nlc3NvcnMuc2l6ZSgpOyBpKyspCi0JCXsKLQkJCUlQcm9jZXNzb3JJbnN0YWxsIGluc3RhbGwgPSBwcm9jZXNzb3JzLmdldChpKTsKLQkJCWlmIChpbnN0YWxsLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpCi0JCQl7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgdm9pZCBlZGl0UHJvY2Vzc29yKCkKLQl7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCUlQcm9jZXNzb3JJbnN0YWxsIGluc3RhbGwgPSAoSVByb2Nlc3Nvckluc3RhbGwpIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJaWYgKGluc3RhbGwgPT0gbnVsbCkKLQkJewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICghaW5zdGFsbC5pc0NvbnRyaWJ1dGVkKCkpCi0JCXsKLS8vCQkJUHJvY2Vzc29yRGV0YWlsc0RpYWxvZyBkaWFsb2cgPSBuZXcgUHJvY2Vzc29yRGV0YWlsc0RpYWxvZyhnZXRTaGVsbCgpLCBpbnN0YWxsKTsKLS8vCQkJZGlhbG9nLm9wZW4oKTsKLS8vCQl9Ci0vLwkJZWxzZQotLy8JCXsKLQkJCUFkZFByb2Nlc3NvckRpYWxvZyBkaWFsb2cgPSBuZXcgQWRkUHJvY2Vzc29yRGlhbG9nKHRoaXMsIGdldFNoZWxsKCksIEpBWFBSdW50aW1lLmdldFByb2Nlc3NvclR5cGVzRXhjbEpSRURlZmF1bHQoKSwgaW5zdGFsbCk7Ci0JCQlkaWFsb2cuc2V0VGl0bGUoTWVzc2FnZXMuQWRkUHJvY2Vzc29yRGlhbG9nX0VkaXRfVGl0bGUpOwotCQkJaWYgKGRpYWxvZy5vcGVuKCkgIT0gV2luZG93Lk9LKQotCQkJewotCQkJCXJldHVybjsKLQkJCX0KLQkJCS8vIGZpbGxXaXRoV29ya3NwYWNlUHJvY2Vzc29ycygpOwotCQkJdGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVByb2Nlc3NvcnMoKQotCXsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJSVByb2Nlc3Nvckluc3RhbGxbXSB2bXMgPSBuZXcgSVByb2Nlc3Nvckluc3RhbGxbc2VsZWN0aW9uLnNpemUoKV07Ci0JCUl0ZXJhdG9yPD8+IGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpCi0JCXsKLQkJCXZtc1tpXSA9IChJUHJvY2Vzc29ySW5zdGFsbCkgaXRlci5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJcmVtb3ZlUHJvY2Vzc29ycyh2bXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVByb2Nlc3NvcnMoSVByb2Nlc3Nvckluc3RhbGxbXSB0aGVJbnN0YWxscykKLQl7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHByZXYgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFNlbGVjdGlvbigpOwotCQlmb3IgKElQcm9jZXNzb3JJbnN0YWxsIGVsZW1lbnQgOiB0aGVJbnN0YWxscykKLQkJewotCQkJcHJvY2Vzc29ycy5yZW1vdmUoZWxlbWVudCk7Ci0JCX0KLQkJdGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBjdXJyID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRTZWxlY3Rpb24oKTsKLQkJaWYgKCFjdXJyLmVxdWFscyhwcmV2KSkKLQkJewotCQkJSVByb2Nlc3Nvckluc3RhbGxbXSBpbnN0YWxscyA9IGdldFByb2Nlc3NvcnMoKTsKLQkJCWlmIChjdXJyLnNpemUoKSA9PSAwICYmIGluc3RhbGxzLmxlbmd0aCA9PSAxKQotCQkJewotCQkJCS8vIHBpY2sgYSBkZWZhdWx0IGluc3RhbGwgYXV0b21hdGljYWxseQotCQkJCXNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihpbnN0YWxsc1swXSkpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWZpcmVTZWxlY3Rpb25DaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDaGVja2VkSW5zdGFsbChJUHJvY2Vzc29ySW5zdGFsbCBpbnN0YWxsKQotCXsKLQkJaWYgKGluc3RhbGwgPT0gbnVsbCkKLQkJewotCQkJc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCkpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGluc3RhbGwpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJUHJvY2Vzc29ySW5zdGFsbCBnZXRDaGVja2VkSW5zdGFsbCgpCi0JewotCQlPYmplY3RbXSBvYmplY3RzID0gdGFibGVWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7Ci0JCWlmIChvYmplY3RzLmxlbmd0aCA9PSAwKQotCQl7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gKElQcm9jZXNzb3JJbnN0YWxsKSBvYmplY3RzWzBdOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFNvcnRDb2x1bW4oaW50IGNvbHVtbikKLQl7Ci0JCXN3aXRjaCAoY29sdW1uKQotCQl7Ci0JCQljYXNlIDE6Ci0JCQkJc29ydEJ5TmFtZSgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyOgotCQkJCXNvcnRCeVR5cGUoKTsKLQkJCQlicmVhazsKLQkJfQotCQlzdXBlci5zZXRTb3J0Q29sdW1uKGNvbHVtbik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFRhYmxlIGdldFRhYmxlKCkKLQl7Ci0JCXJldHVybiB0YWJsZVZpZXdlci5nZXRUYWJsZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJRGlhbG9nU2V0dGluZ3MgZ2V0RGlhbG9nU2V0dGluZ3MoKQotCXsKLQkJcmV0dXJuIFhTTERlYnVnVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRRdWFsaWZpZXIoKQotCXsKLQkJcmV0dXJuIFhTTERlYnVnVUlDb25zdGFudHMuUFJPQ0VTU09SX0RFVEFJTFNfRElBTE9HOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKQotCXsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtQXBwbHkoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uKQotCXsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0cyhJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24pCi0JewotCX0KLQotCXByaXZhdGUgY2xhc3MgUHJvY2Vzc29yc0NvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyCi0JewotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0KQotCQl7Ci0JCQlyZXR1cm4gcHJvY2Vzc29ycy50b0FycmF5KCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpCi0JCXsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotCQl7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFZNTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyCi0JewotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkKLQkJewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUHJvY2Vzc29ySW5zdGFsbCkKLQkJCXsKLQkJCQlJUHJvY2Vzc29ySW5zdGFsbCBpbnN0YWxsID0gKElQcm9jZXNzb3JJbnN0YWxsKSBlbGVtZW50OwotCQkJCXN3aXRjaCAoY29sdW1uSW5kZXgpCi0JCQkJewotCQkJCQljYXNlIDA6Ci0JCQkJCQlyZXR1cm4gaW5zdGFsbC5nZXROYW1lKCk7Ci0JCQkJCWNhc2UgMToKLQkJCQkJCXJldHVybiBpbnN0YWxsLmdldFByb2Nlc3NvclR5cGUoKS5nZXRMYWJlbCgpOwotCQkJCQljYXNlIDI6Ci0JCQkJCQlpZiAoaW5zdGFsbC5nZXREZWJ1Z2dlcigpICE9IG51bGwpCi0JCQkJCQl7Ci0JCQkJCQkJcmV0dXJuIGluc3RhbGwuZ2V0RGVidWdnZXIoKS5nZXROYW1lKCk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gTWVzc2FnZXMuSW5zdGFsbGVkUHJvY2Vzc29yc0Jsb2NrXzg7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGVsZW1lbnQudG9TdHJpbmcoKTsKLQkJfQotCi0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KQotCQl7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9kZWJ1Zy91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9kZWJ1Zy91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzQwNGUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvZGVidWcvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMKLQl7Ci0JCS8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRQcm9jZXNzb3JEaWFsb2dfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRQcm9jZXNzb3JEaWFsb2dfNzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRQcm9jZXNzb3JEaWFsb2dfRWRpdF9UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRQcm9jZXNzb3JEaWFsb2dfQWRkX1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFByb2Nlc3NvckRpYWxvZ19qYXJzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFByb2Nlc3NvckRpYWxvZ19hdHRyaWJ1dGVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFByb2Nlc3NvckRpYWxvZ19wcm9jZXNzb3JOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFByb2Nlc3NvckRpYWxvZ19wcm9jZXNzb3JUeXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFByb2Nlc3NvckRpYWxvZ19lbnRlck5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkUHJvY2Vzc29yRGlhbG9nX2R1cGxpY2F0ZU5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzb3JMaWJyYXJ5QmxvY2tfNjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzb3JMaWJyYXJ5QmxvY2tfQWRkQnV0dG9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NvckxpYnJhcnlCbG9ja19SZW1vdmVCdXR0b247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc29yTGlicmFyeUJsb2NrX0FkZFdvcmtzcGFjZUJ1dHRvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzb3JMaWJyYXJ5QmxvY2tfRmlsZURpYWxvZ19UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzb3JMaWJyYXJ5QmxvY2tfV29ya3NwYWNlRmlsZURpYWxvZ19UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzb3JMaWJyYXJ5QmxvY2tfV29ya3NwYWNlRmlsZURpYWxvZ19NZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbGVkUHJvY2Vzc29yc0Jsb2NrXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbGVkUHJvY2Vzc29yc0Jsb2NrXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbGVkUHJvY2Vzc29yc0Jsb2NrXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbGVkUHJvY2Vzc29yc0Jsb2NrXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbGVkUHJvY2Vzc29yc0Jsb2NrXzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbGVkUHJvY2Vzc29yc0Jsb2NrXzU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbGVkUHJvY2Vzc29yc0Jsb2NrXzY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbGVkUHJvY2Vzc29yc0Jsb2NrXzc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbGVkUHJvY2Vzc29yc0Jsb2NrXzg7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc29yc1ByZWZlcmVuY2VQYWdlXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc29yc1ByZWZlcmVuY2VQYWdlXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc29yc1ByZWZlcmVuY2VQYWdlXzI7Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkKLQl7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9kZWJ1Zy91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9Qcm9jZXNzb3JMaWJyYXJ5QmxvY2suamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvZGVidWcvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvUHJvY2Vzc29yTGlicmFyeUJsb2NrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNTJkYzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9kZWJ1Zy91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9Qcm9jZXNzb3JMaWJyYXJ5QmxvY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5FbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLklTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MubmF2aWdhdG9yLlJlc291cmNlQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLlhTTERlYnVnVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpLmludGVybmFsLnRhYnMucHJvY2Vzc29yLkluc3RhbGxTdGFuZGluOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy51aS5pbnRlcm5hbC50YWJzLnByb2Nlc3Nvci5KYXJDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpLmludGVybmFsLnRhYnMucHJvY2Vzc29yLkphckxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5JUHJvY2Vzc29ySW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLklQcm9jZXNzb3JKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5JUHJvY2Vzc29yVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLkpBWFBSdW50aW1lOwotCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc29yTGlicmFyeUJsb2NrIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIsIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIKLXsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMQVNUX1BBVEhfU0VUVElORyA9ICJMQVNUX1BBVEhfU0VUVElORyI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMQVNUX1dPUktTUEFDRV9QQVRIX1NFVFRJTkcgPSAiTEFTVF9XT1JLU1BBQ0VfUEFUSF9TRVRUSU5HIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUxPR19TRVRUSU5HU19QUkVGSVggPSAiUHJvY2Vzc29yTGlicmFyeUJsb2NrIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBJbnN0YWxsU3RhbmRpbiBpbnN0YWxsOwotCXByb3RlY3RlZCBJUHJvY2Vzc29yVHlwZSBpbnN0YWxsVHlwZTsKLQlwcm90ZWN0ZWQgQWRkUHJvY2Vzc29yRGlhbG9nIGFkZERpYWxvZyA9IG51bGw7Ci0JcHJvdGVjdGVkIFRhYmxlVmlld2VyIHRhYmxlVmlld2VyOwotCXByaXZhdGUgQnV0dG9uIHJlbW92ZUJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBhZGRCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gYWRkV29ya3NwYWNlQnV0dG9uOwotCi0JcHJpdmF0ZSBmaW5hbCBJU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yIHZhbGlkYXRvciA9IG5ldyBJU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yKCkKLQl7Ci0JCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKE9iamVjdFtdIHNlbGVjdGlvbikKLQkJewotCQkJaWYgKHNlbGVjdGlvbi5sZW5ndGggPT0gMCkKLQkJCXsKLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBYU0xEZWJ1Z1VJUGx1Z2luLlBMVUdJTl9JRCwgMCwgIiIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlmb3IgKE9iamVjdCBlbGVtZW50IDogc2VsZWN0aW9uKQotCQkJewotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUZvbGRlcikKLQkJCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgWFNMRGVidWdVSVBsdWdpbi5QTFVHSU5fSUQsIDAsICIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRmlsZSkKLQkJCQl7Ci0JCQkJCS8vIElGaWxlIGZpbGUgPSAoSUZpbGUpIHNlbGVjdGlvbltpXTsKLQkJCQkJLy8gVE9ETyBjaGVjayB0aGF0IHRoZSBmaWxlIGlzIG5vdCBhbHJlYWR5IG9uIHRoZSBjbGFzc3BhdGgKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBYU0xEZWJ1Z1VJUGx1Z2luLlBMVUdJTl9JRCwgMCwgIiIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9OwotCi0JcHVibGljIFByb2Nlc3NvckxpYnJhcnlCbG9jayhBZGRQcm9jZXNzb3JEaWFsb2cgZGlhbG9nKQotCXsKLQkJYWRkRGlhbG9nID0gZGlhbG9nOwotCX0KLQotCXB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLQl7Ci0JCUZvbnQgZm9udCA9IHBhcmVudC5nZXRGb250KCk7Ci0KLQkJQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IHRvcExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCXRvcExheW91dC5udW1Db2x1bW5zID0gMjsKLQkJdG9wTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCXRvcExheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXAuc2V0TGF5b3V0KHRvcExheW91dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWNvbXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJdGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIoY29tcCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdkLmhlaWdodEhpbnQgPSA2OwotCQl0YWJsZVZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCUphckNvbnRlbnRQcm92aWRlciBmTGlicmFyeUNvbnRlbnRQcm92aWRlciA9IG5ldyBKYXJDb250ZW50UHJvdmlkZXIoKTsKLQkJdGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGZMaWJyYXJ5Q29udGVudFByb3ZpZGVyKTsKLQkJdGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgSmFyTGFiZWxQcm92aWRlcigpKTsKLQkJdGFibGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCi0JCUNvbXBvc2l0ZSBwYXRoQnV0dG9uQ29tcCA9IG5ldyBDb21wb3NpdGUoY29tcCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IHBhdGhCdXR0b25MYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlwYXRoQnV0dG9uTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCXBhdGhCdXR0b25MYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlwYXRoQnV0dG9uQ29tcC5zZXRMYXlvdXQocGF0aEJ1dHRvbkxheW91dCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCXBhdGhCdXR0b25Db21wLnNldExheW91dERhdGEoZ2QpOwotCQlwYXRoQnV0dG9uQ29tcC5zZXRGb250KGZvbnQpOwotCi0JCWFkZFdvcmtzcGFjZUJ1dHRvbiA9IGNyZWF0ZVB1c2hCdXR0b24ocGF0aEJ1dHRvbkNvbXAsIE1lc3NhZ2VzLlByb2Nlc3NvckxpYnJhcnlCbG9ja19BZGRXb3Jrc3BhY2VCdXR0b24pOwotCQlhZGRXb3Jrc3BhY2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJYWRkQnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihwYXRoQnV0dG9uQ29tcCwgTWVzc2FnZXMuUHJvY2Vzc29yTGlicmFyeUJsb2NrX0FkZEJ1dHRvbik7Ci0JCWFkZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotCQlyZW1vdmVCdXR0b24gPSBjcmVhdGVQdXNoQnV0dG9uKHBhdGhCdXR0b25Db21wLCBNZXNzYWdlcy5Qcm9jZXNzb3JMaWJyYXJ5QmxvY2tfUmVtb3ZlQnV0dG9uKTsKLQkJcmVtb3ZlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0JCXJldHVybiBjb21wOwotCX0KLQotCXByb3RlY3RlZCBCdXR0b24gY3JlYXRlUHVzaEJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwpCi0JewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLQkJYnV0dG9uLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0JCWJ1dHRvbi5zZXRUZXh0KGxhYmVsKTsKLQkJYWRkRGlhbG9nLnNldEJ1dHRvbkxheW91dERhdGEoYnV0dG9uKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVWZXJ0aWNhbFNwYWNlcihDb21wb3NpdGUgY29tcCwgaW50IGNvbFNwYW4pCi0JewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wLCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gY29sU3BhbjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oSW5zdGFsbFN0YW5kaW4gc3RhbmRpbiwgSVByb2Nlc3NvclR5cGUgdHlwZSkKLQl7Ci0JCWluc3RhbGwgPSBzdGFuZGluOwotCQlpbnN0YWxsVHlwZSA9IHR5cGU7Ci0JCWlmIChpbnN0YWxsICE9IG51bGwpCi0JCQl0YWJsZVZpZXdlci5zZXRJbnB1dChpbnN0YWxsKTsKLQkJdXBkYXRlKCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyBidXR0b25zIGFuZCBzdGF0dXMgYmFzZWQgb24gY3VycmVudCBsaWJyYXJpZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGUoKQotCXsKLQkJdXBkYXRlQnV0dG9ucygpOwotCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCWlmIChpbnN0YWxsICE9IG51bGwgJiYgaW5zdGFsbC5nZXRQcm9jZXNzb3JKYXJzKCkubGVuZ3RoID09IDApCi0JCXsKLQkJCXN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLCBYU0xEZWJ1Z1VJUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuUHJvY2Vzc29yTGlicmFyeUJsb2NrXzYsIG51bGwpOwotCQl9Ci0JCWFkZERpYWxvZy5zZXRTeXN0ZW1MaWJyYXJ5U3RhdHVzKHN0YXR1cyk7Ci0JCWFkZERpYWxvZy51cGRhdGVTdGF0dXNMaW5lKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybUFwcGx5KEluc3RhbGxTdGFuZGluIHN0YW5kaW4pCi0JewotCQlzdGFuZGluLnNldFByb2Nlc3NvckphcnMoaW5zdGFsbC5nZXRQcm9jZXNzb3JKYXJzKCkpOwotCX0KLQotCXByb3RlY3RlZCBJUHJvY2Vzc29ySW5zdGFsbCBnZXRWTUluc3RhbGwoKQotCXsKLQkJcmV0dXJuIGluc3RhbGw7Ci0JfQotCi0JcHJvdGVjdGVkIElQcm9jZXNzb3JUeXBlIGdldFZNSW5zdGFsbFR5cGUoKQotCXsKLQkJcmV0dXJuIGluc3RhbGxUeXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0JewotCQlPYmplY3Qgc291cmNlID0gZS5nZXRTb3VyY2UoKTsKLQkJaWYgKHNvdXJjZSA9PSByZW1vdmVCdXR0b24pCi0JCXsKLQkJCXJlbW92ZSgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpKTsKLQkJfQotCQllbHNlIGlmIChzb3VyY2UgPT0gYWRkQnV0dG9uKQotCQl7Ci0JCQlhZGRFeHRlcm5hbCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpKTsKLQkJfQotCQllbHNlIGlmIChzb3VyY2UgPT0gYWRkV29ya3NwYWNlQnV0dG9uKQotCQl7Ci0JCQlhZGRXb3Jrc3BhY2UoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKSk7Ci0JCX0KLQkJdXBkYXRlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0JewotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRFeHRlcm5hbChJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pCi0JewotCQlJRGlhbG9nU2V0dGluZ3MgZGlhbG9nU2V0dGluZ3MgPSBYU0xEZWJ1Z1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpOwotCQlTdHJpbmcgbGFzdFVzZWRQYXRoID0gZGlhbG9nU2V0dGluZ3MuZ2V0KExBU1RfUEFUSF9TRVRUSU5HKTsKLQkJaWYgKGxhc3RVc2VkUGF0aCA9PSBudWxsKQotCQl7Ci0JCQlsYXN0VXNlZFBhdGggPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2codGFibGVWaWV3ZXIuZ2V0Q29udHJvbCgpLmdldFNoZWxsKCksIFNXVC5NVUxUSSk7Ci0JCWRpYWxvZy5zZXRUZXh0KE1lc3NhZ2VzLlByb2Nlc3NvckxpYnJhcnlCbG9ja19GaWxlRGlhbG9nX1RpdGxlKTsKLQkJZGlhbG9nLnNldEZpbHRlckV4dGVuc2lvbnMobmV3IFN0cmluZ1tdCi0JCXsgIiouamFyOyouemlwIiB9KTsgLy8kTk9OLU5MUy0xJAotCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChsYXN0VXNlZFBhdGgpOwotCQlTdHJpbmcgcmVzID0gZGlhbG9nLm9wZW4oKTsKLQkJaWYgKHJlcyA9PSBudWxsKQotCQl7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nW10gZmlsZU5hbWVzID0gZGlhbG9nLmdldEZpbGVOYW1lcygpOwotCQlpbnQgbkNob3NlbiA9IGZpbGVOYW1lcy5sZW5ndGg7Ci0KLQkJSVBhdGggZmlsdGVyUGF0aCA9IG5ldyBQYXRoKGRpYWxvZy5nZXRGaWx0ZXJQYXRoKCkpOwotCQlJUHJvY2Vzc29ySmFyW10gbGlicyA9IG5ldyBJUHJvY2Vzc29ySmFyW25DaG9zZW5dOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5DaG9zZW47IGkrKykKLQkJewotCQkJbGlic1tpXSA9IEpBWFBSdW50aW1lLmNyZWF0ZVByb2Nlc3NvckphcihmaWx0ZXJQYXRoLmFwcGVuZChmaWxlTmFtZXNbaV0pLm1ha2VBYnNvbHV0ZSgpKTsKLQkJfQotCQlkaWFsb2dTZXR0aW5ncy5wdXQoTEFTVF9QQVRIX1NFVFRJTkcsIGZpbHRlclBhdGgudG9PU1N0cmluZygpKTsKLQotCQlJUHJvY2Vzc29ySmFyW10gY3VycmVudEphcnMgPSBpbnN0YWxsLmdldFByb2Nlc3NvckphcnMoKTsKLQkJSVByb2Nlc3NvckphcltdIG5ld0phcnMgPSBuZXcgSVByb2Nlc3NvckphcltjdXJyZW50SmFycy5sZW5ndGggKyBsaWJzLmxlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoY3VycmVudEphcnMsIDAsIG5ld0phcnMsIDAsIGN1cnJlbnRKYXJzLmxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkobGlicywgMCwgbmV3SmFycywgY3VycmVudEphcnMubGVuZ3RoLCBsaWJzLmxlbmd0aCk7Ci0JCWluc3RhbGwuc2V0UHJvY2Vzc29ySmFycyhuZXdKYXJzKTsKLQotCQl0YWJsZVZpZXdlci5hZGQobGlicyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFdvcmtzcGFjZShJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pCi0JewotCQlJRGlhbG9nU2V0dGluZ3MgZGlhbG9nU2V0dGluZ3MgPSBYU0xEZWJ1Z1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpOwotCQlTdHJpbmcgbGFzdFVzZWRQYXRoID0gZGlhbG9nU2V0dGluZ3MuZ2V0KExBU1RfV09SS1NQQUNFX1BBVEhfU0VUVElORyk7Ci0JCUlQYXRoIGxhc3RQYXRoID0gbnVsbDsKLQkJaWYgKGxhc3RVc2VkUGF0aCAhPSBudWxsKQotCQl7Ci0JCQlsYXN0UGF0aCA9IFBhdGguZnJvbVBvcnRhYmxlU3RyaW5nKGxhc3RVc2VkUGF0aCk7Ci0JCX0KLQotCQkvLyBJUmVzb3VyY2UgY3VycmVudFJlc291cmNlID0gZ2V0UmVzb3VyY2UoKTsKLQkJRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gbmV3IEVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nKHRhYmxlVmlld2VyLmdldENvbnRyb2woKS5nZXRTaGVsbCgpLCBuZXcgV29ya2JlbmNoTGFiZWxQcm92aWRlcigpLCBuZXcgV29ya2JlbmNoQ29udGVudFByb3ZpZGVyKCkpOwotCQlkaWFsb2cuc2V0VGl0bGUoTWVzc2FnZXMuUHJvY2Vzc29yTGlicmFyeUJsb2NrX1dvcmtzcGFjZUZpbGVEaWFsb2dfVGl0bGUpOwotCQlkaWFsb2cuc2V0TWVzc2FnZShNZXNzYWdlcy5Qcm9jZXNzb3JMaWJyYXJ5QmxvY2tfV29ya3NwYWNlRmlsZURpYWxvZ19NZXNzYWdlKTsKLQkJZGlhbG9nLnNldFZhbGlkYXRvcih2YWxpZGF0b3IpOwotCQlkaWFsb2cuYWRkRmlsdGVyKG5ldyBWaWV3ZXJGaWx0ZXIoKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpCi0JCQl7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29udGFpbmVyKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUZpbGUpCi0JCQkJewotCQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSBlbGVtZW50OwotCQkJCQlTdHJpbmcgZXh0ZW5zaW9uID0gZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0JCQkJCWlmIChleHRlbnNpb24gPT0gbnVsbCkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJcmV0dXJuIGV4dGVuc2lvbi5lcXVhbHMoImphciIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfSk7Ci0JCWRpYWxvZy5zZXRJbnB1dChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLQkJaWYgKGxhc3RQYXRoICE9IG51bGwpCi0JCQlkaWFsb2cuc2V0SW5pdGlhbFNlbGVjdGlvbihsYXN0UGF0aCk7Ci0JCWRpYWxvZy5zZXRDb21wYXJhdG9yKG5ldyBSZXNvdXJjZUNvbXBhcmF0b3IoUmVzb3VyY2VDb21wYXJhdG9yLk5BTUUpKTsKLQkJZGlhbG9nLnNldEFsbG93TXVsdGlwbGUodHJ1ZSk7Ci0KLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKQotCQl7Ci0JCQlPYmplY3RbXSBlbGVtZW50cyA9IGRpYWxvZy5nZXRSZXN1bHQoKTsKLQkJCWlmIChlbGVtZW50cy5sZW5ndGggPiAwKQotCQkJewotCQkJCUlQcm9jZXNzb3JKYXJbXSBsaWJzID0gbmV3IElQcm9jZXNzb3JKYXJbZWxlbWVudHMubGVuZ3RoXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotCQkJCXsKLQkJCQkJSUZpbGUgamFyID0gKElGaWxlKSBlbGVtZW50c1tpXTsKLQkJCQkJbGlic1tpXSA9IEpBWFBSdW50aW1lLmNyZWF0ZVByb2Nlc3NvckphcihqYXIuZ2V0RnVsbFBhdGgoKSk7Ci0JCQkJfQotCQkJCUlQcm9jZXNzb3JKYXJbXSBjdXJyZW50SmFycyA9IGluc3RhbGwuZ2V0UHJvY2Vzc29ySmFycygpOwotCQkJCUlQcm9jZXNzb3JKYXJbXSBuZXdKYXJzID0gbmV3IElQcm9jZXNzb3JKYXJbY3VycmVudEphcnMubGVuZ3RoICsgbGlicy5sZW5ndGhdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkoY3VycmVudEphcnMsIDAsIG5ld0phcnMsIDAsIGN1cnJlbnRKYXJzLmxlbmd0aCk7Ci0JCQkJU3lzdGVtLmFycmF5Y29weShsaWJzLCAwLCBuZXdKYXJzLCBjdXJyZW50SmFycy5sZW5ndGgsIGxpYnMubGVuZ3RoKTsKLQkJCQlpbnN0YWxsLnNldFByb2Nlc3NvckphcnMobmV3SmFycyk7Ci0KLQkJCQl0YWJsZVZpZXdlci5hZGQobGlicyk7Ci0KLQkJCQlsYXN0UGF0aCA9IGxpYnNbMF0uZ2V0UGF0aCgpOwotCQkJCWxhc3RQYXRoID0gbGFzdFBhdGgudXB0b1NlZ21lbnQobGFzdFBhdGguc2VnbWVudENvdW50KCkpOwotCQkJCWRpYWxvZ1NldHRpbmdzLnB1dChMQVNUX1dPUktTUEFDRV9QQVRIX1NFVFRJTkcsIGxhc3RQYXRoLnRvUG9ydGFibGVTdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikKLQl7Ci0JCUxpc3Q8SVByb2Nlc3Nvckphcj4gY3VycmVudEphcnMgPSBuZXcgQXJyYXlMaXN0PElQcm9jZXNzb3JKYXI+KEFycmF5cy5hc0xpc3QoaW5zdGFsbC5nZXRQcm9jZXNzb3JKYXJzKCkpKTsKLQkJZm9yIChJdGVyYXRvcjw/PiBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLQkJewotCQkJY3VycmVudEphcnMucmVtb3ZlKGl0ZXIubmV4dCgpKTsKLQkJfQotCQlpbnN0YWxsLnNldFByb2Nlc3NvckphcnMoY3VycmVudEphcnMudG9BcnJheShuZXcgSVByb2Nlc3NvckphclswXSkpOwotCQl0YWJsZVZpZXdlci5yZW1vdmUoc2VsZWN0aW9uLnRvQXJyYXkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0JewotCQl1cGRhdGVCdXR0b25zKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUJ1dHRvbnMoKQotCXsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoIXNlbGVjdGlvbi5pc0VtcHR5KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvZGVidWcvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvUHJvY2Vzc29yc1ByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2RlYnVnL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1Byb2Nlc3NvcnNQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2U0ZWVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvZGVidWcvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvUHJvY2Vzc29yc1ByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5YU0xEZWJ1Z1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuSVByb2Nlc3Nvckluc3RhbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5KQVhQUnVudGltZTsKLQotcHVibGljIGNsYXNzIFByb2Nlc3NvcnNQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlCi17Ci0JcHJpdmF0ZSBJbnN0YWxsZWRQcm9jZXNzb3JzQmxvY2sgcHJvY2Vzc29yc0Jsb2NrOwotCi0JcHVibGljIFByb2Nlc3NvcnNQcmVmZXJlbmNlUGFnZSgpCi0JewotCQlzdXBlcigpOwotCQkvLyBvbmx5IHVzZWQgd2hlbiBwYWdlIGlzIHNob3duIHByb2dyYW1hdGljYWxseQotCQlzZXRUaXRsZShNZXNzYWdlcy5Qcm9jZXNzb3JzUHJlZmVyZW5jZVBhZ2VfMCk7Ci0JCXNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLlByb2Nlc3NvcnNQcmVmZXJlbmNlUGFnZV8xKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKQotCXsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgYW5jZXN0b3IpCi0JewotCQlpbml0aWFsaXplRGlhbG9nVW5pdHMoYW5jZXN0b3IpOwotCi0JCW5vRGVmYXVsdEFuZEFwcGx5QnV0dG9uKCk7Ci0KLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlhbmNlc3Rvci5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlwcm9jZXNzb3JzQmxvY2sgPSBuZXcgSW5zdGFsbGVkUHJvY2Vzc29yc0Jsb2NrKCk7Ci0JCXByb2Nlc3NvcnNCbG9jay5jcmVhdGVDb250cm9sKGFuY2VzdG9yKTsKLQkJQ29udHJvbCBjb250cm9sID0gcHJvY2Vzc29yc0Jsb2NrLmdldENvbnRyb2woKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkJY29udHJvbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8vIFRPRE8gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscC4uLgotCi0JCWluaXREZWZhdWx0SW5zdGFsbCgpOwotCQlwcm9jZXNzb3JzQmxvY2suYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkKLQkJewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0JCQl7Ci0JCQkJSVByb2Nlc3Nvckluc3RhbGwgaW5zdGFsbCA9IGdldEN1cnJlbnREZWZhdWx0UHJvY2Vzc29yKCk7Ci0JCQkJaWYgKGluc3RhbGwgPT0gbnVsbCkKLQkJCQl7Ci0JCQkJCXNldFZhbGlkKGZhbHNlKTsKLQkJCQkJc2V0RXJyb3JNZXNzYWdlKE1lc3NhZ2VzLlByb2Nlc3NvcnNQcmVmZXJlbmNlUGFnZV8yKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJc2V0VmFsaWQodHJ1ZSk7Ci0JCQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlhcHBseURpYWxvZ0ZvbnQoYW5jZXN0b3IpOwotCQlyZXR1cm4gYW5jZXN0b3I7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkKLQl7Ci0JCXByb2Nlc3NvcnNCbG9jay5zYXZlQ29sdW1uU2V0dGluZ3MoKTsKLQkJZmluYWwgYm9vbGVhbltdIG9rID0gbmV3IGJvb2xlYW5bMV07Ci0JCXRyeQotCQl7Ci0JCQlmaW5hbCBJUHJvY2Vzc29ySW5zdGFsbFtdIGluc3RhbGxzID0gcHJvY2Vzc29yc0Jsb2NrLmdldFByb2Nlc3NvcnMoKTsKLQkJCWZpbmFsIElQcm9jZXNzb3JJbnN0YWxsIGRlZmF1bHRQcm9jZXNzb3IgPSBnZXRDdXJyZW50RGVmYXVsdFByb2Nlc3NvcigpOwotCQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpCi0JCQl7Ci0JCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCi0JCQkJewotCQkJCQl0cnkKLQkJCQkJewotCQkJCQkJSkFYUFJ1bnRpbWUuc2F2ZVByb2Nlc3NvclByZWZlcmVuY2VzKGluc3RhbGxzLGRlZmF1bHRQcm9jZXNzb3IsbW9uaXRvcik7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLQkJCQkJewotCQkJCQkJWFNMRGVidWdVSVBsdWdpbi5sb2coZSk7Ci0JCQkJCX0KLQkJCQkJb2tbMF0gPSAhbW9uaXRvci5pc0NhbmNlbGVkKCk7Ci0JCQkJfQotCQkJfTsKLQkJCVhTTERlYnVnVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpLmJ1c3lDdXJzb3JXaGlsZShydW5uYWJsZSk7Ci0JCX0KLQkJY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkKLQkJewotCQkJWFNMRGVidWdVSVBsdWdpbi5sb2coZSk7Ci0JCX0KLQkJY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpCi0JCXsKLQkJCVhTTERlYnVnVUlQbHVnaW4ubG9nKGUpOwotCQl9Ci0JCXJldHVybiBva1swXTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdERlZmF1bHRJbnN0YWxsKCkKLQl7Ci0JCUlQcm9jZXNzb3JJbnN0YWxsIHJlYWxEZWZhdWx0ID0gSkFYUFJ1bnRpbWUuZ2V0RGVmYXVsdFByb2Nlc3NvcigpOwotCQlpZiAocmVhbERlZmF1bHQgIT0gbnVsbCkKLQkJewotCQkJSVByb2Nlc3Nvckluc3RhbGxbXSBpbnN0YWxscyA9IHByb2Nlc3NvcnNCbG9jay5nZXRQcm9jZXNzb3JzKCk7Ci0JCQlmb3IgKElQcm9jZXNzb3JJbnN0YWxsIGZha2VJbnN0YWxsIDogaW5zdGFsbHMpCi0JCQl7Ci0JCQkJaWYgKGZha2VJbnN0YWxsLmdldElkKCkuZXF1YWxzKHJlYWxEZWZhdWx0LmdldElkKCkpKQotCQkJCXsKLQkJCQkJdmVyaWZ5RGVmYXVsdFZNKGZha2VJbnN0YWxsKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeURlZmF1bHRWTShJUHJvY2Vzc29ySW5zdGFsbCBpbnN0YWxsKQotCXsKLQkJaWYgKGluc3RhbGwgIT0gbnVsbCkKLQkJewotCQkJcHJvY2Vzc29yc0Jsb2NrLnNldENoZWNrZWRJbnN0YWxsKGluc3RhbGwpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcHJvY2Vzc29yc0Jsb2NrLnNldENoZWNrZWRJbnN0YWxsKG51bGwpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJUHJvY2Vzc29ySW5zdGFsbCBnZXRDdXJyZW50RGVmYXVsdFByb2Nlc3NvcigpCi0JewotCQlyZXR1cm4gcHJvY2Vzc29yc0Jsb2NrLmdldENoZWNrZWRJbnN0YWxsKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2RlYnVnL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2RlYnVnL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZDRlN2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9kZWJ1Zy91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotQWRkUHJvY2Vzc29yRGlhbG9nXzE9U3VwcG9ydGVkIHZlcnNpb25zOgotQWRkUHJvY2Vzc29yRGlhbG9nXzc9UHJvY2Vzc29yIG11c3Qgc3VwcG9ydCBhdCBsZWFzdCBvbmUgWFNMVCB2ZXJzaW9uCi1BZGRQcm9jZXNzb3JEaWFsb2dfRWRpdF9UaXRsZT1FZGl0IFByb2Nlc3NvcgotQWRkUHJvY2Vzc29yRGlhbG9nX0FkZF9UaXRsZT1BZGQgUHJvY2Vzc29yCi1BZGRQcm9jZXNzb3JEaWFsb2dfcHJvY2Vzc29yTmFtZT1Qcm9jZXNzb3IgTmFtZToKLUFkZFByb2Nlc3NvckRpYWxvZ19wcm9jZXNzb3JUeXBlPVByb2Nlc3NvciBUeXBlOgotQWRkUHJvY2Vzc29yRGlhbG9nX2phcnM9TGlicmFyaWVzOgotQWRkUHJvY2Vzc29yRGlhbG9nX2F0dHJpYnV0ZXM9QXR0cmlidXRlczoKLUFkZFByb2Nlc3NvckRpYWxvZ19lbnRlck5hbWU9QSBuYW1lIG11c3QgYmUgZW50ZXJlZCBmb3IgdGhpcyBwcm9jZXNzb3IKLUFkZFByb2Nlc3NvckRpYWxvZ19kdXBsaWNhdGVOYW1lPVRoZSBuYW1lIGhhcyBhbHJlYWR5IGJlZW4gdXNlZAotSW5zdGFsbGVkUHJvY2Vzc29yc0Jsb2NrXzA9SW5zdGFsbGVkIEphdmEgWFNMVCBQcm9jZXNzb3JzOgotSW5zdGFsbGVkUHJvY2Vzc29yc0Jsb2NrXzE9TmFtZQotSW5zdGFsbGVkUHJvY2Vzc29yc0Jsb2NrXzI9VHlwZQotSW5zdGFsbGVkUHJvY2Vzc29yc0Jsb2NrXzM9WFNMVCBWZXJzaW9ucwotSW5zdGFsbGVkUHJvY2Vzc29yc0Jsb2NrXzQ9RGVidWdnZXIKLUluc3RhbGxlZFByb2Nlc3NvcnNCbG9ja181PUFkZAotSW5zdGFsbGVkUHJvY2Vzc29yc0Jsb2NrXzY9RWRpdAotSW5zdGFsbGVkUHJvY2Vzc29yc0Jsb2NrXzc9UmVtb3ZlCi1JbnN0YWxsZWRQcm9jZXNzb3JzQmxvY2tfOD1Ob25lCi0KLVByb2Nlc3NvckxpYnJhcnlCbG9ja182PU9uZSBvciBtb3JlIGphciBmaWxlcyBtdXN0IGJlIHNwZWNpZmllZAotUHJvY2Vzc29yTGlicmFyeUJsb2NrX0FkZEJ1dHRvbj1BZGQgRXh0ZXJuYWwgSkFScwotUHJvY2Vzc29yTGlicmFyeUJsb2NrX0FkZFdvcmtzcGFjZUJ1dHRvbj1BZGQgV29ya3NwYWNlIEpBUnMKLVByb2Nlc3NvckxpYnJhcnlCbG9ja19SZW1vdmVCdXR0b249UmVtb3ZlCi1Qcm9jZXNzb3JMaWJyYXJ5QmxvY2tfRmlsZURpYWxvZ19UaXRsZT1FeHRlcm5hbCBKQVJzCi1Qcm9jZXNzb3JMaWJyYXJ5QmxvY2tfV29ya3NwYWNlRmlsZURpYWxvZ19UaXRsZT1Xb3Jrc3BhY2UgSkFScwotUHJvY2Vzc29yTGlicmFyeUJsb2NrX1dvcmtzcGFjZUZpbGVEaWFsb2dfTWVzc2FnZT1TZWxlY3QgdGhlIEpBUnMgdGhhdCBtYWtlIHVwIHRoZSBYU0xUIHByb2Nlc3NvcgotCi1Qcm9jZXNzb3JzUHJlZmVyZW5jZVBhZ2VfMD1KYXZhIFhTTFQgUHJvY2Vzc29ycwotUHJvY2Vzc29yc1ByZWZlcmVuY2VQYWdlXzE9QWRkLCByZW1vdmUgb3IgZWRpdCBYU0xUIHByb2Nlc3NvciBkZWZpbml0aW9ucy5cbkJ5IGRlZmF1bHQsIHRoZSBjaGVja2VkIFByb2Nlc3NvciBpcyB1c2VkIGZvciBhbGwgdHJhbnNmb3JtYXRpb25zLgotUHJvY2Vzc29yc1ByZWZlcmVuY2VQYWdlXzI9U2VsZWN0IGEgZGVmYXVsdCBYU0xUIFByb2Nlc3NvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9kZWJ1Zy91aS9pbnRlcm5hbC90YWJzL3Byb2Nlc3Nvci9BdHRyaWJ1dGVEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvZGVidWcvdWkvaW50ZXJuYWwvdGFicy9wcm9jZXNzb3IvQXR0cmlidXRlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NWVjNTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9kZWJ1Zy91aS9pbnRlcm5hbC90YWJzL3Byb2Nlc3Nvci9BdHRyaWJ1dGVEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy51aS5pbnRlcm5hbC50YWJzLnByb2Nlc3NvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlN0YXR1c0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRvdWJsZUNsaWNrRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRG91YmxlQ2xpY2tMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5JQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuSVByb2Nlc3NvclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5KQVhQUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLkxhdW5jaEF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuY29uZmlnLkxhdW5jaEF0dHJpYnV0ZTsKLQotcHVibGljIGNsYXNzIEF0dHJpYnV0ZURpYWxvZyBleHRlbmRzIFN0YXR1c0RpYWxvZwotewotCXByaXZhdGUgVGFibGUgdGFibGU7Ci0JcHJpdmF0ZSBUYWJsZVZpZXdlciB0Vmlld2VyOwotCXByaXZhdGUgVGV4dCB0ZXh0OwotCXByaXZhdGUgTGlzdDxJQXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdDxJQXR0cmlidXRlPigpOwotCXByaXZhdGUgTGlzdDxJQXR0cmlidXRlPiBzZWxlY3RlZEF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0PElBdHRyaWJ1dGU+KCk7Ci0KLQlwdWJsaWMgQXR0cmlidXRlRGlhbG9nKFNoZWxsIHBhcmVudCwgTGF1bmNoQXR0cmlidXRlcyBsYXVuY2hBdHRyaWJ1dGVzKQotCXsKLQkJc3VwZXIocGFyZW50KTsKLQkJc2V0VGl0bGUoIlNlbGVjdCBQcm9jZXNzb3IgQXR0cmlidXRlcyIpOwotCQkKLQkJU2V0PFN0cmluZz4gYXR0cmlidXRlU2V0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQlmb3IgKExhdW5jaEF0dHJpYnV0ZSBhdHQgOiBsYXVuY2hBdHRyaWJ1dGVzLmdldEF0dHJpYnV0ZXMoKSkKLQkJewotCQkJYXR0cmlidXRlU2V0LmFkZChhdHQudXJpKTsKLQkJfQotCQlmb3IgKElQcm9jZXNzb3JUeXBlIHR5cGUgOiBKQVhQUnVudGltZS5nZXRQcm9jZXNzb3JUeXBlcygpKQotCQl7Ci0JCQlmb3IgKElBdHRyaWJ1dGUgYXR0cmlidXRlIDogdHlwZS5nZXRBdHRyaWJ1dGVzKCkpCi0JCQl7Ci0JCQkJaWYgKCFhdHRyaWJ1dGVTZXQuY29udGFpbnMoYXR0cmlidXRlLmdldFVSSSgpKSkKLQkJCQl7Ci0JCQkJCWF0dHJpYnV0ZVNldC5hZGQoYXR0cmlidXRlLmdldFVSSSgpKTsKLQkJCQkJYXR0cmlidXRlcy5hZGQoYXR0cmlidXRlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KQotCXsKLQkJQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCxTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLFNXVC5GSUxMLHRydWUsdHJ1ZSk7Ci0JCWdkLndpZHRoSGludCA9IDQwMDsKLQkJY29tcC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJY29tcC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wLFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dCgiU2VsZWN0IG9uZSBvciBtb3JlIGF0dHJpYnV0ZXMgdG8gc2V0IG9uIHRoZSBYU0xUIHByb2Nlc3Nvci4iKTsKLQkJCi0JCQotCQl0YWJsZSA9IG5ldyBUYWJsZShjb21wLFNXVC5CT1JERVIgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuVl9TQ1JPTEwgfCBTV1QuTVVMVEkpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKGZhbHNlKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsU1dULkZJTEwsdHJ1ZSx0cnVlKTsKLQkJZ2QudmVydGljYWxJbmRlbnQgPSAxMDsKLQkJZ2QuaGVpZ2h0SGludCA9IDIwMDsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQl0Vmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlKTsKLQkJdFZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKCkKLQkJewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpCi0JCQl7Ci0JCQkJcmV0dXJuIGF0dHJpYnV0ZXMudG9BcnJheShuZXcgSUF0dHJpYnV0ZVswXSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotCQkJewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpCi0JCQl7Ci0JCQl9Ci0JCX0pOwotCQl0Vmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IExhYmVsUHJvdmlkZXIoKXsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KQotCQkJewotCQkJCUlBdHRyaWJ1dGUgYXR0cmlidXRlID0gKElBdHRyaWJ1dGUpZWxlbWVudDsKLQkJCQlyZXR1cm4gYXR0cmlidXRlLmdldFVSSSgpOwotCQkJfQotCQl9KTsKLQkJdFZpZXdlci5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKQotCQkJewotCQkJCUlBdHRyaWJ1dGUgYTEgPSAoSUF0dHJpYnV0ZSkgZTE7Ci0JCQkJSUF0dHJpYnV0ZSBhMiA9IChJQXR0cmlidXRlKSBlMjsKLQkJCQlyZXR1cm4gYTEuZ2V0VVJJKCkuY29tcGFyZVRvKGEyLmdldFVSSSgpKTsKLQkJCX0KLQkJfSk7Ci0JCXRWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCl7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLQkJCXsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJc2VsZWN0ZWRBdHRyaWJ1dGVzID0gc2VsLnRvTGlzdCgpOwotCQkJCWlmIChzZWwuaXNFbXB0eSgpKQotCQkJCQl0ZXh0LnNldFRleHQoIiIpOwotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCUlBdHRyaWJ1dGUgYXR0cmlidXRlID0gKElBdHRyaWJ1dGUpc2VsLmdldEZpcnN0RWxlbWVudCgpOyAKLQkJCQkJdGV4dC5zZXRUZXh0KGF0dHJpYnV0ZS5nZXREZXNjcmlwdGlvbigpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQl0Vmlld2VyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIobmV3IElEb3VibGVDbGlja0xpc3RlbmVyKCl7Ci0JCQlwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KQotCQkJewotCQkJCWJ1dHRvblByZXNzZWQoSURpYWxvZ0NvbnN0YW50cy5PS19JRCk7Ci0JCQl9Ci0JCX0pOwotCQl0Vmlld2VyLnNldElucHV0KGF0dHJpYnV0ZXMpOwotCQkKLQkJdGV4dCA9IG5ldyBUZXh0KGNvbXAsU1dULkJPUkRFUiB8IFNXVC5XUkFQIHwgU1dULlJFQURfT05MWSB8IFNXVC5WX1NDUk9MTCk7Ci0JCXRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCxTV1QuRklMTCx0cnVlLGZhbHNlKTsKLQkJZ2QuaGVpZ2h0SGludCA9IDgwOwotCQl0ZXh0LnNldExheW91dERhdGEoZ2QpOwotCQkKLQkJaWYgKGF0dHJpYnV0ZXMuc2l6ZSgpID4gMCkKLQkJewotCQkJdFZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odFZpZXdlci5nZXRFbGVtZW50QXQoMCkpLCB0cnVlKTsKLQkJfQotCQkKLQkJcmV0dXJuIGNvbXA7Ci0JfQotCQotCXB1YmxpYyBMaXN0PElBdHRyaWJ1dGU+IGdldEF0dHJpYnV0ZXMoKQotCXsKLQkJcmV0dXJuIHNlbGVjdGVkQXR0cmlidXRlczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2RlYnVnL3VpL2ludGVybmFsL3RhYnMvcHJvY2Vzc29yL0F0dHJpYnV0ZXNCbG9jay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9kZWJ1Zy91aS9pbnRlcm5hbC90YWJzL3Byb2Nlc3Nvci9BdHRyaWJ1dGVzQmxvY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJlMTExMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2RlYnVnL3VpL2ludGVybmFsL3RhYnMvcHJvY2Vzc29yL0F0dHJpYnV0ZXNCbG9jay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy51aS5pbnRlcm5hbC50YWJzLnByb2Nlc3NvcjsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRWRpdGluZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJDZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLkFic3RyYWN0VGFibGVCbG9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLlhTTERlYnVnVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpLmludGVybmFsLkpBWFBEZWJ1Z1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuSUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLklQcm9jZXNzb3JUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuSkFYUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5KQVhQUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLkxhdW5jaEF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuY29uZmlnLkxhdW5jaEF0dHJpYnV0ZTsKLQotcHVibGljIGNsYXNzIEF0dHJpYnV0ZXNCbG9jayBleHRlbmRzIEFic3RyYWN0VGFibGVCbG9jawotewotCXByaXZhdGUgVGFibGUgdGFibGU7Ci0JcHJpdmF0ZSBUYWJsZVZpZXdlciB0Vmlld2VyOwotCXByaXZhdGUgTGF1bmNoQXR0cmlidXRlcyBhdHRyaWJ1dGVzOwotCXByaXZhdGUgQnV0dG9uIHJlbW92ZUJ1dHRvbjsKLQlwcml2YXRlIE1hcDxTdHJpbmcsSUF0dHJpYnV0ZT4gYXR0cmlidXRlVXJpcyA9IG5ldyBIYXNoTWFwPFN0cmluZyxJQXR0cmlidXRlPigpOwotCQotCXB1YmxpYyBBdHRyaWJ1dGVzQmxvY2soKQotCXsKLQkJZm9yIChJUHJvY2Vzc29yVHlwZSB0eXBlIDogSkFYUFJ1bnRpbWUuZ2V0UHJvY2Vzc29yVHlwZXMoKSkKLQkJewotCQkJZm9yIChJQXR0cmlidXRlIGF0dHJpYnV0ZSA6IHR5cGUuZ2V0QXR0cmlidXRlcygpKQotCQkJewotCQkJCWF0dHJpYnV0ZVVyaXMucHV0KGF0dHJpYnV0ZS5nZXRVUkkoKSwgYXR0cmlidXRlKTsKLQkJCX0KLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJRGlhbG9nU2V0dGluZ3MgZ2V0RGlhbG9nU2V0dGluZ3MoKQotCXsKLQkJcmV0dXJuIFhTTERlYnVnVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRRdWFsaWZpZXIoKQotCXsKLQkJcmV0dXJuIEpBWFBEZWJ1Z1VJUGx1Z2luLlBMVUdJTl9JRCsiLiIrZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFRhYmxlIGdldFRhYmxlKCkKLQl7Ci0JCXJldHVybiB0YWJsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0JewotCQlUYWJJdGVtIGl0ZW0gPSBuZXcgVGFiSXRlbSgoVGFiRm9sZGVyKXBhcmVudCxTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dCgiQXR0cmlidXRlcyIpOwotCQkKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJaXRlbS5zZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JCQotCQl0YWJsZSA9IG5ldyBUYWJsZShjb21wb3NpdGUsU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5NVUxUSSk7Ci0JCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCXRhYmxlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLFNXVC5GSUxMLHRydWUsdHJ1ZSkpOwotCQl0YWJsZS5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC5jaGFyYWN0ZXIgPT0gU1dULkRFTCAmJiBldmVudC5zdGF0ZU1hc2sgPT0gMCkgewotCQkJCQlwZXJmb3JtUmVtb3ZlKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJCi0JCVRhYmxlQ29sdW1uIHRjMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSxTV1QuTk9ORSk7Ci0JCXRjMS5zZXRUZXh0KCJOYW1lIik7Ci0JCXRjMS5zZXRXaWR0aCgzNTApOwotCQl0YzEuc2V0UmVzaXphYmxlKHRydWUpOwotCQkKLQkJVGFibGVDb2x1bW4gdGMyID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLFNXVC5OT05FKTsKLQkJdGMyLnNldFRleHQoIlZhbHVlIik7Ci0JCXRjMi5zZXRXaWR0aCg1MCk7Ci0JCXRjMi5zZXRSZXNpemFibGUodHJ1ZSk7Ci0JCQotCQlDb21wb3NpdGUgYnV0dG9uQ29tcCA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLFNXVC5GSUxMKTsKLQkJYnV0dG9uQ29tcC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCxTV1QuVE9QLGZhbHNlLGZhbHNlKSk7Ci0JCUdyaWRMYXlvdXQgZ2wgPSBuZXcgR3JpZExheW91dCgpOwotCQlnbC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWJ1dHRvbkNvbXAuc2V0TGF5b3V0KGdsKTsKLQkJCi0JCUJ1dHRvbiBhZGRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXAsU1dULlBVU0gpOwotCQlhZGRCdXR0b24uc2V0VGV4dCgiQWRkIik7Ci0JCWFkZEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCxTV1QuVE9QLGZhbHNlLGZhbHNlKSk7Ci0JCWFkZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKXsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotCQkJewotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLQkJCXsKLQkJCQlBdHRyaWJ1dGVEaWFsb2cgZGlhbG9nID0gbmV3IEF0dHJpYnV0ZURpYWxvZyhnZXRTaGVsbCgpLGF0dHJpYnV0ZXMpOwotCQkJCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykKLQkJCQl7Ci0JCQkJCUxpc3Q8SUF0dHJpYnV0ZT4gbmV3QXR0cmlidXRlcyA9IGRpYWxvZy5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJCUxhdW5jaEF0dHJpYnV0ZSBmaXJzdCA9IG51bGw7Ci0JCQkJCWZvciAoSUF0dHJpYnV0ZSBhdHRyaWJ1dGUgOiBuZXdBdHRyaWJ1dGVzKQotCQkJCQl7Ci0JCQkJCQlMYXVuY2hBdHRyaWJ1dGUgYXR0ID0gbmV3IExhdW5jaEF0dHJpYnV0ZShhdHRyaWJ1dGUuZ2V0VVJJKCksInN0cmluZyIsbnVsbCk7Ci0JCQkJCQlpZiAoZmlyc3QgPT0gbnVsbCkKLQkJCQkJCQlmaXJzdCA9IGF0dDsKLQkJCQkJCWF0dHJpYnV0ZXMuYWRkQXR0cmlidXRlKGF0dCk7Ci0JCQkJCX0KLQkJCQkJaWYgKG5ld0F0dHJpYnV0ZXMuc2l6ZSgpID4gMCkKLQkJCQkJewotCQkJCQkJdFZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJCQl0Vmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihmaXJzdCksIHRydWUpOwotCQkJCQkJdFZpZXdlci5lZGl0RWxlbWVudChmaXJzdCwgMSk7Ci0JCQkJCQl1cGRhdGVMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkKLQkJcmVtb3ZlQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wLFNXVC5QVVNIKTsKLQkJcmVtb3ZlQnV0dG9uLnNldFRleHQoIlJlbW92ZSIpOwotCQlyZW1vdmVCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsU1dULlRPUCxmYWxzZSxmYWxzZSkpOwotCQlyZW1vdmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCl7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLQkJCXsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0JCQl7Ci0JCQkJcGVyZm9ybVJlbW92ZSgpOwotCQkJfQotCQl9KTsKLQkJCi0JCXNldENvbnRyb2wodGFibGUpOwotCQkKLQkJdFZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcih0YWJsZSk7Ci0JCXRWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcigpCi0JCXsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KQotCQkJewotCQkJCXJldHVybiBhdHRyaWJ1dGVzLmdldEF0dHJpYnV0ZXMoKS50b0FycmF5KG5ldyBMYXVuY2hBdHRyaWJ1dGVbMF0pOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLQkJCXsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KQotCQkJewotCQkJCWF0dHJpYnV0ZXMgPSAoTGF1bmNoQXR0cmlidXRlcykgbmV3SW5wdXQ7Ci0JCQl9Ci0JCX0pOwotCQl0Vmlld2VyLnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpCi0JCQl7Ci0JCQkJTGF1bmNoQXR0cmlidXRlIGExID0gKExhdW5jaEF0dHJpYnV0ZSkgZTE7Ci0JCQkJTGF1bmNoQXR0cmlidXRlIGEyID0gKExhdW5jaEF0dHJpYnV0ZSkgZTI7Ci0JCQkJcmV0dXJuIGExLnVyaS5jb21wYXJlVG8oYTIudXJpKTsKLQkJCX0KLQkJfSk7Ci0JCXRWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCl7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLQkJCXsKLQkJCQl1cGRhdGVSZW1vdmVCdXR0b24oKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlUYWJsZVZpZXdlckNvbHVtbiB0dmMxID0gbmV3IFRhYmxlVmlld2VyQ29sdW1uKHRWaWV3ZXIsdGMxKTsKLQkJdHZjMS5zZXRMYWJlbFByb3ZpZGVyKG5ldyBDZWxsTGFiZWxQcm92aWRlcigpewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB1cGRhdGUoVmlld2VyQ2VsbCBjZWxsKQotCQkJewotCQkJCUxhdW5jaEF0dHJpYnV0ZSB0diA9IChMYXVuY2hBdHRyaWJ1dGUpIGNlbGwuZ2V0RWxlbWVudCgpOwotCQkJCWNlbGwuc2V0VGV4dCh0di51cmkpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBpbnQgZ2V0VG9vbFRpcFRpbWVEaXNwbGF5ZWQoT2JqZWN0IG9iamVjdCkKLQkJCXsKLQkJCQlyZXR1cm4gNTAwMDsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KE9iamVjdCBlbGVtZW50KQotCQkJewotCQkJCUxhdW5jaEF0dHJpYnV0ZSB0diA9IChMYXVuY2hBdHRyaWJ1dGUpIGVsZW1lbnQ7Ci0JCQkJcmV0dXJuIGF0dHJpYnV0ZVVyaXMuZ2V0KHR2LnVyaSkuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCX0KLQkJCQotCQl9KTsKLQkJCi0vLwkJQ29sdW1uVmlld2VyVG9vbFRpcFN1cHBvcnQuZW5hYmxlRm9yKHRWaWV3ZXIpOwotCQkKLQkJVGFibGVWaWV3ZXJDb2x1bW4gdHZjMiA9IG5ldyBUYWJsZVZpZXdlckNvbHVtbih0Vmlld2VyLHRjMik7Ci0JCXR2YzIuc2V0TGFiZWxQcm92aWRlcihuZXcgQ2VsbExhYmVsUHJvdmlkZXIoKXsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgdXBkYXRlKFZpZXdlckNlbGwgY2VsbCkKLQkJCXsKLQkJCQlMYXVuY2hBdHRyaWJ1dGUgdHYgPSAoTGF1bmNoQXR0cmlidXRlKSBjZWxsLmdldEVsZW1lbnQoKTsKLQkJCQljZWxsLnNldFRleHQodHYudmFsdWUpOwotCQkJfQotCQl9KTsKLQkJCi0JCXR2YzIuc2V0RWRpdGluZ1N1cHBvcnQobmV3IEVkaXRpbmdTdXBwb3J0KHRWaWV3ZXIpewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGNhbkVkaXQoT2JqZWN0IGVsZW1lbnQpCi0JCQl7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENlbGxFZGl0b3IgZ2V0Q2VsbEVkaXRvcihPYmplY3QgZWxlbWVudCkKLQkJCXsKLQkJCQlyZXR1cm4gbmV3IFRleHRDZWxsRWRpdG9yKHRhYmxlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgT2JqZWN0IGdldFZhbHVlKE9iamVjdCBlbGVtZW50KQotCQkJewotCQkJCUxhdW5jaEF0dHJpYnV0ZSB0diA9IChMYXVuY2hBdHRyaWJ1dGUpZWxlbWVudDsKLQkJCQlyZXR1cm4gdHYudmFsdWUgPT0gbnVsbCA/ICIiIDogdHYudmFsdWU7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoT2JqZWN0IGVsZW1lbnQsIE9iamVjdCB2YWx1ZSkKLQkJCXsKLQkJCQlMYXVuY2hBdHRyaWJ1dGUgdHYgPSAoTGF1bmNoQXR0cmlidXRlKWVsZW1lbnQ7Ci0JCQkJdHYuc2V0VmFsdWUoKFN0cmluZyl2YWx1ZSk7Ci0JCQkJdXBkYXRlTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZygpOwotCQkJCXRWaWV3ZXIudXBkYXRlKHR2LCBudWxsKTsKLQkJCX0KLQkJCQotCQl9KTsKLQkJCi0JCXJlc3RvcmVDb2x1bW5TZXR0aW5ncygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVJlbW92ZUJ1dHRvbigpCi0JewotCQlyZW1vdmVCdXR0b24uc2V0RW5hYmxlZCghdFZpZXdlci5nZXRTZWxlY3Rpb24oKS5pc0VtcHR5KCkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQlyZXR1cm4gTWVzc2FnZXMuZ2V0U3RyaW5nKCJBdHRyaWJ1dGVzQmxvY2suMTYiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRzKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbikKLQl7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVBdHRyaWJ1dGVzRnJvbVN0b3JhZ2UoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCVN0cmluZyBzID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoSkFYUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9BVFRSSUJVVEVTLCAoU3RyaW5nKSBudWxsKTsKLQkJaWYgKHMgIT0gbnVsbCAmJiBzLmxlbmd0aCgpID4gMCkKLQkJewotCQkJYXR0cmlidXRlcyA9IExhdW5jaEF0dHJpYnV0ZXMuZnJvbVhNTChuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocy5nZXRCeXRlcygpKSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlhdHRyaWJ1dGVzID0gbmV3IExhdW5jaEF0dHJpYnV0ZXMoKTsKLQkJfQotCQl0Vmlld2VyLnNldElucHV0KGF0dHJpYnV0ZXMpOwotCQl1cGRhdGVSZW1vdmVCdXR0b24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKQotCXsKLQkJdHJ5Ci0JCXsKLQkJCWluaXRpYWxpemVBdHRyaWJ1dGVzRnJvbVN0b3JhZ2UoY29uZmlndXJhdGlvbik7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLQkJewotCQkJWFNMRGVidWdVSVBsdWdpbi5sb2coZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtQXBwbHkoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uKQotCXsKLQkJdHJ5Ci0JCXsKLQkJCVN0cmluZyB4bWwgPSBhdHRyaWJ1dGVzLnRvWE1MKCk7Ci0JCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShKQVhQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0FUVFJJQlVURVMsIHhtbCk7Ci0JCX0KLQkJY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkKLQkJewotCQkJWFNMRGVidWdVSVBsdWdpbi5sb2coZSk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0JCXsKLQkJCVhTTERlYnVnVUlQbHVnaW4ubG9nKGUpOwotCQl9Ci0JCWNhdGNoIChUcmFuc2Zvcm1lckV4Y2VwdGlvbiBlKQotCQl7Ci0JCQlYU0xEZWJ1Z1VJUGx1Z2luLmxvZyhlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwZXJmb3JtUmVtb3ZlKCkKLQl7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbil0Vmlld2VyLmdldFNlbGVjdGlvbigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2VsLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0JCXsKLQkJCUxhdW5jaEF0dHJpYnV0ZSBhdHQgPSAoTGF1bmNoQXR0cmlidXRlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlhdHRyaWJ1dGVzLnJlbW92ZUF0cmlidXRlKGF0dC51cmkpOwotCQl9Ci0JCXRWaWV3ZXIucmVmcmVzaCgpOwotCQl1cGRhdGVMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9kZWJ1Zy91aS9pbnRlcm5hbC90YWJzL3Byb2Nlc3Nvci9JbnN0YWxsU3RhbmRpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9kZWJ1Zy91aS9pbnRlcm5hbC90YWJzL3Byb2Nlc3Nvci9JbnN0YWxsU3RhbmRpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWIzOTI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvZGVidWcvdWkvaW50ZXJuYWwvdGFicy9wcm9jZXNzb3IvSW5zdGFsbFN0YW5kaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy51aS5pbnRlcm5hbC50YWJzLnByb2Nlc3NvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuSVByb2Nlc3Nvckluc3RhbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5JUHJvY2Vzc29ySmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuUHJvY2Vzc29ySW5zdGFsbDsKLQotcHVibGljIGNsYXNzIEluc3RhbGxTdGFuZGluIGV4dGVuZHMgUHJvY2Vzc29ySW5zdGFsbAotewotCXB1YmxpYyBJbnN0YWxsU3RhbmRpbihJUHJvY2Vzc29ySW5zdGFsbCBpbnN0YWxsKQotCXsKLQkJc3VwZXIoaW5zdGFsbC5nZXRJZCgpLCBpbnN0YWxsLmdldE5hbWUoKSwgaW5zdGFsbC5nZXRQcm9jZXNzb3JUeXBlKCkuZ2V0SWQoKSwgaW5zdGFsbC5nZXRQcm9jZXNzb3JKYXJzKCksIGluc3RhbGwuZ2V0RGVidWdnZXIoKSAhPSBudWxsID8gaW5zdGFsbC5nZXREZWJ1Z2dlcigpLmdldElkKCkgOiBudWxsLCBpbnN0YWxsCi0JCQkJLmdldFN1cHBvcnRzKCksIGluc3RhbGwuaXNDb250cmlidXRlZCgpKTsKLQl9Ci0KLQlwdWJsaWMgSW5zdGFsbFN0YW5kaW4oU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGVJZCwgU3RyaW5nIGRlYnVnZ2VySWQsIElQcm9jZXNzb3JKYXJbXSBqYXJzKQotCXsKLQkJc3VwZXIoaWQsIG5hbWUsIHR5cGVJZCwgamFycywgZGVidWdnZXJJZCwgIiIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvZGVidWcvdWkvaW50ZXJuYWwvdGFicy9wcm9jZXNzb3IvSmFyQ29udGVudFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2RlYnVnL3VpL2ludGVybmFsL3RhYnMvcHJvY2Vzc29yL0phckNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzdhMGRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvZGVidWcvdWkvaW50ZXJuYWwvdGFicy9wcm9jZXNzb3IvSmFyQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcudWkuaW50ZXJuYWwudGFicy5wcm9jZXNzb3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuSVByb2Nlc3Nvckluc3RhbGw7Ci0KLXB1YmxpYyBjbGFzcyBKYXJDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcgotewotCXByaXZhdGUgSVByb2Nlc3Nvckluc3RhbGwgaW5zdGFsbDsKLQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KQotCXsKLQkJcmV0dXJuIGluc3RhbGwuZ2V0UHJvY2Vzc29ySmFycygpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotCXsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpCi0JewotCQlpbnN0YWxsID0gKElQcm9jZXNzb3JJbnN0YWxsKSBuZXdJbnB1dDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2RlYnVnL3VpL2ludGVybmFsL3RhYnMvcHJvY2Vzc29yL0phckxhYmVsUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvZGVidWcvdWkvaW50ZXJuYWwvdGFicy9wcm9jZXNzb3IvSmFyTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGVkMzEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvZGVidWcvdWkvaW50ZXJuYWwvdGFicy9wcm9jZXNzb3IvSmFyTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpLmludGVybmFsLnRhYnMucHJvY2Vzc29yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLklQcm9jZXNzb3JKYXI7Ci0KLXB1YmxpYyBjbGFzcyBKYXJMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlcgotewotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkKLQl7Ci0JCUlQcm9jZXNzb3JKYXIgamFyID0gKElQcm9jZXNzb3JKYXIpIGVsZW1lbnQ7Ci0JCUlQYXRoIHBhdGggPSBqYXIuZ2V0UGF0aCgpOwotCQlyZXR1cm4gcGF0aC5sYXN0U2VnbWVudCgpICsgIiAtICIgKyBwYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKS50b09TU3RyaW5nKCkgKyAiIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9kZWJ1Zy91aS9pbnRlcm5hbC90YWJzL3Byb2Nlc3Nvci9NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9kZWJ1Zy91aS9pbnRlcm5hbC90YWJzL3Byb2Nlc3Nvci9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTk2Y2U2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvZGVidWcvdWkvaW50ZXJuYWwvdGFicy9wcm9jZXNzb3IvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpLmludGVybmFsLnRhYnMucHJvY2Vzc29yOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWNsYXNzIE1lc3NhZ2VzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpLmludGVybmFsLnRhYnMucHJvY2Vzc29yLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgUkVTT1VSQ0VfQlVORExFID0gUmVzb3VyY2VCdW5kbGUKLQkJCS5nZXRCdW5kbGUoQlVORExFX05BTUUpOwotCi0JcHJpdmF0ZSBNZXNzYWdlcygpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2RlYnVnL3VpL2ludGVybmFsL3RhYnMvcHJvY2Vzc29yL091dHB1dFByb3BlcnRpZXNCbG9jay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9kZWJ1Zy91aS9pbnRlcm5hbC90YWJzL3Byb2Nlc3Nvci9PdXRwdXRQcm9wZXJ0aWVzQmxvY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJhZDk2NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2RlYnVnL3VpL2ludGVybmFsL3RhYnMvcHJvY2Vzc29yL091dHB1dFByb3BlcnRpZXNCbG9jay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy51aS5pbnRlcm5hbC50YWJzLnByb2Nlc3NvcjsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRWRpdGluZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJDZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLkFic3RyYWN0VGFibGVCbG9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLlhTTERlYnVnVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpLmludGVybmFsLkpBWFBEZWJ1Z1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuSU91dHB1dFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuSVByb2Nlc3NvclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5KQVhQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLkpBWFBSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuTGF1bmNoUHJvcGVydGllczsKLQotcHVibGljIGNsYXNzIE91dHB1dFByb3BlcnRpZXNCbG9jayBleHRlbmRzIEFic3RyYWN0VGFibGVCbG9jawotewotCXByaXZhdGUgVGFibGUgdGFibGU7Ci0JcHJpdmF0ZSBUYWJsZVZpZXdlciB0Vmlld2VyOwotCXByaXZhdGUgTGF1bmNoUHJvcGVydGllcyBwcm9wZXJ0aWVzOwotCXByaXZhdGUgQnV0dG9uIHJlbW92ZUJ1dHRvbjsKLQlwcml2YXRlIE1hcDxTdHJpbmcsSU91dHB1dFByb3BlcnR5PiBwcm9wZXJ0eVVyaXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsSU91dHB1dFByb3BlcnR5PigpOwotCQotCXB1YmxpYyBPdXRwdXRQcm9wZXJ0aWVzQmxvY2soKQotCXsKLQkJZm9yIChJUHJvY2Vzc29yVHlwZSB0eXBlIDogSkFYUFJ1bnRpbWUuZ2V0UHJvY2Vzc29yVHlwZXMoKSkKLQkJewotCQkJZm9yIChJT3V0cHV0UHJvcGVydHkgcHJvcGVydHkgOiB0eXBlLmdldE91dHB1dFByb3BlcnRpZXMoKSkKLQkJCXsKLQkJCQlwcm9wZXJ0eVVyaXMucHV0KHByb3BlcnR5LmdldFVSSSgpLCBwcm9wZXJ0eSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSURpYWxvZ1NldHRpbmdzIGdldERpYWxvZ1NldHRpbmdzKCkKLQl7Ci0JCXJldHVybiBYU0xEZWJ1Z1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UXVhbGlmaWVyKCkKLQl7Ci0JCXJldHVybiBKQVhQRGVidWdVSVBsdWdpbi5QTFVHSU5fSUQrIi4iK2dldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBUYWJsZSBnZXRUYWJsZSgpCi0JewotCQlyZXR1cm4gdGFibGU7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KQotCXsKLQkJVGFiSXRlbSBpdGVtID0gbmV3IFRhYkl0ZW0oKFRhYkZvbGRlcilwYXJlbnQsU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQoIk91dHB1dCBQcm9wZXJ0aWVzIik7Ci0JCQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luQm90dG9tID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQlpdGVtLnNldENvbnRyb2woY29tcG9zaXRlKTsKLQkJCi0JCXRhYmxlID0gbmV3IFRhYmxlKGNvbXBvc2l0ZSxTV1QuQk9SREVSIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULlZfU0NST0xMIHwgU1dULk1VTFRJKTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsU1dULkZJTEwsdHJ1ZSx0cnVlKSk7Ci0JCXRhYmxlLmFkZEtleUxpc3RlbmVyKG5ldyBLZXlBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGV2ZW50LmNoYXJhY3RlciA9PSBTV1QuREVMICYmIGV2ZW50LnN0YXRlTWFzayA9PSAwKSB7Ci0JCQkJCXBlcmZvcm1SZW1vdmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCQotCQlUYWJsZUNvbHVtbiB0YzEgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsU1dULk5PTkUpOwotCQl0YzEuc2V0VGV4dCgiTmFtZSIpOwotCQl0YzEuc2V0V2lkdGgoMzUwKTsKLQkJdGMxLnNldFJlc2l6YWJsZSh0cnVlKTsKLQkJCi0JCVRhYmxlQ29sdW1uIHRjMiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSxTV1QuTk9ORSk7Ci0JCXRjMi5zZXRUZXh0KCJWYWx1ZSIpOwotCQl0YzIuc2V0V2lkdGgoNTApOwotCQl0YzIuc2V0UmVzaXphYmxlKHRydWUpOwotCQkKLQkJQ29tcG9zaXRlIGJ1dHRvbkNvbXAgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSxTV1QuRklMTCk7Ci0JCWJ1dHRvbkNvbXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsU1dULlRPUCxmYWxzZSxmYWxzZSkpOwotCQlHcmlkTGF5b3V0IGdsID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ2wubWFyZ2luV2lkdGggPSAwOwotCQlidXR0b25Db21wLnNldExheW91dChnbCk7Ci0JCQotCQlCdXR0b24gYWRkQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wLFNXVC5QVVNIKTsKLQkJYWRkQnV0dG9uLnNldFRleHQoIkFkZCIpOwotCQlhZGRCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsU1dULlRPUCxmYWxzZSxmYWxzZSkpOwotCQlhZGRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCl7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLQkJCXsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0JCQl7Ci0JCQkJT3V0cHV0UHJvcGVydHlEaWFsb2cgZGlhbG9nID0gbmV3IE91dHB1dFByb3BlcnR5RGlhbG9nKGdldFNoZWxsKCkscHJvcGVydGllcyk7Ci0JCQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKQotCQkJCXsKLQkJCQkJTGlzdDxJT3V0cHV0UHJvcGVydHk+IG5ld1Byb3BlcnRpZXMgPSBkaWFsb2cuZ2V0T3V0cHVQcm9wZXJ0aWVzKCk7Ci0JCQkJCVN0cmluZyBmaXJzdCA9IG51bGw7Ci0JCQkJCWZvciAoSU91dHB1dFByb3BlcnR5IHByb3BlcnR5IDogbmV3UHJvcGVydGllcykKLQkJCQkJewotCQkJCQkJU3RyaW5nIGF0dCA9IHByb3BlcnR5LmdldFVSSSgpOwotCQkJCQkJaWYgKGZpcnN0ID09IG51bGwpCi0JCQkJCQkJZmlyc3QgPSBhdHQ7Ci0JCQkJCQlwcm9wZXJ0aWVzLnNldFByb3BlcnR5KHByb3BlcnR5LmdldFVSSSgpLCBudWxsKTsKLQkJCQkJfQotCQkJCQlpZiAobmV3UHJvcGVydGllcy5zaXplKCkgPiAwKQotCQkJCQl7Ci0JCQkJCQl0Vmlld2VyLnJlZnJlc2goKTsKLQkJCQkJCXRWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGZpcnN0KSwgdHJ1ZSk7Ci0JCQkJCQl0Vmlld2VyLmVkaXRFbGVtZW50KGZpcnN0LCAxKTsKLQkJCQkJCXVwZGF0ZUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlyZW1vdmVCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXAsU1dULlBVU0gpOwotCQlyZW1vdmVCdXR0b24uc2V0VGV4dCgiUmVtb3ZlIik7Ci0JCXJlbW92ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCxTV1QuVE9QLGZhbHNlLGZhbHNlKSk7Ci0JCXJlbW92ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKXsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotCQkJewotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLQkJCXsKLQkJCQlwZXJmb3JtUmVtb3ZlKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJc2V0Q29udHJvbCh0YWJsZSk7Ci0JCQotCQl0Vmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlKTsKLQkJdFZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKCkKLQkJewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpCi0JCQl7Ci0JCQkJcmV0dXJuIHByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpLmtleVNldCgpLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotCQkJewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpCi0JCQl7Ci0JCQl9Ci0JCX0pOwotCQl0Vmlld2VyLnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkpOwotCQl0Vmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0JCQl7Ci0JCQkJdXBkYXRlUmVtb3ZlQnV0dG9uKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJVGFibGVWaWV3ZXJDb2x1bW4gdHZjMSA9IG5ldyBUYWJsZVZpZXdlckNvbHVtbih0Vmlld2VyLHRjMSk7Ci0JCXR2YzEuc2V0TGFiZWxQcm92aWRlcihuZXcgQ2VsbExhYmVsUHJvdmlkZXIoKXsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgdXBkYXRlKFZpZXdlckNlbGwgY2VsbCkKLQkJCXsKLQkJCQlTdHJpbmcgdHYgPSAoU3RyaW5nKSBjZWxsLmdldEVsZW1lbnQoKTsKLQkJCQljZWxsLnNldFRleHQodHYpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBpbnQgZ2V0VG9vbFRpcFRpbWVEaXNwbGF5ZWQoT2JqZWN0IG9iamVjdCkKLQkJCXsKLQkJCQlyZXR1cm4gNTAwMDsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KE9iamVjdCBlbGVtZW50KQotCQkJewotCQkJCVN0cmluZyB0diA9IChTdHJpbmcpIGVsZW1lbnQ7Ci0JCQkJcmV0dXJuIHByb3BlcnR5VXJpcy5nZXQodHYpLmdldERlc2NyaXB0aW9uKCk7Ci0JCQl9Ci0JCQkKLQkJfSk7Ci0JCQotLy8JCUNvbHVtblZpZXdlclRvb2xUaXBTdXBwb3J0LmVuYWJsZUZvcih0Vmlld2VyKTsKLQkJCi0JCVRhYmxlVmlld2VyQ29sdW1uIHR2YzIgPSBuZXcgVGFibGVWaWV3ZXJDb2x1bW4odFZpZXdlcix0YzIpOwotCQl0dmMyLnNldExhYmVsUHJvdmlkZXIobmV3IENlbGxMYWJlbFByb3ZpZGVyKCl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHVwZGF0ZShWaWV3ZXJDZWxsIGNlbGwpCi0JCQl7Ci0JCQkJU3RyaW5nIHR2ID0gKFN0cmluZykgY2VsbC5nZXRFbGVtZW50KCk7Ci0JCQkJU3RyaW5nIHZhbCA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydHkodHYpOwotCQkJCWNlbGwuc2V0VGV4dCh2YWwgPT0gbnVsbCA/ICIiIDogdmFsKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQl0dmMyLnNldEVkaXRpbmdTdXBwb3J0KG5ldyBFZGl0aW5nU3VwcG9ydCh0Vmlld2VyKXsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5FZGl0KE9iamVjdCBlbGVtZW50KQotCQkJewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDZWxsRWRpdG9yIGdldENlbGxFZGl0b3IoT2JqZWN0IGVsZW1lbnQpCi0JCQl7Ci0JCQkJcmV0dXJuIG5ldyBUZXh0Q2VsbEVkaXRvcih0YWJsZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE9iamVjdCBnZXRWYWx1ZShPYmplY3QgZWxlbWVudCkKLQkJCXsKLQkJCQlTdHJpbmcgdHYgPSAoU3RyaW5nKWVsZW1lbnQ7Ci0JCQkJU3RyaW5nIHZhbCA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydHkodHYpOwotCQkJCXJldHVybiB2YWwgPT0gbnVsbCA/ICIiIDogdmFsOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKE9iamVjdCBlbGVtZW50LCBPYmplY3QgdmFsdWUpCi0JCQl7Ci0JCQkJU3RyaW5nIHR2ID0gKFN0cmluZyllbGVtZW50OwotCQkJCXByb3BlcnRpZXMuc2V0UHJvcGVydHkodHYsIChTdHJpbmcpdmFsdWUpOwotCQkJCXVwZGF0ZUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coKTsKLQkJCQl0Vmlld2VyLnVwZGF0ZSh0diwgbnVsbCk7Ci0JCQl9Ci0JCQkKLQkJfSk7Ci0JCQotCQlyZXN0b3JlQ29sdW1uU2V0dGluZ3MoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVSZW1vdmVCdXR0b24oKQotCXsKLQkJcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoIXRWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkuaXNFbXB0eSgpKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuIE1lc3NhZ2VzLmdldFN0cmluZygiQXR0cmlidXRlc0Jsb2NrLjE2Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0cyhJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24pCi0JewotLy8JCUxhdW5jaFByb3BlcnRpZXMgcCA9IG5ldyBMYXVuY2hQcm9wZXJ0aWVzKCk7Ci0vLwkJcC5zZXRQcm9wZXJ0eSgiaW5kZW50IiwgInllcyIpOwotLy8JCXRyeQotLy8JCXsKLS8vCQkJU3RyaW5nIHhtbCA9IHAudG9YTUwoKTsKLS8vCQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoSkFYUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9PVVRQVVRfUFJPUEVSVElFUywgeG1sKTsKLS8vCQl9Ci0vLwkJY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkKLS8vCQl7Ci0vLwkJCVhTTERlYnVnVUlQbHVnaW4ubG9nKGUpOwotLy8JCX0KLS8vCQljYXRjaCAoSU9FeGNlcHRpb24gZSkKLS8vCQl7Ci0vLwkJCVhTTERlYnVnVUlQbHVnaW4ubG9nKGUpOwotLy8JCX0KLS8vCQljYXRjaCAoVHJhbnNmb3JtZXJFeGNlcHRpb24gZSkKLS8vCQl7Ci0vLwkJCVhTTERlYnVnVUlQbHVnaW4ubG9nKGUpOwotLy8JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVByb3BlcnRpZXNGcm9tU3RvcmFnZShJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJU3RyaW5nIHMgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShKQVhQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX09VVFBVVF9QUk9QRVJUSUVTLCAoU3RyaW5nKSBudWxsKTsKLQkJaWYgKHMgIT0gbnVsbCAmJiBzLmxlbmd0aCgpID4gMCkKLQkJewotCQkJcHJvcGVydGllcyA9IExhdW5jaFByb3BlcnRpZXMuZnJvbVhNTChuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocy5nZXRCeXRlcygpKSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwcm9wZXJ0aWVzID0gbmV3IExhdW5jaFByb3BlcnRpZXMoKTsKLQkJfQotCQl0Vmlld2VyLnNldElucHV0KHByb3BlcnRpZXMpOwotCQl1cGRhdGVSZW1vdmVCdXR0b24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKQotCXsKLQkJdHJ5Ci0JCXsKLQkJCWluaXRpYWxpemVQcm9wZXJ0aWVzRnJvbVN0b3JhZ2UoY29uZmlndXJhdGlvbik7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLQkJewotCQkJWFNMRGVidWdVSVBsdWdpbi5sb2coZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtQXBwbHkoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uKQotCXsKLQkJdHJ5Ci0JCXsKLQkJCVN0cmluZyB4bWwgPSBwcm9wZXJ0aWVzLnRvWE1MKCk7Ci0JCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShKQVhQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX09VVFBVVF9QUk9QRVJUSUVTLCB4bWwpOwotCQl9Ci0JCWNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpCi0JCXsKLQkJCVhTTERlYnVnVUlQbHVnaW4ubG9nKGUpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKQotCQl7Ci0JCQlYU0xEZWJ1Z1VJUGx1Z2luLmxvZyhlKTsKLQkJfQotCQljYXRjaCAoVHJhbnNmb3JtZXJFeGNlcHRpb24gZSkKLQkJewotCQkJWFNMRGVidWdVSVBsdWdpbi5sb2coZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcGVyZm9ybVJlbW92ZSgpCi0JewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pdFZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNlbC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotCQl7Ci0JCQlTdHJpbmcgYXR0ID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCQkJcHJvcGVydGllcy5yZW1vdmVQcm9wZXJ0eShhdHQpOwotCQl9Ci0JCXRWaWV3ZXIucmVmcmVzaCgpOwotCQl1cGRhdGVMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9kZWJ1Zy91aS9pbnRlcm5hbC90YWJzL3Byb2Nlc3Nvci9PdXRwdXRQcm9wZXJ0eURpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9kZWJ1Zy91aS9pbnRlcm5hbC90YWJzL3Byb2Nlc3Nvci9PdXRwdXRQcm9wZXJ0eURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmM3YjdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvZGVidWcvdWkvaW50ZXJuYWwvdGFicy9wcm9jZXNzb3IvT3V0cHV0UHJvcGVydHlEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy51aS5pbnRlcm5hbC50YWJzLnByb2Nlc3NvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlN0YXR1c0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRvdWJsZUNsaWNrRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRG91YmxlQ2xpY2tMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5JT3V0cHV0UHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5JUHJvY2Vzc29yVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLkpBWFBSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuTGF1bmNoUHJvcGVydGllczsKLQotcHVibGljIGNsYXNzIE91dHB1dFByb3BlcnR5RGlhbG9nIGV4dGVuZHMgU3RhdHVzRGlhbG9nCi17Ci0JcHJpdmF0ZSBUYWJsZSB0YWJsZTsKLQlwcml2YXRlIFRhYmxlVmlld2VyIHRWaWV3ZXI7Ci0JcHJpdmF0ZSBUZXh0IHRleHQ7Ci0JcHJpdmF0ZSBMaXN0PElPdXRwdXRQcm9wZXJ0eT4gcHJvcGVydGllcyA9IG5ldyBBcnJheUxpc3Q8SU91dHB1dFByb3BlcnR5PigpOwotCXByaXZhdGUgTGlzdDxJT3V0cHV0UHJvcGVydHk+IHNlbGVjdGVkUHJvcGVydGllcyA9IG5ldyBBcnJheUxpc3Q8SU91dHB1dFByb3BlcnR5PigpOwotCi0JcHVibGljIE91dHB1dFByb3BlcnR5RGlhbG9nKFNoZWxsIHBhcmVudCwgTGF1bmNoUHJvcGVydGllcyBsYXVuY2hQcm9wZXJ0aWVzKQotCXsKLQkJc3VwZXIocGFyZW50KTsKLQkJc2V0VGl0bGUoIlNlbGVjdCBPdXRwdXQgUHJvcGVydGllcyIpOwotCQkKLQkJU2V0PFN0cmluZz4gcHJvcGVydHlTZXQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCWZvciAoU3RyaW5nIGF0dCA6IGxhdW5jaFByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpLmtleVNldCgpKQotCQl7Ci0JCQlwcm9wZXJ0eVNldC5hZGQoYXR0KTsKLQkJfQotCQlmb3IgKElQcm9jZXNzb3JUeXBlIHR5cGUgOiBKQVhQUnVudGltZS5nZXRQcm9jZXNzb3JUeXBlcygpKQotCQl7Ci0JCQlmb3IgKElPdXRwdXRQcm9wZXJ0eSBwcm9wZXJ0eSA6IHR5cGUuZ2V0T3V0cHV0UHJvcGVydGllcygpKQotCQkJewotCQkJCWlmICghcHJvcGVydHlTZXQuY29udGFpbnMocHJvcGVydHkuZ2V0VVJJKCkpKQotCQkJCXsKLQkJCQkJcHJvcGVydHlTZXQuYWRkKHByb3BlcnR5LmdldFVSSSgpKTsKLQkJCQkJcHJvcGVydGllcy5hZGQocHJvcGVydHkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpCi0JewotCQlDb21wb3NpdGUgY29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LFNXVC5OT05FKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsU1dULkZJTEwsdHJ1ZSx0cnVlKTsKLQkJZ2Qud2lkdGhIaW50ID0gNDAwOwotCQljb21wLnNldExheW91dERhdGEoZ2QpOwotCQljb21wLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXAsU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KCJTZWxlY3Qgb25lIG9yIG1vcmUgb3V0cHV0IHByb3BlcnRpZXMgZm9yIHRoZSB0cmFuc2Zvcm1hdGlvbi4iKTsKLQkJCi0JCQotCQl0YWJsZSA9IG5ldyBUYWJsZShjb21wLFNXVC5CT1JERVIgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuVl9TQ1JPTEwgfCBTV1QuTVVMVEkpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKGZhbHNlKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsU1dULkZJTEwsdHJ1ZSx0cnVlKTsKLQkJZ2QudmVydGljYWxJbmRlbnQgPSAxMDsKLQkJZ2QuaGVpZ2h0SGludCA9IDIwMDsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQl0Vmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlKTsKLQkJdFZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKCkKLQkJewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpCi0JCQl7Ci0JCQkJcmV0dXJuIHByb3BlcnRpZXMudG9BcnJheShuZXcgSU91dHB1dFByb3BlcnR5WzBdKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpCi0JCQl7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkKLQkJCXsKLQkJCX0KLQkJfSk7Ci0JCXRWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgTGFiZWxQcm92aWRlcigpewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpCi0JCQl7Ci0JCQkJSU91dHB1dFByb3BlcnR5IHByb3BlcnR5ID0gKElPdXRwdXRQcm9wZXJ0eSllbGVtZW50OwotCQkJCXJldHVybiBwcm9wZXJ0eS5nZXRVUkkoKTsKLQkJCX0KLQkJfSk7Ci0JCXRWaWV3ZXIuc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikKLQkJCXsKLQkJCQlJT3V0cHV0UHJvcGVydHkgYTEgPSAoSU91dHB1dFByb3BlcnR5KSBlMTsKLQkJCQlJT3V0cHV0UHJvcGVydHkgYTIgPSAoSU91dHB1dFByb3BlcnR5KSBlMjsKLQkJCQlyZXR1cm4gYTEuZ2V0VVJJKCkuY29tcGFyZVRvKGEyLmdldFVSSSgpKTsKLQkJCX0KLQkJfSk7Ci0JCXRWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCl7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLQkJCXsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJc2VsZWN0ZWRQcm9wZXJ0aWVzID0gc2VsLnRvTGlzdCgpOwotCQkJCWlmIChzZWwuaXNFbXB0eSgpKQotCQkJCQl0ZXh0LnNldFRleHQoIiIpOwotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCUlPdXRwdXRQcm9wZXJ0eSBwcm9wZXJ0eSA9IChJT3V0cHV0UHJvcGVydHkpc2VsLmdldEZpcnN0RWxlbWVudCgpOyAKLQkJCQkJdGV4dC5zZXRUZXh0KHByb3BlcnR5LmdldERlc2NyaXB0aW9uKCkpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCXRWaWV3ZXIuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihuZXcgSURvdWJsZUNsaWNrTGlzdGVuZXIoKXsKLQkJCXB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpCi0JCQl7Ci0JCQkJYnV0dG9uUHJlc3NlZChJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKTsKLQkJCX0KLQkJfSk7Ci0JCXRWaWV3ZXIuc2V0SW5wdXQocHJvcGVydGllcyk7Ci0JCQotCQl0ZXh0ID0gbmV3IFRleHQoY29tcCxTV1QuQk9SREVSIHwgU1dULldSQVAgfCBTV1QuUkVBRF9PTkxZIHwgU1dULlZfU0NST0xMKTsKLQkJdGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLFNXVC5GSUxMLHRydWUsZmFsc2UpOwotCQlnZC5oZWlnaHRIaW50ID0gODA7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQlpZiAocHJvcGVydGllcy5zaXplKCkgPiAwKQotCQl7Ci0JCQl0Vmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih0Vmlld2VyLmdldEVsZW1lbnRBdCgwKSksIHRydWUpOwotCQl9Ci0JCQotCQlyZXR1cm4gY29tcDsKLQl9Ci0JCi0JcHVibGljIExpc3Q8SU91dHB1dFByb3BlcnR5PiBnZXRPdXRwdVByb3BlcnRpZXMoKQotCXsKLQkJcmV0dXJuIHNlbGVjdGVkUHJvcGVydGllczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2RlYnVnL3VpL2ludGVybmFsL3RhYnMvcHJvY2Vzc29yL1Byb2Nlc3NvckJsb2NrLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2RlYnVnL3VpL2ludGVybmFsL3RhYnMvcHJvY2Vzc29yL1Byb2Nlc3NvckJsb2NrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNzJiOWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9kZWJ1Zy91aS9pbnRlcm5hbC90YWJzL3Byb2Nlc3Nvci9Qcm9jZXNzb3JCbG9jay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy51aS5pbnRlcm5hbC50YWJzLnByb2Nlc3NvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLkFic3RyYWN0TGF1bmNoQ29uZmlndXJhdGlvblRhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5YU0xEZWJ1Z1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5Qcm9jZXNzb3JzUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5JUHJvY2Vzc29ySW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLklQcm9jZXNzb3JUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuSVRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLkpBWFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuSkFYUFJ1bnRpbWU7Ci0KLXB1YmxpYyBjbGFzcyBQcm9jZXNzb3JCbG9jayBleHRlbmRzIEFic3RyYWN0TGF1bmNoQ29uZmlndXJhdGlvblRhYgotewotCXByaXZhdGUgQnV0dG9uIHVzZVByZWZlcmVuY2VzUmFkaW87Ci0JcHJpdmF0ZSBCdXR0b24gYWx0ZXJQcmVmZXJlbmNlc0J1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBvdmVycmlkZVByZWZlcmVuY2VzUmFkaW87Ci0JcHJpdmF0ZSBDb21ibyBydW5Db21ibzsKLQlwcml2YXRlIEJ1dHRvbiBpbnN0YWxsZWRQcm9jZXNzb3JzQnV0dG9uOwotCXByaXZhdGUgQ29tYm9WaWV3ZXIgcnVuQ29tYm9WaWV3ZXI7Ci0JcHJpdmF0ZSBDb21ib1ZpZXdlciBmYWN0b3J5Q29tYm9WaWV3ZXI7Ci0JcHJpdmF0ZSBJVHJhbnNmb3JtZXJGYWN0b3J5IGN1cnJlbnRGYWN0b3J5OwotCi0JcHVibGljIFByb2Nlc3NvckJsb2NrKCkKLQl7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KQotCXsKLQkJRm9udCBmb250ID0gcGFyZW50LmdldEZvbnQoKTsKLQotCQlDb21wb3NpdGUgZ3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlzZXRDb250cm9sKGdyb3VwKTsKLQkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCWdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlncm91cC5zZXRGb250KGZvbnQpOwotLy8JCWdyb3VwLnNldFRleHQoUHJvY2Vzc29yTWVzc2FnZXMuUHJvY2Vzc29yQmxvY2tfMCk7Ci0KLQkJdXNlUHJlZmVyZW5jZXNSYWRpbyA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5SQURJTyk7Ci0JCXVzZVByZWZlcmVuY2VzUmFkaW8uc2V0VGV4dChQcm9jZXNzb3JNZXNzYWdlcy5Qcm9jZXNzb3JCbG9ja18xKTsKLQkJdXNlUHJlZmVyZW5jZXNSYWRpby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLQkJCXsKLQkJCQlwcmVmZXJlbmNlc1NlbGVjdGVkKCk7Ci0JCQkJdXBkYXRlTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZygpOwotCQkJfQotCQl9KTsKLQotCQlhbHRlclByZWZlcmVuY2VzQnV0dG9uID0gbmV3IEJ1dHRvbihncm91cCwgU1dULlBVU0gpOwotCQlhbHRlclByZWZlcmVuY2VzQnV0dG9uLnNldFRleHQoUHJvY2Vzc29yTWVzc2FnZXMuUHJvY2Vzc29yQmxvY2tfMik7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKLQkJZ2Qud2lkdGhIaW50ID0gMTUwOwotCQlhbHRlclByZWZlcmVuY2VzQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlhbHRlclByZWZlcmVuY2VzQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotCQkJewotCQkJCUlQcmVmZXJlbmNlUGFnZSBwYWdlID0gbmV3IFByb2Nlc3NvcnNQcmVmZXJlbmNlUGFnZSgpOwotCQkJCXNob3dQcmVmUGFnZSgib3JnLmVjbGlwc2Uud3N0LnhzbHQubGF1bmNoaW5nLnVpLnByZWZlcmVuY2VzLlByb2Nlc3NvclByZWZlcmVuY2VQYWdlIiwgcGFnZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSk7Ci0KLQkJb3ZlcnJpZGVQcmVmZXJlbmNlc1JhZGlvID0gbmV3IEJ1dHRvbihncm91cCwgU1dULlJBRElPKTsKLQkJb3ZlcnJpZGVQcmVmZXJlbmNlc1JhZGlvLnNldFRleHQoUHJvY2Vzc29yTWVzc2FnZXMuUHJvY2Vzc29yQmxvY2tfNCk7Ci0JCW92ZXJyaWRlUHJlZmVyZW5jZXNSYWRpby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLQkJCXsKLQkJCQlvdmVycmlkZVNlbGVjdGVkKCk7Ci0JCQkJdXBkYXRlTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZygpOwotCQkJfQotCQl9KTsKLQotCQlpbnN0YWxsZWRQcm9jZXNzb3JzQnV0dG9uID0gbmV3IEJ1dHRvbihncm91cCwgU1dULlBVU0gpOwotCQlpbnN0YWxsZWRQcm9jZXNzb3JzQnV0dG9uLnNldFRleHQoUHJvY2Vzc29yTWVzc2FnZXMuUHJvY2Vzc29yc0NvbWJvQmxvY2tfMSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKLQkJZ2Qud2lkdGhIaW50ID0gMTUwOwotCQlpbnN0YWxsZWRQcm9jZXNzb3JzQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlpbnN0YWxsZWRQcm9jZXNzb3JzQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotCQkJewotCQkJCUlQcmVmZXJlbmNlUGFnZSBwYWdlID0gbmV3IFByb2Nlc3NvcnNQcmVmZXJlbmNlUGFnZSgpOwotCQkJCXNob3dQcmVmUGFnZSgib3JnLmVjbGlwc2Uud3N0LnhzbHQubGF1bmNoaW5nLnVpLnByZWZlcmVuY2VzLlByb2Nlc3NvclByZWZlcmVuY2VQYWdlIiwgcGFnZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSk7Ci0KLQkJQ29tcG9zaXRlIHNldHRpbmdzQ29tcCA9IG5ldyBDb21wb3NpdGUoZ3JvdXAsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBnbCA9IG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKTsKLQkJZ2wubWFyZ2luSGVpZ2h0ID0gMjsKLQkJc2V0dGluZ3NDb21wLnNldExheW91dChnbCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxJbmRlbnQgPSAxNTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlzZXR0aW5nc0NvbXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXNldHRpbmdzQ29tcC5zZXRGb250KGZvbnQpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHNldHRpbmdzQ29tcCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KFByb2Nlc3Nvck1lc3NhZ2VzLlByb2Nlc3NvckJsb2NrXzYpOwotCQlydW5Db21ibyA9IG5ldyBDb21ibyhzZXR0aW5nc0NvbXAsIFNXVC5SRUFEX09OTFkgfCBTV1QuU0lOR0xFKTsKLQkJcnVuQ29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXJ1bkNvbWJvVmlld2VyID0gbmV3IENvbWJvVmlld2VyKHJ1bkNvbWJvKTsKLQkJcnVuQ29tYm9WaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBDb21ib0NvbnRlbnRQcm92aWRlcigpKTsKLQkJcnVuQ29tYm9WaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQ29tYm9MYWJlbFByb3ZpZGVyKCkpOwotCQlydW5Db21ib1ZpZXdlci5zZXRJbnB1dChKQVhQUnVudGltZS5nZXRQcm9jZXNzb3JzKCkpOwotCQlydW5Db21ib1ZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKQotCQl7Ci0KLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KQotCQkJewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKCFzZWwuaXNFbXB0eSgpKQotCQkJCXsKLQkJCQkJSVByb2Nlc3Nvckluc3RhbGwgcHJvY2Vzc29yID0gKElQcm9jZXNzb3JJbnN0YWxsKSBzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCQotCQkJCQlpZiAocHJvY2Vzc29yLmdldFByb2Nlc3NvclR5cGUoKS5nZXRUcmFuc2Zvcm1lckZhY3RvcmllcygpLmxlbmd0aCA+IDEpCi0JCQkJCQlmYWN0b3J5Q29tYm9WaWV3ZXIuZ2V0Q29tYm8oKS5zZXRWaXNpYmxlKHRydWUpOwotCQkJCQllbHNlCi0JCQkJCQlmYWN0b3J5Q29tYm9WaWV3ZXIuZ2V0Q29tYm8oKS5zZXRWaXNpYmxlKGZhbHNlKTsKLQotCQkJCQlmYWN0b3J5Q29tYm9WaWV3ZXIuc2V0SW5wdXQocHJvY2Vzc29yLmdldFByb2Nlc3NvclR5cGUoKSk7Ci0JCQkJCQotCQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJCWZvciAoSVRyYW5zZm9ybWVyRmFjdG9yeSB0ZiA6IHByb2Nlc3Nvci5nZXRQcm9jZXNzb3JUeXBlKCkuZ2V0VHJhbnNmb3JtZXJGYWN0b3JpZXMoKSkKLQkJCQkJewotCQkJCQkJaWYgKHRmLmVxdWFscyhjdXJyZW50RmFjdG9yeSkpCi0JCQkJCQl7Ci0JCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICghZm91bmQpCi0JCQkJCXsKLQkJCQkJCWN1cnJlbnRGYWN0b3J5ID0gcHJvY2Vzc29yLmdldFByb2Nlc3NvclR5cGUoKS5nZXREZWZhdWx0VHJhbnNmb3JtZXJGYWN0b3J5KCk7Ci0JCQkJCQlpZiAoY3VycmVudEZhY3RvcnkhPW51bGwpCi0JCQkJCQkJZmFjdG9yeUNvbWJvVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihjdXJyZW50RmFjdG9yeSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXVwZGF0ZUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coKTsKLQkJCX0KLQkJfSk7Ci0KLQkJQ29tYm8gZmFjdG9yeUNvbWJvID0gbmV3IENvbWJvKHNldHRpbmdzQ29tcCwgU1dULlJFQURfT05MWSB8IFNXVC5TSU5HTEUpOwotCQlmYWN0b3J5Q29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoODAsU1dULkRFRkFVTFQpKTsKLQkJZmFjdG9yeUNvbWJvVmlld2VyID0gbmV3IENvbWJvVmlld2VyKGZhY3RvcnlDb21ibyk7Ci0JCWZhY3RvcnlDb21ib1ZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKCl7Ci0KLQkJCXByaXZhdGUgSVByb2Nlc3NvclR5cGUgdHlwZTsKLQkJCQotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpCi0JCQl7Ci0JCQkJcmV0dXJuIHR5cGUuZ2V0VHJhbnNmb3JtZXJGYWN0b3JpZXMoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpCi0JCQl7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkKLQkJCXsKLQkJCQl0aGlzLnR5cGUgPSAoSVByb2Nlc3NvclR5cGUpbmV3SW5wdXQ7Ci0JCQl9Ci0JCQkKLQkJfSk7Ci0JCWZhY3RvcnlDb21ib1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBMYWJlbFByb3ZpZGVyKCl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkKLQkJCXsKLQkJCQlJVHJhbnNmb3JtZXJGYWN0b3J5IGYgPSAoSVRyYW5zZm9ybWVyRmFjdG9yeSllbGVtZW50OwotCQkJCXJldHVybiBmLmdldE5hbWUoKTsgLy8gKyAiIC0gIiArIGYuZ2V0RmFjdG9yeUNsYXNzKCk7Ci0JCQl9Ci0JCX0pOwotCQlmYWN0b3J5Q29tYm9WaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkKLQkJewotCi0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLQkJCXsKLQkJCQljdXJyZW50RmFjdG9yeSA9IChJVHJhbnNmb3JtZXJGYWN0b3J5KSgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pZXZlbnQuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCXVwZGF0ZUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coKTsKLQkJCX0KLQkJfSk7Ci0KLS8vCQlvdmVycmlkZVByZWZlcmVuY2VzQnV0dG9uID0gbmV3IEJ1dHRvbihncm91cCxTV1QuQ0hFQ0spOwotLy8JCW92ZXJyaWRlUHJlZmVyZW5jZXNCdXR0b24uc2V0VGV4dCgiT3ZlcnJpZGUgcHJlZmVyZW5jZXMiKTsKLS8vCQlnZCA9IG5ldyBHcmlkRGF0YShTV1QuTk9ORSxTV1QuTk9ORSxmYWxzZSxmYWxzZSk7Ci0vLwkJb3ZlcnJpZGVQcmVmZXJlbmNlc0J1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLS8vCQlvdmVycmlkZVByZWZlcmVuY2VzQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpewotLy8JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLS8vCQkJe30KLS8vCQkJCi0vLwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0vLwkJCXsKLS8vCQkJCWZpcmVQcmVmZXJlbmNlUHJvY2Vzc29yQ2hhbmdlZChvdmVycmlkZVByZWZlcmVuY2VzQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLS8vCQkJfQotLy8JCX0pOwotCX0KLQkKLQotCXByaXZhdGUgdm9pZCBwcmVmZXJlbmNlc1NlbGVjdGVkKCkKLQl7Ci0JCWFsdGVyUHJlZmVyZW5jZXNCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJaW5zdGFsbGVkUHJvY2Vzc29yc0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJcnVuQ29tYm8uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWZhY3RvcnlDb21ib1ZpZXdlci5nZXRDb21ibygpLnNldEVuYWJsZWQoZmFsc2UpOwotCQlydW5Db21ib1ZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZ2V0UnVuUHJvY2Vzc29yUHJlZmVyZW5jZSgpKSwgdHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG92ZXJyaWRlU2VsZWN0ZWQoKQotCXsKLQkJYWx0ZXJQcmVmZXJlbmNlc0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJaW5zdGFsbGVkUHJvY2Vzc29yc0J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQlmYWN0b3J5Q29tYm9WaWV3ZXIuZ2V0Q29tYm8oKS5zZXRFbmFibGVkKHRydWUpOwotCQlydW5Db21iby5zZXRFbmFibGVkKHRydWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzaG93UHJlZlBhZ2UoU3RyaW5nIGlkLCBJUHJlZmVyZW5jZVBhZ2UgcGFnZSkKLQl7Ci0JCVhTTERlYnVnVUlQbHVnaW4uc2hvd1ByZWZlcmVuY2VQYWdlKGlkLCBwYWdlKTsKLQkJLy8gbm93IHJlZnJlc2ggZXZlcnl0aGluZwotCQlydW5Db21ib1ZpZXdlci5zZXRJbnB1dChKQVhQUnVudGltZS5nZXRQcm9jZXNzb3JzKCkpOwotCQlydW5Db21ib1ZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZ2V0UnVuUHJvY2Vzc29yUHJlZmVyZW5jZSgpKSwgdHJ1ZSk7Ci0JCS8vIHByZWZlcmVuY2VzU2VsZWN0ZWQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuIFByb2Nlc3Nvck1lc3NhZ2VzLlByb2Nlc3NvckJsb2NrXzc7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikKLQl7Ci0JCXRyeQotCQl7Ci0JCQlib29sZWFuIHVzZURlZmF1bHRQcm9jZXNzb3IgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShKQVhQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1VTRV9ERUZBVUxUX1BST0NFU1NPUiwgdHJ1ZSk7Ci0JCQlpZiAodXNlRGVmYXVsdFByb2Nlc3NvcikKLQkJCXsKLQkJCQl1c2VQcmVmZXJlbmNlc1JhZGlvLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQlvdmVycmlkZVByZWZlcmVuY2VzUmFkaW8uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCQlwcmVmZXJlbmNlc1NlbGVjdGVkKCk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJdXNlUHJlZmVyZW5jZXNSYWRpby5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCW92ZXJyaWRlUHJlZmVyZW5jZXNSYWRpby5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJb3ZlcnJpZGVTZWxlY3RlZCgpOwotCi0JCQkJSVByb2Nlc3Nvckluc3RhbGwgcnVuSW5zdGFsbCA9IG51bGw7Ci0JCQkJU3RyaW5nIHJ1bklkID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoSkFYUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QUk9DRVNTT1IsIChTdHJpbmcpIG51bGwpOwotCQkJCWlmIChydW5JZCAhPSBudWxsKQotCQkJCQlydW5JbnN0YWxsID0gSkFYUFJ1bnRpbWUuZ2V0UHJvY2Vzc29yKHJ1bklkKTsKLQkJCQlpZiAocnVuSW5zdGFsbCA9PSBudWxsKQotCQkJCQlydW5JbnN0YWxsID0gZ2V0UnVuUHJvY2Vzc29yUHJlZmVyZW5jZSgpOwotCQkJCXJ1bkNvbWJvVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihydW5JbnN0YWxsKSk7Ci0JCQkJCi0KLQkJCQlTdHJpbmcgZmFjdG9yeUlkID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoSkFYUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9UUkFOU0ZPUk1FUl9GQUNUT1JZLCAoU3RyaW5nKSBudWxsKTsKLQkJCQlpZiAoZmFjdG9yeUlkID09IG51bGwpCi0JCQkJewotCQkJCQljdXJyZW50RmFjdG9yeSA9IHJ1bkluc3RhbGwuZ2V0UHJvY2Vzc29yVHlwZSgpLmdldERlZmF1bHRUcmFuc2Zvcm1lckZhY3RvcnkoKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJZm9yIChJVHJhbnNmb3JtZXJGYWN0b3J5IHRmIDogcnVuSW5zdGFsbC5nZXRQcm9jZXNzb3JUeXBlKCkuZ2V0VHJhbnNmb3JtZXJGYWN0b3JpZXMoKSkKLQkJCQkJewotCQkJCQkJaWYgKHRmLmdldEZhY3RvcnlDbGFzcygpLmVxdWFscyhmYWN0b3J5SWQpKQotCQkJCQkJewotCQkJCQkJCWN1cnJlbnRGYWN0b3J5ID0gdGY7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKGN1cnJlbnRGYWN0b3J5ID09IG51bGwpCi0JCQkJewotCQkJCQljdXJyZW50RmFjdG9yeSA9IHJ1bkluc3RhbGwuZ2V0UHJvY2Vzc29yVHlwZSgpLmdldERlZmF1bHRUcmFuc2Zvcm1lckZhY3RvcnkoKTsKLQkJCQl9Ci0JCQkJaWYgKGN1cnJlbnRGYWN0b3J5ICE9IG51bGwpCi0JCQkJewotCQkJCQlmYWN0b3J5Q29tYm9WaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGN1cnJlbnRGYWN0b3J5KSwgdHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JCXsKLQkJCVhTTERlYnVnVUlQbHVnaW4ubG9nKGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJUHJvY2Vzc29ySW5zdGFsbCBnZXRSdW5Qcm9jZXNzb3JQcmVmZXJlbmNlKCkKLQl7Ci0JCXJldHVybiBKQVhQUnVudGltZS5nZXREZWZhdWx0UHJvY2Vzc29yKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybUFwcGx5KElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbikKLQl7Ci0JCWJvb2xlYW4gdXNlUHJlZmVyZW5jZXMgPSB1c2VQcmVmZXJlbmNlc1JhZGlvLmdldFNlbGVjdGlvbigpOwotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShKQVhQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1VTRV9ERUZBVUxUX1BST0NFU1NPUiwgdXNlUHJlZmVyZW5jZXMpOwotCQlpZiAoIXVzZVByZWZlcmVuY2VzKQotCQl7Ci0JCQlJUHJvY2Vzc29ySW5zdGFsbCBydW5wcm9jZXNzb3IgPSAoSVByb2Nlc3Nvckluc3RhbGwpICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHJ1bkNvbWJvVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKEpBWFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfUFJPQ0VTU09SLCBydW5wcm9jZXNzb3IuZ2V0SWQoKSk7Ci0JCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShKQVhQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1RSQU5TRk9STUVSX0ZBQ1RPUlksIGN1cnJlbnRGYWN0b3J5ID09IG51bGwgPyBudWxsIDogY3VycmVudEZhY3RvcnkuZ2V0RmFjdG9yeUNsYXNzKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdHMoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uKQotCXsKLQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoSkFYUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9VU0VfREVGQVVMVF9QUk9DRVNTT1IsIHRydWUpOwotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShKQVhQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BST0NFU1NPUiwgKFN0cmluZykgbnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBDb21ib0NvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyCi0JewotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkKLQkJewotCQkJcmV0dXJuIEpBWFBSdW50aW1lLmdldFByb2Nlc3NvcnMoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotCQl7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpCi0JCXsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgQ29tYm9MYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlcgotCXsKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkKLQkJewotCQkJSVByb2Nlc3Nvckluc3RhbGwgaW5zdGFsbCA9IChJUHJvY2Vzc29ySW5zdGFsbCkgZWxlbWVudDsKLQkJCXJldHVybiBpbnN0YWxsLmdldE5hbWUoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvZGVidWcvdWkvaW50ZXJuYWwvdGFicy9wcm9jZXNzb3IvUHJvY2Vzc29yRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9kZWJ1Zy91aS9pbnRlcm5hbC90YWJzL3Byb2Nlc3Nvci9Qcm9jZXNzb3JEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzYmY5MmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9kZWJ1Zy91aS9pbnRlcm5hbC90YWJzL3Byb2Nlc3Nvci9Qcm9jZXNzb3JEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcudWkuaW50ZXJuYWwudGFicy5wcm9jZXNzb3I7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcm9jZXNzb3JEZXNjcmlwdG9yCi17Ci0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvZGVidWcvdWkvaW50ZXJuYWwvdGFicy9wcm9jZXNzb3IvUHJvY2Vzc29yRGV0YWlsc0RpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9kZWJ1Zy91aS9pbnRlcm5hbC90YWJzL3Byb2Nlc3Nvci9Qcm9jZXNzb3JEZXRhaWxzRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNjIxZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9kZWJ1Zy91aS9pbnRlcm5hbC90YWJzL3Byb2Nlc3Nvci9Qcm9jZXNzb3JEZXRhaWxzRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpLmludGVybmFsLnRhYnMucHJvY2Vzc29yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLlhTTERlYnVnVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5JUHJvY2Vzc29ySW5zdGFsbDsKLQotcHVibGljIGNsYXNzIFByb2Nlc3NvckRldGFpbHNEaWFsb2cgZXh0ZW5kcyBEaWFsb2cKLXsKLQlwcml2YXRlIGZpbmFsIElQcm9jZXNzb3JJbnN0YWxsIGluc3RhbGw7Ci0KLQlwdWJsaWMgUHJvY2Vzc29yRGV0YWlsc0RpYWxvZyhTaGVsbCBzaGVsbCwgSVByb2Nlc3Nvckluc3RhbGwgaW5zdGFsbCkKLQl7Ci0JCXN1cGVyKHNoZWxsKTsKLQkJc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuUkVTSVpFKTsKLQkJdGhpcy5pbnN0YWxsID0gaW5zdGFsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBuZXdTaGVsbCkKLQl7Ci0JCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKG5ld1NoZWxsKTsKLQkJbmV3U2hlbGwuc2V0VGV4dChQcm9jZXNzb3JNZXNzYWdlcy5Qcm9jZXNzb3JEZXRhaWxzRGlhbG9nX1RpdGxlKTsKLQkJLy8gVE9ETyBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwLi4uCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgYW5jZXN0b3IpCi0JewotCQlDb21wb3NpdGUgcGFyZW50ID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShhbmNlc3Rvcik7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQlwYXJlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJLy8gdHlwZQotCQljcmVhdGVMYWJlbChwYXJlbnQsIFByb2Nlc3Nvck1lc3NhZ2VzLlByb2Nlc3NvckRldGFpbHNEaWFsb2dfaW5zdGFsbFR5cGUpOwotCQljcmVhdGVMYWJlbChwYXJlbnQsIGluc3RhbGwuZ2V0UHJvY2Vzc29yVHlwZSgpLmdldExhYmVsKCkpOwotCi0JCS8vIG5hbWUKLQkJY3JlYXRlTGFiZWwocGFyZW50LCBQcm9jZXNzb3JNZXNzYWdlcy5Qcm9jZXNzb3JEZXRhaWxzRGlhbG9nX2luc3RhbGxOYW1lKTsKLQkJY3JlYXRlTGFiZWwocGFyZW50LCBpbnN0YWxsLmdldE5hbWUoKSk7Ci0KLQkJLy8gamFycwotCQlMYWJlbCBsYWJlbCA9IGNyZWF0ZUxhYmVsKHBhcmVudCwgUHJvY2Vzc29yTWVzc2FnZXMuUHJvY2Vzc29yRGV0YWlsc0RpYWxvZ19pbnN0YWxsQ2xhc3NwYXRoKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJVGFibGVWaWV3ZXIgbGlicmFyeVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihwYXJlbnQpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlnZC5oZWlnaHRIaW50ID0gNjsKLQkJbGlicmFyeVZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWxpYnJhcnlWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBKYXJDb250ZW50UHJvdmlkZXIoKSk7Ci0JCWxpYnJhcnlWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgSmFyTGFiZWxQcm92aWRlcigpKTsKLQkJbGlicmFyeVZpZXdlci5zZXRJbnB1dChpbnN0YWxsKTsKLQotCQlhcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQlwcml2YXRlIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KQotCXsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQodGV4dCk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBzZWN0aW9uIHRoYXQgdGhpcyBkaWFsb2cgc3RvcmVzIGl0cyBzZXR0aW5ncyBpbgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREaWFsb2dTZXR0aW5nc1NlY3Rpb25OYW1lKCkKLQl7Ci0JCXJldHVybiAiWFNMX0RFVEFJTFNfRElBTE9HX1NFQ1RJT04iOyAvLyROT04tTkxTLTEkCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElEaWFsb2dTZXR0aW5ncyBnZXREaWFsb2dCb3VuZHNTZXR0aW5ncygpCi0JewotCQlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBYU0xEZWJ1Z1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpOwotCQlJRGlhbG9nU2V0dGluZ3Mgc2VjdGlvbiA9IHNldHRpbmdzLmdldFNlY3Rpb24oZ2V0RGlhbG9nU2V0dGluZ3NTZWN0aW9uTmFtZSgpKTsKLQkJaWYgKHNlY3Rpb24gPT0gbnVsbCkKLQkJewotCQkJc2VjdGlvbiA9IHNldHRpbmdzLmFkZE5ld1NlY3Rpb24oZ2V0RGlhbG9nU2V0dGluZ3NTZWN0aW9uTmFtZSgpKTsKLQkJfQotCQlyZXR1cm4gc2VjdGlvbjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpCi0JewotCQkvLyBjcmVhdGUgT0sgYW5kIENhbmNlbCBidXR0b25zIGJ5IGRlZmF1bHQKLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwgdHJ1ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2RlYnVnL3VpL2ludGVybmFsL3RhYnMvcHJvY2Vzc29yL1Byb2Nlc3Nvck1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2RlYnVnL3VpL2ludGVybmFsL3RhYnMvcHJvY2Vzc29yL1Byb2Nlc3Nvck1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNGUxNTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9kZWJ1Zy91aS9pbnRlcm5hbC90YWJzL3Byb2Nlc3Nvci9Qcm9jZXNzb3JNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpLmludGVybmFsLnRhYnMucHJvY2Vzc29yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotY2xhc3MgUHJvY2Vzc29yTWVzc2FnZXMgZXh0ZW5kcyBOTFMKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpLmludGVybmFsLnRhYnMucHJvY2Vzc29yLlByb2Nlc3Nvck1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc29yQmxvY2tfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzb3JCbG9ja18xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NvckJsb2NrXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc29yQmxvY2tfNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzb3JCbG9ja182OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NvckJsb2NrXzc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc29yc0NvbWJvQmxvY2tfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzb3JEZXRhaWxzRGlhbG9nX1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NvckRldGFpbHNEaWFsb2dfaW5zdGFsbE5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc29yRGV0YWlsc0RpYWxvZ19pbnN0YWxsVHlwZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzb3JEZXRhaWxzRGlhbG9nX2luc3RhbGxDbGFzc3BhdGg7Ci0KLQlzdGF0aWMKLQl7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBQcm9jZXNzb3JNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2RlYnVnL3VpL2ludGVybmFsL3RhYnMvcHJvY2Vzc29yL1Byb2Nlc3Nvck1lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2RlYnVnL3VpL2ludGVybmFsL3RhYnMvcHJvY2Vzc29yL1Byb2Nlc3Nvck1lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYTcyNzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9kZWJ1Zy91aS9pbnRlcm5hbC90YWJzL3Byb2Nlc3Nvci9Qcm9jZXNzb3JNZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotUHJvY2Vzc29yQmxvY2tfMD1YU0xUIFByb2Nlc3NvcgotUHJvY2Vzc29yQmxvY2tfMT1Vc2UgcHJvY2Vzc29yIGZyb20gcHJlZmVyZW5jZXMKLVByb2Nlc3NvckJsb2NrXzI9Q2hhbmdlIHByZWZlcmVuY2VzLi4uCi1Qcm9jZXNzb3JCbG9ja180PVVzZSBzcGVjaWZpYyBwcm9jZXNzb3IKLVByb2Nlc3NvckJsb2NrXzY9UHJvY2Vzc29yOgotUHJvY2Vzc29yQmxvY2tfNz1Qcm9jZXNzb3IKLVByb2Nlc3NvcnNDb21ib0Jsb2NrXzE9Jkluc3RhbGxlZCBwcm9jZXNzb3JzLi4uCi0KLVByb2Nlc3NvckRldGFpbHNEaWFsb2dfVGl0bGU9QnVpbHQtaW4gWFNMVCBQcm9jZXNzb3IKLVByb2Nlc3NvckRldGFpbHNEaWFsb2dfaW5zdGFsbE5hbWU9TmFtZToKLVByb2Nlc3NvckRldGFpbHNEaWFsb2dfaW5zdGFsbFR5cGU9VHlwZToKLVByb2Nlc3NvckRldGFpbHNEaWFsb2dfaW5zdGFsbENsYXNzcGF0aD1MaWJyYXJpZXM6Ci0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9kZWJ1Zy91aS9pbnRlcm5hbC90YWJzL3Byb2Nlc3Nvci9YU0xQcm9jZXNzb3JUYWIyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2RlYnVnL3VpL2ludGVybmFsL3RhYnMvcHJvY2Vzc29yL1hTTFByb2Nlc3NvclRhYjIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ2NDhjNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2RlYnVnL3VpL2ludGVybmFsL3RhYnMvcHJvY2Vzc29yL1hTTFByb2Nlc3NvclRhYjIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIERhdmlkIENhcnZlciAtIGJ1ZyAyMjM1NTcgLSBBZGRlZCBpbWFnZXMgY29udHJpYnV0ZWQgYnkgSG9sZ2VyIFZvb3JtYW5uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpLmludGVybmFsLnRhYnMucHJvY2Vzc29yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5YU0xMYXVuY2hDb25maWd1cmF0aW9uVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy51aS5pbnRlcm5hbC5KQVhQRGVidWdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLklQcm9jZXNzb3JJbnZva2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuSkFYUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5KQVhQUnVudGltZTsKLQotcHVibGljIGNsYXNzIFhTTFByb2Nlc3NvclRhYjIgZXh0ZW5kcyBYU0xMYXVuY2hDb25maWd1cmF0aW9uVGFiCi17Ci0JcHJpdmF0ZSBmaW5hbCBQcm9jZXNzb3JCbG9jayBwcm9jZXNzb3JCbG9jazsKLQlwcml2YXRlIGZpbmFsIEF0dHJpYnV0ZXNCbG9jayBhdHRyaWJ1dGVzQmxvY2s7Ci0JcHJpdmF0ZSBmaW5hbCBPdXRwdXRQcm9wZXJ0aWVzQmxvY2sgb3V0cHV0UHJvcGVydGllc0Jsb2NrOwotCXByaXZhdGUgSW1hZ2UgaW1hZ2U7Ci0KLQlwdWJsaWMgWFNMUHJvY2Vzc29yVGFiMigpCi0JewotCQlhdHRyaWJ1dGVzQmxvY2sgPSBuZXcgQXR0cmlidXRlc0Jsb2NrKCk7Ci0JCW91dHB1dFByb3BlcnRpZXNCbG9jayA9IG5ldyBPdXRwdXRQcm9wZXJ0aWVzQmxvY2soKTsKLQkJcHJvY2Vzc29yQmxvY2sgPSBuZXcgUHJvY2Vzc29yQmxvY2soKTsKLQkJCi0JCXNldEJsb2NrcyhuZXcgSUxhdW5jaENvbmZpZ3VyYXRpb25UYWJbXQotCQl7IHByb2Nlc3NvckJsb2NrICwgYXR0cmlidXRlc0Jsb2NrLCBvdXRwdXRQcm9wZXJ0aWVzQmxvY2sgfSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KQotCXsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCQlDb21wb3NpdGUgY29tcCA9IChDb21wb3NpdGUpIGdldENvbnRyb2woKTsKLQotCQlwcm9jZXNzb3JCbG9jay5jcmVhdGVDb250cm9sKGNvbXApOwotCQkKLQkJVGFiRm9sZGVyIHRhYkZvbGRlciA9IG5ldyBUYWJGb2xkZXIoY29tcCxTV1QuTk9ORSk7Ci0JCXRhYkZvbGRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCxTV1QuRklMTCx0cnVlLHRydWUpKTsKLQotCQlvdXRwdXRQcm9wZXJ0aWVzQmxvY2suY3JlYXRlQ29udHJvbCh0YWJGb2xkZXIpOwkJCi0JCWF0dHJpYnV0ZXNCbG9jay5jcmVhdGVDb250cm9sKHRhYkZvbGRlcik7CQkKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwZXJmb3JtQXBwbHkoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uKQotCXsKLQkJc3VwZXIucGVyZm9ybUFwcGx5KGNvbmZpZ3VyYXRpb24pOwotCQlJUHJvY2Vzc29ySW52b2tlciBpbnZva2VyID0gSkFYUFJ1bnRpbWUuZ2V0UHJvY2Vzc29ySW52b2tlcnMoKVswXTsKLQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoSkFYUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuSU5WT0tFUl9ERVNDUklQVE9SLCBpbnZva2VyLmdldElkKCkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQlyZXR1cm4gTWVzc2FnZXMuZ2V0U3RyaW5nKCJYU0xQcm9jZXNzb3JUYWIuMCIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKQotCXsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpLmpheHAudGFicy5wcm9jZXNzb3IiOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpCi0JewotCQlpZiAoaW1hZ2UgPT0gbnVsbCkKLQkJewotCQkJSW1hZ2VEZXNjcmlwdG9yIGlkID0gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKEpBWFBEZWJ1Z1VJUGx1Z2luLlBMVUdJTl9JRCwgImljb25zL3hzbHRfcHJvY2Vzc29yLmdpZiIpOwotCQkJaW1hZ2UgPSBpZC5jcmVhdGVJbWFnZSgpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLQl7Ci0JCWlmIChpbWFnZSAhPSBudWxsKQotCQkJaW1hZ2UuZGlzcG9zZSgpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9kZWJ1Zy91aS9pbnRlcm5hbC90YWJzL3Byb2Nlc3Nvci9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9kZWJ1Zy91aS9pbnRlcm5hbC90YWJzL3Byb2Nlc3Nvci9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2ViZWY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvZGVidWcvdWkvaW50ZXJuYWwvdGFicy9wcm9jZXNzb3IvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLUF0dHJpYnV0ZXNCbG9jay4xPUNoYW5nZSBQcmVmZXJlbmNlcy4uLgotQXR0cmlidXRlc0Jsb2NrLjEwPXR5cGUKLUF0dHJpYnV0ZXNCbG9jay4xMT12YWx1ZQotQXR0cmlidXRlc0Jsb2NrLjEyPXZhbHVlCi1BdHRyaWJ1dGVzQmxvY2suMTY9UHJvY2Vzc29yIEF0dHJpYnV0ZXMKLUF0dHJpYnV0ZXNCbG9jay4zPVVzZSBzcGVjaWZpYyBhdHRyaWJ1dGVzCi1BdHRyaWJ1dGVzQmxvY2suND1BdHRyaWJ1dGUKLUF0dHJpYnV0ZXNCbG9jay41PVR5cGUKLUF0dHJpYnV0ZXNCbG9jay42PVZhbHVlCi1BdHRyaWJ1dGVzQmxvY2suOT1uYW1lCi1YU0xQcm9jZXNzb3JUYWIuMD1Qcm9jZXNzb3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvZGVidWcvdWkvaW50ZXJuYWwvdmlld3MvUmVzdWx0Vmlldy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9kZWJ1Zy91aS9pbnRlcm5hbC92aWV3cy9SZXN1bHRWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMzk1YmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9kZWJ1Zy91aS9pbnRlcm5hbC92aWV3cy9SZXN1bHRWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLnVpLmludGVybmFsLnZpZXdzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSURlYnVnRXZlbnRTZXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklEZWJ1Z1RhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLklXb3JrYmVuY2hTaXRlUHJvZ3Jlc3NTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5MaW5lU3R5bGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLlhTTERlYnVnVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5tb2RlbC5KQVhQRGVidWdUYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25YU0w7Ci0KLS8qKgotICogVE9ETyBoYW5kbGUgbXVsdGlwbGUgY29uY3VycmVudCBkZWJ1Z2dpbmcgcHJvY2Vzc2VzIChhbmQgYnJpbmcgdGhlIGN1cnJlbnQgcmVzdWx0cyB0byB0aGUgdG9wIGRlcGVuZGluZyBvbiB3aGljaCBzZWxlY3RlZCBpbiBEZWJ1ZyB2aWV3KQotICogCi0gKiBAYXV0aG9yIERvdWcgU2F0Y2h3ZWxsCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXN1bHRWaWV3IGV4dGVuZHMgVmlld1BhcnQgaW1wbGVtZW50cyBJRGVidWdFdmVudFNldExpc3RlbmVyCi17Ci0JcHJpdmF0ZSBTb3VyY2VWaWV3ZXIgc3Y7Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLQl7Ci0JCURlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5yZW1vdmVEZWJ1Z0V2ZW50TGlzdGVuZXIodGhpcyk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KQotCXsKLQkJdGhpcy5zdiA9IGNyZWF0ZVZpZXdlcihwYXJlbnQpOwotCQkKLQkJLy8gaGFuZGxlIGFueSBsYXVuY2hlcyBhbHJlYWR5IGFkZGVkCi0JCUlEZWJ1Z1RhcmdldFtdIHRhcmdldHMgPSBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGF1bmNoTWFuYWdlcigpLmdldERlYnVnVGFyZ2V0cygpOwotCQlmb3IgKElEZWJ1Z1RhcmdldCBkZWJ1Z1RhcmdldCA6IHRhcmdldHMpCi0JCXsKLQkJCWlmIChkZWJ1Z1RhcmdldCBpbnN0YW5jZW9mIEpBWFBEZWJ1Z1RhcmdldCkKLQkJCXsKLQkJCQloYW5kbGVEZWJ1Z1RhcmdldCgoSkFYUERlYnVnVGFyZ2V0KWRlYnVnVGFyZ2V0KTsKLQkJCX0JCQkKLQkJfQotCQkvLyBsaXN0ZW4gdG8gZnVydGhlciBsYXVuY2hlcwotCQlEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuYWRkRGVidWdFdmVudExpc3RlbmVyKHRoaXMpOwotCX0KLQotCXByaXZhdGUgU291cmNlVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KQotCXsKLQkJU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiBzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbigpIHsKLQkJCVN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBiYXNlQ29uZmlndXJhdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25YU0woKTsKLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nW10gZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQkJCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbi5nZXRDb25maWd1cmVkQ29udGVudFR5cGVzKHNvdXJjZVZpZXdlcik7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIExpbmVTdHlsZVByb3ZpZGVyW10gZ2V0TGluZVN0eWxlUHJvdmlkZXJzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQkJCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbi5nZXRMaW5lU3R5bGVQcm92aWRlcnMoc291cmNlVmlld2VyLCBwYXJ0aXRpb25UeXBlKTsKLQkJCX0KLQkJfTsKLQkJU291cmNlVmlld2VyIHZpZXdlciA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlcihwYXJlbnQsIG51bGwsIG51bGwsIGZhbHNlLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQkJKChTdHJ1Y3R1cmVkVGV4dFZpZXdlcikgdmlld2VyKS5nZXRUZXh0V2lkZ2V0KCkuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXRGb250KCJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRleHRmb250IikpOyAvLyROT04tTkxTLTEkCi0JCXZpZXdlci5jb25maWd1cmUoc291cmNlVmlld2VyQ29uZmlndXJhdGlvbik7Ci0JCXZpZXdlci5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKQotCXt9Ci0KLQlwdWJsaWMgdm9pZCBoYW5kbGVEZWJ1Z0V2ZW50cyhEZWJ1Z0V2ZW50W10gZXZlbnRzKQotCXsKLQkJZm9yIChEZWJ1Z0V2ZW50IGRlYnVnRXZlbnQgOiBldmVudHMpCi0JCXsKLQkJCWlmIChkZWJ1Z0V2ZW50LmdldEtpbmQoKSA9PSBEZWJ1Z0V2ZW50LkNSRUFURSAmJiBkZWJ1Z0V2ZW50LmdldFNvdXJjZSgpIGluc3RhbmNlb2YgSkFYUERlYnVnVGFyZ2V0KQotCQkJewotCQkJCWhhbmRsZURlYnVnVGFyZ2V0KChKQVhQRGVidWdUYXJnZXQpZGVidWdFdmVudC5nZXRTb3VyY2UoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZURlYnVnVGFyZ2V0KEpBWFBEZWJ1Z1RhcmdldCB4ZHQpCi0JewotCQkvLyBmaXJzdCwgY2xlYXIgdGhlIHZpZXdlcgotCQlzdi5zZXREb2N1bWVudChudWxsKTsKLQkJCi0JCWZpbmFsIFJlYWRlciByZWFkZXIgPSB4ZHQuZ2V0R2VuZXJhdGVSZWFkZXIoKTsKLQkJSVdvcmtiZW5jaFNpdGVQcm9ncmVzc1NlcnZpY2Ugc2VydmljZSA9IChJV29ya2JlbmNoU2l0ZVByb2dyZXNzU2VydmljZSlnZXRTaXRlKCkuZ2V0U2VydmljZShJV29ya2JlbmNoU2l0ZVByb2dyZXNzU2VydmljZS5jbGFzcyk7Ci0JCXNlcnZpY2Uuc2NoZWR1bGUobmV3IEpvYigiUmVzdWx0IHZpZXcgam9iIil7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJdHJ5Ci0JCQkJewotCQkJCQljaGFyW10gYyA9IG5ldyBjaGFyWzgxOTJdOyAvLyB0aGlzIGlzIHRoZSBkZWZhdWx0IEJ1ZmZlcmVkV3JpdGVyIHNpemUsIHNvIHdlIHdpbGwgdXN1YWxseSBnZXQgY2h1bmtzIG9mIHRoaXMgc2l6ZQotCQkJCQlpbnQgc2l6ZTsKLQkJCQkJd2hpbGUoKHNpemUgPSByZWFkZXIucmVhZChjKSkgIT0gLTEpCi0JCQkJCXsKLQkJCQkJCXdyaXRlU3RyaW5nKG5ldyBTdHJpbmcoYywwLHNpemUpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkKLQkJCQl7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCX0KLQkJCQlmaW5hbGx5Ci0JCQkJewotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN0YXR1czsKLQkJCX0KLQkJCQotCQkJcHJpdmF0ZSB2b2lkIHdyaXRlU3RyaW5nKGZpbmFsIFN0cmluZyBzKQotCQkJewotCQkJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKXsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKQotCQkJCQl7Ci0JCQkJCQkvLyBpZiB0aGlzIGlzIHRoZSBmaXJzdCBsb3Qgb2YgZGF0YSwgZGV0ZXJtaW5lIHRoZSBjb3JyZWN0IGNvbnRlbnQgdHlwZSBhbmQgc2V0IHRoZSBhcHByb3ByaWF0ZSBkb2N1bWVudAotCQkJCQkJaWYgKHN2LmdldERvY3VtZW50KCkgID09IG51bGwpCi0JCQkJCQl7Ci0JCQkJCQkJSURvY3VtZW50IGRvY3VtZW50OwotCQkJCQkJCWlmIChzLnN0YXJ0c1dpdGgoIjwhRE9DVFlQRSBodG1sIikpCi0JCQkJCQkJewotCQkJCQkJCQlTdHJpbmcgY29udGVudFR5cGUgPSAib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIjsKLQkJCQkJCQkJSVN0cnVjdHVyZWRNb2RlbCBzY3JhdGNoTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmNyZWF0ZVVuTWFuYWdlZFN0cnVjdHVyZWRNb2RlbEZvcihjb250ZW50VHlwZSk7Ci0JCQkJCQkJCWRvY3VtZW50ID0gc2NyYXRjaE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIGlmIChzLnN0YXJ0c1dpdGgoIjw/eG1sIikpCi0JCQkJCQkJewotCQkJCQkJCQlTdHJpbmcgY29udGVudFR5cGUgPSAib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCI7Ci0JCQkJCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgc2NyYXRjaE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5jcmVhdGVVbk1hbmFnZWRTdHJ1Y3R1cmVkTW9kZWxGb3IoY29udGVudFR5cGUpOwotCQkJCQkJCQlkb2N1bWVudCA9IHNjcmF0Y2hNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZQotCQkJCQkJCXsKLQkJCQkJCQkJLy8gVE9ETyBob3cgdG8gY3JlYXRlIGEgcGxhaW4gdGV4dCBEb2N1bWVudD8/Ci0JCQkJCQkJCWRvY3VtZW50ID0gbnVsbDsKLQkJCQkJCQl9Ci0JCQkJCQkJc3Yuc2V0RG9jdW1lbnQoZG9jdW1lbnQpOwotCQkJCQkJfQotCQkJCQkJdHJ5Ci0JCQkJCQl7Ci0JCQkJCQkJc3YuZ2V0RG9jdW1lbnQoKS5yZXBsYWNlKHN2LmdldERvY3VtZW50KCkuZ2V0TGVuZ3RoKCksIDAsIHMpOwotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpCi0JCQkJCQl7Ci0JCQkJCQkJWFNMRGVidWdVSVBsdWdpbi5sb2coZSk7Ci0JCQkJCQl9Ci0JCQkJCQlzdi5yZXZlYWxSYW5nZShzdi5nZXREb2N1bWVudCgpLmdldExlbmd0aCgpLDApOwotCQkJCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuYWN0aXZhdGUoUmVzdWx0Vmlldy50aGlzKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmJiN2EyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYzNThjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1ZzwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLmFwaS50b29scy5hcGlBbmFseXNpc0J1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLmFwaS50b29scy5hcGlBbmFseXNpc05hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTE1ZjE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSNUdWUgRmViIDEwIDA1OjI2OjExIEdNVCAyMDA5Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFncz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnRGVzY3JpcHRpb249cmV0dXJuX3RhZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZGQ4MjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAldmVuZG9yTmFtZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmc7YnVuZGxlLXZlcnNpb249IjEuMC40Ijt2aXNpYmlsaXR5Oj1yZWV4cG9ydAotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy5kZWJ1Z2dlciwKLSBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcuaW52b2tlcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQzMDAwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+QXVndXN0LCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTQ0Njc0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGUwY2EwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jUHJvcGVydGllcyBmaWxlIGZvciBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcKLXZlbmRvck5hbWUgPSBFY2xpcHNlLm9yZwotcGx1Z2luTmFtZSA9IFhTTCBKQVhQIERlYnVnZ2VyIChJbmN1YmF0aW5nKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnL3NyYy9sb2c0ai5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcvc3JjL2xvZzRqLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5YmI1NTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcvc3JjL2xvZzRqLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0jIFNldCByb290IGxvZ2dlciBsZXZlbCB0byBERUJVRyBhbmQgaXRzIGFwcGVuZGVycyBhcmUgQTEgYW5kIEEyCi1sb2c0ai5yb290TG9nZ2VyPURFQlVHLCBBMgotCi0jIEEyIGlzIHNldCB0byBiZSBhIENvbnNvbGVBcHBlbmRlcgotbG9nNGouYXBwZW5kZXIuQTI9b3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXIKLQotIyBBMiB1c2VzIFBhdHRlcm5MYXlvdXQuCi1sb2c0ai5hcHBlbmRlci5BMi5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0Ci1sb2c0ai5hcHBlbmRlci5BMi5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49JWR7SEg6bW06c3MsU1NTfSAlLTVwIFsldF0gJWN7MX0gJXggLSAlbSVuCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvZGVidWcvZGVidWdnZXIvQWJzdHJhY3REZWJ1Z2dlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9kZWJ1Zy9kZWJ1Z2dlci9BYnN0cmFjdERlYnVnZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwOTk5MDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9kZWJ1Zy9kZWJ1Z2dlci9BYnN0cmFjdERlYnVnZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLmRlYnVnZ2VyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy5pbnZva2VyLklQcm9jZXNzb3JJbnZva2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy5pbnZva2VyLlRyYW5zZm9ybWF0aW9uRXhjZXB0aW9uOwotCi0vKioKLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPklYU0xEZWJ1Z2dlcjwvY29kZT4uCi0gKiAKLSAqIFRoaXMgY2xhc3MgY2FuIGJlIHN1YmNsYXNzZWQgaW4gb3JkZXIgdG8gcHJvdmlkZSBkZWJ1Z2dpbmcgZm9yIGEgcGFydGljdWxhciBYU0xUIHByb2Nlc3Nvci4KLSAqIAotICogQGF1dGhvciBEb3VnIFNhdGNod2VsbAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REZWJ1Z2dlciBpbXBsZW1lbnRzIElYU0xEZWJ1Z2dlcgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhBYnN0cmFjdERlYnVnZ2VyLmNsYXNzKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBQ1RJT05fRE9fTk9USElORyA9IDA7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFDVElPTl9TVE9QID0gMTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX1FVSVQgPSAyOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBQ1RJT05fU1VTUEVORCA9IDM7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFDVElPTl9SRVNVTUUgPSA0OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBQ1RJT05fU1RFUF9JTlRPID0gNTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX1NURVBfT1ZFUiA9IDY7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFDVElPTl9TVEVQX1JFVFVSTiA9IDc7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZFTlRfU1RBUlRFRCA9ICJzdGFydGVkIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFVkVOVF9TVE9QUEVEID0gInN0b3BwZWQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVWRU5UX1NVU1BFTkRFRCA9ICJzdXNwZW5kZWQgY2xpZW50IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFVkVOVF9TVVNQRU5ERURfU1RFUCA9ICJzdXNwZW5kZWQgc3RlcCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZFTlRfUkVTVU1FRCA9ICJyZXN1bWVkIGNsaWVudCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZFTlRfUkVTVU1FRF9TVEVQID0gInJlc3VtZWQgc3RlcCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSVByb2Nlc3Nvckludm9rZXIgaW52b2tlcjsKLQlwcml2YXRlIGludCBhY3Rpb247Ci0JcHJpdmF0ZSBXcml0ZXIgZXZlbnRXcml0ZXI7Ci0JcHJpdmF0ZSBXcml0ZXIgZ2VuZXJhdGVkV3JpdGVyOwotCXByaXZhdGUgZmluYWwgU2V0IGJyZWFrcG9pbnRzID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkU2V0KG5ldyBIYXNoU2V0KCkpOwotCXByaXZhdGUgZmluYWwgU3RhY2sgc3RhY2sgPSBuZXcgU3RhY2soKTsKLQlwcml2YXRlIFN0eWxlRnJhbWUgc3RlcE92ZXJGcmFtZTsKLQlwcml2YXRlIEJyZWFrUG9pbnQgYnJlYWtwb2ludDsKLQlwcml2YXRlIFVSTCBzb3VyY2VVUkw7Ci0JcHJpdmF0ZSBSZXN1bHQgcmVzdWx0OwotCi0JcHJpdmF0ZSBpbnQgc3RlcE92ZXJTdGFja1NpemU7Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbnZva2VyKElQcm9jZXNzb3JJbnZva2VyIGludm9rZXIpCi0JewotCQl0aGlzLmludm9rZXIgPSBpbnZva2VyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEV2ZW50V3JpdGVyKFdyaXRlciB3cml0ZXIpCi0JewotCQlldmVudFdyaXRlciA9IHdyaXRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZWRXcml0ZXIoV3JpdGVyIHdyaXRlcikKLQl7Ci0JCXRoaXMuZ2VuZXJhdGVkV3JpdGVyID0gd3JpdGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNvdXJjZShVUkwgc291cmNlVVJMKQotCXsKLQkJdGhpcy5zb3VyY2VVUkwgPSBzb3VyY2VVUkw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0KGZpbmFsIFdyaXRlciB3cml0ZXIpCi0JewotCQlyZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KG5ldyBXcml0ZXIoKXsKLQkJCXB1YmxpYyB2b2lkIHdyaXRlKGNoYXJbXSBjYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24KLQkJCXsKLQkJCQl3cml0ZXIud3JpdGUoY2J1Ziwgb2ZmLCBsZW4pOwotCQkJCWdlbmVyYXRlZFdyaXRlci53cml0ZShjYnVmLG9mZixsZW4pOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbgotCQkJewotCQkJCXdyaXRlci5jbG9zZSgpOwotCQkJCWdlbmVyYXRlZFdyaXRlci5jbG9zZSgpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbgotCQkJewotCQkJCXdyaXRlci5mbHVzaCgpOwotCQkJCWdlbmVyYXRlZFdyaXRlci5mbHVzaCgpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKQotCXsKLQkJaWYgKGFjdGlvbiAhPSBBQ1RJT05fUVVJVCkKLQkJewotCQkJZGVidWdnZXJTdGFydGVkKCk7Ci0JCQl0cnkKLQkJCXsKLQkJCQlpbnZva2VyLnRyYW5zZm9ybShzb3VyY2VVUkwsIHJlc3VsdCk7Ci0JCQl9Ci0JCQljYXRjaCAoVHJhbnNmb3JtYXRpb25FeGNlcHRpb24gZSkKLQkJCXsKLQkJCQlsb2cuZXJyb3IoIlRyYW5zZm9ybSBmYWlsZWQiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZGVidWdnZXJTdG9wcGVkKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3VzcGVuZCgpCi0JewotCQlhY3Rpb24gPSBBQ1RJT05fU1VTUEVORDsKLQkJbm90aWZ5KCk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlc3VtZSgpCi0JewotCQlhY3Rpb24gPSBBQ1RJT05fUkVTVU1FOwotCQlub3RpZnkoKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RlcEludG8oKQotCXsKLQkJYWN0aW9uID0gQUNUSU9OX1NURVBfSU5UTzsKLQkJbm90aWZ5KCk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0ZXBPdmVyKCkKLQl7Ci0JCWFjdGlvbiA9IEFDVElPTl9TVEVQX09WRVI7Ci0JCXN0ZXBPdmVyRnJhbWUgPSBwZWVrU3R5bGVGcmFtZSgpOwotCQlzdGVwT3ZlclN0YWNrU2l6ZSA9IHN0YWNrLnNpemUoKTsKLQkJbm90aWZ5KCk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0ZXBSZXR1cm4oKQotCXsKLQkJYWN0aW9uID0gQUNUSU9OX1NURVBfUkVUVVJOOwotCQlzdGVwT3ZlclN0YWNrU2l6ZSA9IHN0YWNrLnNpemUoKTsKLQkJbm90aWZ5KCk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHF1aXQoKQotCXsKLQkJYWN0aW9uID0gQUNUSU9OX1FVSVQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBzdGFjaygpCi0JewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXN5bmNocm9uaXplZCAoc3RhY2spCi0JCXsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHN0YWNrLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLQkJCXsKLQkJCQlTdHlsZUZyYW1lIGZyYW1lID0gKFN0eWxlRnJhbWUpIGl0ZXIubmV4dCgpOwotCQkJCXNiLmFwcGVuZChmcmFtZS50b1N0cmluZygpKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIyID0gZnJhbWUuZ2V0VmFyaWFibGVTdGFjaygpLml0ZXJhdG9yKCk7IGl0ZXIyLmhhc05leHQoKTspCi0JCQkJewotCQkJCQlzYi5hcHBlbmQoInwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlWYXJpYWJsZSB2ID0gKFZhcmlhYmxlKSBpdGVyMi5uZXh0KCk7Ci0JCQkJCXNiLmFwcGVuZCh2LmdldElkKCkpOwotCQkJCX0KLQkJCQlpZiAoaXRlci5oYXNOZXh0KCkpCi0JCQkJCXNiLmFwcGVuZCgiJCQkIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayB3aGV0aGVyIHRoZSBkZWJ1Z2dlciBoYXMgYmVlbiBzdG9wcGVkIGFuZCBwZXJmb3JtIHRoZSBhcHByb3ByaWF0ZSBhY3Rpb24gaWYgc28uCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNoZWNrU3RvcHBlZCgpCi0JewotCQlpZiAoYWN0aW9uID09IEFDVElPTl9RVUlUKQotCQkJZGVidWdnZXJRdWl0KCk7Ci0JCWVsc2UgaWYgKGFjdGlvbiA9PSBBQ1RJT05fU1RPUCkKLQkJCWRlYnVnZ2VyU3RvcHBlZCgpOwotCX0KLQotCS8qKgotCSAqIENoZWNrIHdoZXRoZXIgdGhlIGRlYnVnZ2VyIGlzIGN1cnJlbnRseSBzdXNwZW5kZWQgb3Igc3RlcHBpbmcgYXQgdGhlIGdpdmVuIGJyZWFrcG9pbnQgYW5kIHN0eWxlIGZyYW1lLCAKLQkgKiBhbmQgcGVyZm9ybSB0aGUgYXBwcm9wcmlhdGUgYWN0aW9uIGlmIHNvLgotCSAqIAotCSAqIEBwYXJhbSBzdHlsZUZyYW1lIHRoZSBzdHlsZWZyYW1lIHRvIGNoZWNrCi0JICogQHBhcmFtIGJyZWFrcG9pbnQgdGhlIGN1cnJlbnQgbG9jYXRpb24KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2hlY2tTdXNwZW5kZWQoU3R5bGVGcmFtZSBzdHlsZUZyYW1lLCBCcmVha1BvaW50IGJyZWFrcG9pbnQpCi0JewotCQkvLyBkbyBub3Qgc3VzcGVuZCB1bmxlc3MgdGhlIGxpbmUgYWN0dWFsbHkgY2hhbmdlZAotCQlpZiAoYnJlYWtwb2ludC5lcXVhbHModGhpcy5icmVha3BvaW50KSkKLQkJCXJldHVybjsKLQkJaW50IHN0YWNrU2l6ZTsKLQkJc3luY2hyb25pemVkIChzdGFjaykKLQkJewotCQkJc3RhY2tTaXplID0gc3RhY2suc2l6ZSgpOwotCQl9Ci0JCS8vIGRvIG5vdCBzdXNwZW5kIGlmIHRoZXJlIGlzIG5vdGhpbmcgaW4gdGhlIHN0YWNrCi0JCWlmIChzdGFja1NpemUgPT0gMCkKLQkJCXJldHVybjsKLQkJc3dpdGNoIChhY3Rpb24pCi0JCXsKLQkJCWNhc2UgQUNUSU9OX1NVU1BFTkQ6Ci0JCQkJZGVidWdnZXJTdXNwZW5kZWRDbGllbnQoYnJlYWtwb2ludCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEFDVElPTl9TVEVQX09WRVI6Ci0JCQkJLy8gc3VzcGVuZCBpZiB3ZSBhcmUgaW4gdGhlIHNhbWUgdGVtcGxhdGUgb3Igd2UgYXJlIG1vdmluZyB1cCB0aGUgc3RhY2sKLQkJCQlpZiAoc3R5bGVGcmFtZS5lcXVhbHMoc3RlcE92ZXJGcmFtZSkgfHwgc3RhY2tTaXplIDwgc3RlcE92ZXJTdGFja1NpemUpCi0JCQkJCWRlYnVnZ2VyU3VzcGVuZGVkU3RlcChicmVha3BvaW50KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQUNUSU9OX1NURVBfSU5UTzoKLQkJCQlkZWJ1Z2dlclN1c3BlbmRlZFN0ZXAoYnJlYWtwb2ludCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEFDVElPTl9TVEVQX1JFVFVSTjoKLQkJCQkvLyBzdXNwZW5kIGlmIHdlIG1vdmVkIHVwIHRoZSBzdGFjawotCQkJCWlmIChzdGFja1NpemUgPCBzdGVwT3ZlclN0YWNrU2l6ZSkKLQkJCQkJZGVidWdnZXJTdXNwZW5kZWRTdGVwKGJyZWFrcG9pbnQpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQljaGVja0JyZWFrcG9pbnQoYnJlYWtwb2ludCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGNoZWNrQnJlYWtwb2ludChCcmVha1BvaW50IGJyZWFrcG9pbnQpCi0JewotCQlpZiAoaXNCcmVha3BvaW50KGJyZWFrcG9pbnQpKQotCQkJZGVidWdnZXJTdXNwZW5kZWRCcmVha3BvaW50KGJyZWFrcG9pbnQpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBuZXh0IHRyYW5zZm9ybSBpbiB0aGUgcGlwZWxpbmUgaGFzIGJlZ3VuLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBkZWJ1Z2dlclRyYW5zZm9ybVN0YXJ0ZWQoKQotCXsKLQkJc3RhY2suY2xlYXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgZGVidWdnZXJTdGFydGVkKCkKLQl7Ci0JCWFjdGlvbiA9IEFDVElPTl9ET19OT1RISU5HOwotCQlzZW5kRXZlbnQoRVZFTlRfU1RBUlRFRCk7Ci0JfQotCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGRlYnVnZ2VyU3RvcHBlZCgpCi0JewotCQlhY3Rpb24gPSBBQ1RJT05fRE9fTk9USElORzsKLQkJc2VuZEV2ZW50KEVWRU5UX1NUT1BQRUQpOwotCX0KLQotCXByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgZGVidWdnZXJRdWl0KCkKLQl7Ci0JCS8vIGp1c3Qgd2FpdCBoZXJlIGluZGVmaW5pdGVseSB1bnRpbCB0aGUgSlZNIGV4aXN0cywganVzdCB0byBtYWtlIHN1cmUKLQkJLy8gd2UgZG9uJ3Qgc2VuZCBhbnkgZnVydGhlciBldmVudHMKLQkJdHJ5Ci0JCXsKLQkJCXdhaXQoKTsKLQkJfQotCQljYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkKLQkJewotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBkZWJ1Z2dlclN1c3BlbmRlZEJyZWFrcG9pbnQoQnJlYWtQb2ludCBicmVha3BvaW50KQotCXsKLQkJc2VuZEV2ZW50KCJzdXNwZW5kZWQgYnJlYWtwb2ludCAiICsgYnJlYWtwb2ludCk7IC8vJE5PTi1OTFMtMSQKLQkJZGVidWdnZXJTdXNwZW5kZWQoYnJlYWtwb2ludCk7Ci0JfQotCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBkZWJ1Z2dlclN1c3BlbmRlZFN0ZXAoQnJlYWtQb2ludCBicmVha3BvaW50KQotCXsKLQkJc2VuZEV2ZW50KEVWRU5UX1NVU1BFTkRFRF9TVEVQKTsKLQkJZGVidWdnZXJTdXNwZW5kZWQoYnJlYWtwb2ludCk7Ci0JfQotCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBkZWJ1Z2dlclN1c3BlbmRlZENsaWVudChCcmVha1BvaW50IGJyZWFrcG9pbnQpCi0JewotCQlzZW5kRXZlbnQoRVZFTlRfU1VTUEVOREVEKTsKLQkJZGVidWdnZXJTdXNwZW5kZWQoYnJlYWtwb2ludCk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGRlYnVnZ2VyU3VzcGVuZGVkKEJyZWFrUG9pbnQgYnJlYWtwb2ludCkKLQl7Ci0JCXRoaXMuYnJlYWtwb2ludCA9IGJyZWFrcG9pbnQ7Ci0JCWRvCi0JCXsKLQkJCXRyeQotCQkJewotCQkJCXdhaXQoKTsKLQkJCX0KLQkJCWNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKQotCQkJewotCQkJfQotCQl9Ci0JCXdoaWxlIChhY3Rpb24gIT0gQUNUSU9OX1JFU1VNRSAmJiBhY3Rpb24gIT0gQUNUSU9OX1NURVBfSU5UTyAmJiBhY3Rpb24gIT0gQUNUSU9OX1NURVBfT1ZFUiAmJiBhY3Rpb24gIT0gQUNUSU9OX1NURVBfUkVUVVJOICYmIGFjdGlvbiAhPSBBQ1RJT05fU1RPUCk7Ci0JCWRlYnVnZ2VyUmVzdW1lZCgpOwotCX0KLQotCXByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgZGVidWdnZXJSZXN1bWVkKCkKLQl7Ci0JCWlmIChhY3Rpb24gPT0gQUNUSU9OX1NURVBfSU5UTyB8fCBhY3Rpb24gPT0gQUNUSU9OX1NURVBfT1ZFUiB8fCBhY3Rpb24gPT0gQUNUSU9OX1NURVBfUkVUVVJOKQotCQkJc2VuZEV2ZW50KEVWRU5UX1JFU1VNRURfU1RFUCk7Ci0JCWVsc2UKLQkJCXNlbmRFdmVudChFVkVOVF9SRVNVTUVEKTsKLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHNlbmRFdmVudChTdHJpbmcgZXZlbnQpCi0JewotCQl0cnkKLQkJewotCQkJbG9nLmluZm8oIlNlbmRpbmcgZXZlbnQ6ICIgKyBldmVudCsiIGV2ZW50V3JpdGVyPSIrZXZlbnRXcml0ZXIpOyAgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJCWV2ZW50V3JpdGVyLndyaXRlKGV2ZW50ICsgIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCWV2ZW50V3JpdGVyLmZsdXNoKCk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0JCXsKLQkJCWxvZy5lcnJvcigiRXJyb3Igc2VuZGluZyBldmVudCIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRCcmVha3BvaW50KEJyZWFrUG9pbnQgYnJlYWtwb2ludCkKLQl7Ci0JCWxvZy5pbmZvKCJBZGRpbmcgYnJlYWtwb2ludDogIiArIGJyZWFrcG9pbnQpOyAvLyROT04tTkxTLTEkCi0JCWJyZWFrcG9pbnRzLmFkZChicmVha3BvaW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVCcmVha3BvaW50KEJyZWFrUG9pbnQgYnJlYWtwb2ludCkKLQl7Ci0JCWxvZy5pbmZvKCJSZW1vdmluZyBicmVha3BvaW50OiAiICsgYnJlYWtwb2ludCk7IC8vJE5PTi1OTFMtMSQKLQkJYnJlYWtwb2ludHMucmVtb3ZlKGJyZWFrcG9pbnQpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0JyZWFrcG9pbnQoQnJlYWtQb2ludCBicmVha3BvaW50KQotCXsKLQkJLy8gZG8gbm90IGNoZWNrIGZvciBicmVha3BvaW50IHVubGVzcyB0aGUgbGluZSBvciBmaWxlbmFtZSBhY3R1YWxseSBjaGFuZ2VkCi0JCWlmIChicmVha3BvaW50LmVxdWFscyh0aGlzLmJyZWFrcG9pbnQpKQotCQkJcmV0dXJuIGZhbHNlOwotCQl0aGlzLmJyZWFrcG9pbnQgPSBudWxsOwotCQlyZXR1cm4gYnJlYWtwb2ludHMuY29udGFpbnMoYnJlYWtwb2ludCk7Ci0JfQotCQotCS8qKgotCSAqIFBvcCBhIHN0eWxlIGZyYW1lIGZyb20gdGhlIHN0YWNrLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHBvcHBlZCBzdHlsZSBmcmFtZQotCSAqLwotCXB1YmxpYyBTdHlsZUZyYW1lIHBvcFN0eWxlRnJhbWUoKQotCXsKLQkJc3luY2hyb25pemVkIChzdGFjaykKLQkJewotCQkJU3R5bGVGcmFtZSBzdHlsZUZyYW1lID0gKFN0eWxlRnJhbWUpIHN0YWNrLnBvcCgpOwotCQkJaWYgKHN0eWxlRnJhbWUuZ2V0UGFyZW50KCkgIT0gbnVsbCkKLQkJCQlzdHlsZUZyYW1lLmdldFBhcmVudCgpLnJlbW92ZUNoaWxkKHN0eWxlRnJhbWUpOwotCQkJbG9nLnRyYWNlKCJQb3BwZWQgZnJhbWU6ICIgKyBzdHlsZUZyYW1lICsgIiAoc2l6ZSBhZnRlciBwb3A9IiArIHN0YWNrLnNpemUoKSArICIpIik7ICAgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTMkCi0JCQlyZXR1cm4gc3R5bGVGcmFtZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFB1c2ggYSBzdHlsZSBmcmFtZSBvbnRvIHRoZSBzdGFjay4KLQkgKiAKLQkgKiBAcGFyYW0gc3R5bGVGcmFtZQotCSAqLwotCXB1YmxpYyB2b2lkIHB1c2hTdHlsZUZyYW1lKFN0eWxlRnJhbWUgc3R5bGVGcmFtZSkKLQl7Ci0JCXN5bmNocm9uaXplZCAoc3RhY2spCi0JCXsKLQkJCXN0YWNrLnB1c2goc3R5bGVGcmFtZSk7Ci0JCQlsb2cudHJhY2UoIlB1c2hlZCBmcmFtZTogIiArIHN0eWxlRnJhbWUgKyAiIChzaXplIGFmdGVyIHB1c2g9IiArIHN0YWNrLnNpemUoKSArICIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQZWVrIGEgc3R5bGUgZnJhbWUgZnJvbSB0aGUgc3RhY2suCi0JICogCi0JICogQHJldHVybiB0aGUgcGVla2VkIHN0eWxlIGZyYW1lCi0JICovCi0JcHVibGljIFN0eWxlRnJhbWUgcGVla1N0eWxlRnJhbWUoKQotCXsKLQkJc3luY2hyb25pemVkIChzdGFjaykKLQkJewotCQkJaWYgKHN0YWNrLnNpemUoKSA+IDApCi0JCQkJcmV0dXJuIChTdHlsZUZyYW1lKSBzdGFjay5wZWVrKCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2RlYnVnL2RlYnVnZ2VyL0JyZWFrUG9pbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvZGVidWcvZGVidWdnZXIvQnJlYWtQb2ludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjYwMDBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvZGVidWcvZGVidWdnZXIvQnJlYWtQb2ludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLmRlYnVnZ2VyOwotCi0vKioKLSAqIEEgbGluZSBudW1iZXIgaW4gYSBmaWxlLgotICogCi0gKiBAYXV0aG9yIERvdWcgU2F0Y2h3ZWxsCi0gKi8KLXB1YmxpYyBjbGFzcyBCcmVha1BvaW50Ci17Ci0JcHJpdmF0ZSBTdHJpbmcgZmlsZTsKLQlwcml2YXRlIGZpbmFsIGludCBsaW5lOwotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgZm9yIHRoZSBnaXZlbiBmaWxlIGFuZCBsaW5lIG51bWJlci4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZSB0aGUgZmlsZSBwYXRoCi0JICogQHBhcmFtIGxpbmUgdGhlIGxpbmUgbnVtYmVyCi0JICovCi0JcHVibGljIEJyZWFrUG9pbnQoU3RyaW5nIGZpbGUsIGludCBsaW5lKQotCXsKLQkJdGhpcy5maWxlID0gZmlsZTsKLQkJdGhpcy5saW5lID0gbGluZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGZpbGUgbG9jYXRpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgZmlsZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZSgpCi0JewotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGxpbmUgbnVtYmVyCi0JICogCi0JICogQHJldHVybiB0aGUgbGluZSBudW1iZXIKLQkgKi8KLQlwdWJsaWMgaW50IGdldExpbmUoKQotCXsKLQkJcmV0dXJuIGxpbmU7Ci0JfQotCi0JcHVibGljIGludCBoYXNoQ29kZSgpCi0JewotCQlpbnQgaGFzaCA9IDMgKiBmaWxlLmhhc2hDb2RlKCkgKyA1ICogbGluZTsKLQkJcmV0dXJuIGhhc2g7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopCi0JewotCQlpZiAob2JqID09IHRoaXMpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEJyZWFrUG9pbnQpCi0JCXsKLQkJCUJyZWFrUG9pbnQgYiA9IChCcmVha1BvaW50KSBvYmo7Ci0JCQlyZXR1cm4gYi5maWxlLmVxdWFscyhmaWxlKSAmJiBiLmxpbmUgPT0gbGluZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlyZXR1cm4gZmlsZSArICIgIiArIGxpbmU7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2RlYnVnL2RlYnVnZ2VyL0RlYnVnQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2RlYnVnL2RlYnVnZ2VyL0RlYnVnQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzODNhMjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9kZWJ1Zy9kZWJ1Z2dlci9EZWJ1Z0NvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLmRlYnVnZ2VyOwotCi0vKioKLSAqIENvbnN0YW50cyB1c2VkIGJ5IHRoZSBkZWJ1Z2dlci4KLSAqIAotICogPHA+Ci0gKiBOb3RlIHRoYXQgY2xhc3MgaXMgbG9hZGVkIGJvdGggb24gdGhlIEVjbGlwc2UgY2xhc3NwYXRoIGFuZCB0aGUgCi0gKiBsYXVuY2hlZCB0cmFuc2Zvcm1hdGlvbiBwcm9jZXNzLCBzdWNoIHRoYXQgdGhleSBjYW4gdXNlIGV4YWN0bHkgdGhlIHNhbWUgY29uc3RhbnRzCi0gKiBmb3IgY29tbXVuaWNhdGlvbi4KLSAqIDwvcD4KLSAqIAotICogQGF1dGhvciBEb3VnIFNhdGNod2VsbAotICovCi1wdWJsaWMgY2xhc3MgRGVidWdDb25zdGFudHMKLXsKLQkvKioKLQkgKiBUaGUgY29uc3RhbnQgdXNlZCB0byBub3RpZnkgdGhlIGRlYnVnZ2VyIHRvIHN0YXJ0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVFU1RfU1RBUlQgPSAic3RhcnQiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogVGhlIGNvbnN0YW50IHVzZWQgdG8gc2lnbmlmeSBhZGRpdGlvbiBvZiBhIGJyZWFrcG9pbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVRVUVTVF9BRERfQlJFQUtQT0lOVCA9ICJhZGQiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogVGhlIGNvbnN0YW50IHVzZWQgdG8gc2lnbmlmeSByZW1vdmFsIG9mIGEgYnJlYWtwb2ludC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVRVNUX1JFTU9WRV9CUkVBS1BPSU5UID0gInJlbW92ZSI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBUaGUgY29uc3RhbnQgdXNlZCB0byBzaWduaWZ5IHN0ZXAgaW50by4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVRVNUX1NURVBfSU5UTyA9ICJzdGVwIGludG8iOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogVGhlIGNvbnN0YW50IHVzZWQgdG8gc2lnbmlmeSBzdGVwIG92ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVRVUVTVF9TVEVQX09WRVIgPSAic3RlcCBvdmVyIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFRoZSBjb25zdGFudCB1c2VkIHRvIHNpZ25pZnkgc3VzcGVuc2lvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVRVNUX1NVU1BFTkQgPSAic3VzcGVuZCI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBUaGUgY29uc3RhbnQgdXNlZCB0byBzaWduaWZ5IHJlc3VtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVRVNUX1JFU1VNRSA9ICJyZXN1bWUiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogVGhlIGNvbnN0YW50IHVzZWQgdG8gcmVxdWVzdCB0aGUgc3RhY2suCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVRVUVTVF9TVEFDSyA9ICJzdGFjayI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBUaGUgY29uc3RhbnQgdXNlZCB0byByZXF1ZXN0IGEgdmFyaWFibGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVRVUVTVF9WQVJJQUJMRSA9ICJ2YXIiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogVGhlIGNvbnN0YW50IHVzZWQgdG8gcmVxdWVzdCBhIHZhcmlhYmxlIHZhbHVlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVFU1RfVkFMVUUgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogVGhlIGNvbnN0YW50IHVzZWQgdG8gc2lnbmlmeSBzdGVwIHJldHVybi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVRVNUX1NURVBfUkVUVVJOID0gInN0ZXAgcmV0dXJuIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9kZWJ1Zy9kZWJ1Z2dlci9EZWJ1Z1J1bm5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9kZWJ1Zy9kZWJ1Z2dlci9EZWJ1Z1J1bm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmUxY2UyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvZGVidWcvZGVidWdnZXIvRGVidWdSdW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcuZGVidWdnZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKLWltcG9ydCBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQ7Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0OwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlVSSVJlc29sdmVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlNBWFNvdXJjZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy5pbnZva2VyLklQcm9jZXNzb3JJbnZva2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy5pbnZva2VyLlBpcGVsaW5lRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcuaW52b2tlci5UcmFuc2Zvcm1hdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcuaW52b2tlci5pbnRlcm5hbC5KQVhQU0FYUHJvY2Vzc29ySW52b2tlcjsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLQotLyoqCi0gKiBUaGUgZW50cnkgcG9pbnQgdG8gdGhlIGRlYnVnIHByb2Nlc3Mgd2hpY2ggaXMgcmVzcG9uc2libGUgZm9yIGNvbmZpZ3VyaW5nIGEgZGVidWdnZXIgCi0gKiBhbmQgdGhlbiBjb21tdW5pY2F0aW5nIHdpdGggdGhlIEVjbGlwc2UgcHJvY2VzcyB2aWEgc29ja2V0cyB1c2luZyBhIGNvbW1vbiBzZXQgb2YgY29tbWFuZHMuCi0gKiAKLSAqIDx1bD4KLSAqIDxsaT5pbnN0YW50aWF0ZXMgYW4gaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+SVhTTERlYnVnZ2VyPC9jb2RlPgotICogPGxpPmNvbmZpZ3VyZXMgdGhlIGRlYnVnZ2VyIHdpdGggdGhlIHRyYW5zZm9ybWF0aW9uIHBpcGVsaW5lCi0gKiA8bGk+c3RhcnRzIHRoZSBkZWJ1Z2dlciBpbiBhIHNlcGFyYXRlIHRocmVhZAotICogPGxpPnRoZSBtYWluIHRocmVhZCBpcyB0aGVuIHVzZWQgdG8gbGlzdGVuIHRvIGluY29taW5nIHJlcXVlc3RzIGFuZCBjYWxsIHRoZSBhcHByb3ByaWF0ZSBkZWJ1Z2dlciBtZXRob2RzCi0gKiA8L3VsPgotICogCi0gKiBAYXV0aG9yIERvdWcgU2F0Y2h3ZWxsCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWJ1Z1J1bm5lcgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhEZWJ1Z1J1bm5lci5jbGFzcyk7Ci0KLQlwcml2YXRlIGZpbmFsIEJ1ZmZlcmVkUmVhZGVyIHJlcXVlc3RJbjsKLQlwcml2YXRlIGZpbmFsIFdyaXRlciByZXF1ZXN0T3V0OwotCXByaXZhdGUgZmluYWwgV3JpdGVyIGV2ZW50T3V0OwotCXByaXZhdGUgZmluYWwgV3JpdGVyIGdlbmVyYXRlZFN0cmVhbTsKLQlwcml2YXRlIFNvY2tldCBldmVudFNvY2tldDsKLQlwcml2YXRlIFNvY2tldCByZXF1ZXN0U29ja2V0OwotCXByaXZhdGUgU29ja2V0IGdlbmVyYXRlU29ja2V0OwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgdXNpbmcgdGhlIHN1cHBsaWVkIHJlYWRlcnMgYW5kIHdyaXRlcnMuCi0JICogCi0JICogQHBhcmFtIHJlcXVlc3RJbiB0aGUgcmVhZGVyIGZvciByZWFkaW5nIGluY29taW5nIHJlcXVlc3RzCi0JICogQHBhcmFtIHJlcXVlc3RPdXQgdGhlIHdyaXRlciBmb3IgYWNrbm93bGVkZ2luZyByZXF1ZXN0cwotCSAqIEBwYXJhbSBldmVudE91dCB0aGUgd3JpdGVyIGZvciBwdWJsaXNoaW5nIGRlYnVnIGV2ZW50cwotCSAqLwotCXB1YmxpYyBEZWJ1Z1J1bm5lcihCdWZmZXJlZFJlYWRlciByZXF1ZXN0SW4sIFByaW50V3JpdGVyIHJlcXVlc3RPdXQsIFByaW50V3JpdGVyIGV2ZW50T3V0LCBQcmludFdyaXRlciBnZW5lcmF0ZWRTdHJlYW0pCi0JewotCQl0aGlzLnJlcXVlc3RPdXQgPSByZXF1ZXN0T3V0OwotCQl0aGlzLnJlcXVlc3RJbiA9IHJlcXVlc3RJbjsKLQkJdGhpcy5ldmVudE91dCA9IGV2ZW50T3V0OwotCQl0aGlzLmdlbmVyYXRlZFN0cmVhbSA9IGdlbmVyYXRlZFN0cmVhbTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBnaXZlbiBhIHJlcXVlc3QgcG9ydCBhbmQgYW4gZXZlbnQgcG9ydC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVxdWVzdFBvcnQgdGhlIHBvcnQgdG8gbGlzdGVuIHRvIHJlcXVlc3RzIGFuZCBzZW5kIGFja25vd2xlZGdlbWVudHMKLQkgKiBAcGFyYW0gZXZlbnRQb3J0IHRoZSBwb3J0IGZvciBwdWJsaXNoaW5nIGRlYnVnIGV2ZW50cwotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlcmUgd2FzIGEgcHJvYmxlbSBvcGVuaW5nIGEgc29ja2V0Ci0JICovCi0JcHVibGljIERlYnVnUnVubmVyKGludCByZXF1ZXN0UG9ydCwgaW50IGV2ZW50UG9ydCwgaW50IGdlbmVyYXRlUG9ydCkgdGhyb3dzIElPRXhjZXB0aW9uCi0JewotCQlyZXF1ZXN0U29ja2V0ID0gZ2V0U29ja2V0KHJlcXVlc3RQb3J0KTsKLQkJZXZlbnRTb2NrZXQgPSBnZXRTb2NrZXQoZXZlbnRQb3J0KTsKLQkJZ2VuZXJhdGVTb2NrZXQgPSBnZXRTb2NrZXQoZ2VuZXJhdGVQb3J0KTsKLQkJcmVxdWVzdEluID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihyZXF1ZXN0U29ja2V0LmdldElucHV0U3RyZWFtKCkpKTsKLQkJcmVxdWVzdE91dCA9IG5ldyBQcmludFdyaXRlcihyZXF1ZXN0U29ja2V0LmdldE91dHB1dFN0cmVhbSgpLCB0cnVlKTsKLQkJZXZlbnRPdXQgPSBuZXcgUHJpbnRXcml0ZXIoZXZlbnRTb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCksIHRydWUpOwotCQlnZW5lcmF0ZWRTdHJlYW0gPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IFByaW50V3JpdGVyKGdlbmVyYXRlU29ja2V0LmdldE91dHB1dFN0cmVhbSgpLCB0cnVlKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc3RhcnRzIHRoZSBnaXZlbiBkZWJ1Z2dlciBpbiBpdHMgb3duIHRocmVhZCwgYW5kIGJsb2NrcyB3aGlsZSB3YWl0aW5nIAotCSAqIGZvciBpbmNvbWluZyByZXF1ZXN0cyBmcm9tIHRoZSByZXF1ZXN0IHBvcnQsIHVudGlsIHRoZXJlIGFyZSBubyBtb3JlIHJlcXVlc3RzLgotCSAqIAotCSAqIEBwYXJhbSBkZWJ1Z2dlciB0aGUgZGVidWdnZXIgdG8gc3RhcnQgaW4gYSB0aHJlYWQKLQkgKiBAdGhyb3dzIFRyYW5zZm9ybWF0aW9uRXhjZXB0aW9uIGlmIGEgcHJvYmxlbSBvY2N1cnJlZCB3aGlsZSB0cmFuc2Zvcm1pbmcKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIAotCSAqLwotCXB1YmxpYyB2b2lkIGxvb3AoSVhTTERlYnVnZ2VyIGRlYnVnZ2VyKSB0aHJvd3MgVHJhbnNmb3JtYXRpb25FeGNlcHRpb24sIElPRXhjZXB0aW9uCi0JewotCQlkZWJ1Z2dlci5zZXRFdmVudFdyaXRlcihldmVudE91dCk7Ci0JCWRlYnVnZ2VyLnNldEdlbmVyYXRlZFdyaXRlcihnZW5lcmF0ZWRTdHJlYW0pOwotCQlTdHJpbmcgaW5wdXRMaW5lLCByZXNwb25zZTsKLQkJLy8gc2lnbmFsIHdlIGFyZSByZWFkeSB0byByZWNlaXZlIHJlcXVlc3RzCi0JCWV2ZW50T3V0LndyaXRlKCJyZWFkeVxuIik7IC8vJE5PTi1OTFMtMSQKLQkJZXZlbnRPdXQuZmx1c2goKTsKLQkJbG9nLmRlYnVnKCJlbnRlcmluZyBsb29wIik7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5Ci0JCXsKLQkJCXdoaWxlICgoaW5wdXRMaW5lID0gcmVxdWVzdEluLnJlYWRMaW5lKCkpICE9IG51bGwpCi0JCQl7Ci0JCQkJcmVzcG9uc2UgPSBpbnB1dExpbmU7Ci0JCQkJbG9nLmRlYnVnKCJSRVFVRVNUOiIgKyBpbnB1dExpbmUpOyAvLyROT04tTkxTLTEkCi0JCQkJVGhyZWFkIGRlYnVnZ2VyVGhyZWFkID0gbnVsbDsKLQkJCQlpZiAoRGVidWdDb25zdGFudHMuUkVRVUVTVF9TVEFSVC5lcXVhbHMoaW5wdXRMaW5lKSkKLQkJCQl7Ci0JCQkJCWRlYnVnZ2VyVGhyZWFkID0gbmV3IFRocmVhZChkZWJ1Z2dlciwgImRlYnVnZ2VyIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZGVidWdnZXJUaHJlYWQuc3RhcnQoKTsKLQkJCQl9Ci0JCQkJLyoKLQkJCQkgKiBlbHNlIGlmIChSRVFVRVNUX1FVSVQuZXF1YWxzKGlucHV0TGluZSkpIHsgfQotCQkJCSAqLwotCQkJCWVsc2UgaWYgKERlYnVnQ29uc3RhbnRzLlJFUVVFU1RfU1RFUF9JTlRPLmVxdWFscyhpbnB1dExpbmUpKQotCQkJCXsKLQkJCQkJZGVidWdnZXIuc3RlcEludG8oKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoRGVidWdDb25zdGFudHMuUkVRVUVTVF9TVEVQX09WRVIuZXF1YWxzKGlucHV0TGluZSkpCi0JCQkJewotCQkJCQlkZWJ1Z2dlci5zdGVwT3ZlcigpOwotCQkJCX0KLQkJCQllbHNlIGlmIChEZWJ1Z0NvbnN0YW50cy5SRVFVRVNUX1NURVBfUkVUVVJOLmVxdWFscyhpbnB1dExpbmUpKQotCQkJCXsKLQkJCQkJZGVidWdnZXIuc3RlcFJldHVybigpOwotCQkJCX0KLQkJCQllbHNlIGlmIChEZWJ1Z0NvbnN0YW50cy5SRVFVRVNUX1NVU1BFTkQuZXF1YWxzKGlucHV0TGluZSkpCi0JCQkJewotCQkJCQlkZWJ1Z2dlci5zdXNwZW5kKCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKERlYnVnQ29uc3RhbnRzLlJFUVVFU1RfUkVTVU1FLmVxdWFscyhpbnB1dExpbmUpKQotCQkJCXsKLQkJCQkJZGVidWdnZXIucmVzdW1lKCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKERlYnVnQ29uc3RhbnRzLlJFUVVFU1RfU1RBQ0suZXF1YWxzKGlucHV0TGluZSkpCi0JCQkJewotCQkJCQlyZXNwb25zZSA9IGRlYnVnZ2VyLnN0YWNrKCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGlucHV0TGluZS5zdGFydHNXaXRoKERlYnVnQ29uc3RhbnRzLlJFUVVFU1RfVkFSSUFCTEUpKQotCQkJCXsKLQkJCQkJU3RyaW5nIGRhdGEgPSBpbnB1dExpbmUuc3Vic3RyaW5nKERlYnVnQ29uc3RhbnRzLlJFUVVFU1RfVkFSSUFCTEUubGVuZ3RoKCkgKyAxKTsKLQkJCQkJaW50IGlkID0gSW50ZWdlci5wYXJzZUludChkYXRhKTsKLQkJCQkJVmFyaWFibGUgdmFyID0gZGVidWdnZXIuZ2V0VmFyaWFibGUoaWQpOwotCQkJCQlsb2cuZGVidWcoInZhciAiK2lkKyIgPSAiK3Zhcik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlyZXNwb25zZSA9IHZhci5nZXRTY29wZSgpICsgIiYiICsgdmFyLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQllbHNlIGlmIChpbnB1dExpbmUuc3RhcnRzV2l0aChEZWJ1Z0NvbnN0YW50cy5SRVFVRVNUX1ZBTFVFKSkKLQkJCQl7Ci0JCQkJCVN0cmluZyBkYXRhID0gaW5wdXRMaW5lLnN1YnN0cmluZyhEZWJ1Z0NvbnN0YW50cy5SRVFVRVNUX1ZBTFVFLmxlbmd0aCgpICsgMSk7Ci0JCQkJCWludCBpZCA9IEludGVnZXIucGFyc2VJbnQoZGF0YSk7Ci0JCQkJCVZhcmlhYmxlIHZhciA9IGRlYnVnZ2VyLmdldFZhcmlhYmxlKGlkKTsKLQkJCQkJcmVzcG9uc2UgPSAgdmFyLmdldFR5cGUoKSArICImIiArIHZhci5nZXRWYWx1ZUZpcnN0TGluZSgpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWVsc2UgaWYgKGlucHV0TGluZS5zdGFydHNXaXRoKERlYnVnQ29uc3RhbnRzLlJFUVVFU1RfQUREX0JSRUFLUE9JTlQpKQotCQkJCXsKLQkJCQkJaW50IGluZGV4ID0gaW5wdXRMaW5lLmxhc3RJbmRleE9mKCcgJyk7Ci0JCQkJCVN0cmluZyBmaWxlID0gaW5wdXRMaW5lLnN1YnN0cmluZyhEZWJ1Z0NvbnN0YW50cy5SRVFVRVNUX0FERF9CUkVBS1BPSU5ULmxlbmd0aCgpICsgMSwgaW5kZXgpOwotCQkJCQlTdHJpbmcgbGluZSA9IGlucHV0TGluZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLQkJCQkJQnJlYWtQb2ludCBicmVha3BvaW50ID0gbmV3IEJyZWFrUG9pbnQoZmlsZSwgSW50ZWdlci5wYXJzZUludChsaW5lKSk7Ci0JCQkJCWRlYnVnZ2VyLmFkZEJyZWFrcG9pbnQoYnJlYWtwb2ludCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGlucHV0TGluZS5zdGFydHNXaXRoKERlYnVnQ29uc3RhbnRzLlJFUVVFU1RfUkVNT1ZFX0JSRUFLUE9JTlQpKQotCQkJCXsKLQkJCQkJaW50IGluZGV4ID0gaW5wdXRMaW5lLmxhc3RJbmRleE9mKCcgJyk7Ci0JCQkJCVN0cmluZyBmaWxlID0gaW5wdXRMaW5lLnN1YnN0cmluZyhEZWJ1Z0NvbnN0YW50cy5SRVFVRVNUX1JFTU9WRV9CUkVBS1BPSU5ULmxlbmd0aCgpICsgMSwgaW5kZXgpOwotCQkJCQlTdHJpbmcgbGluZSA9IGlucHV0TGluZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLQkJCQkJQnJlYWtQb2ludCBicmVha3BvaW50ID0gbmV3IEJyZWFrUG9pbnQoZmlsZSwgSW50ZWdlci5wYXJzZUludChsaW5lKSk7Ci0JCQkJCWRlYnVnZ2VyLnJlbW92ZUJyZWFrcG9pbnQoYnJlYWtwb2ludCk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCXJlc3BvbnNlID0gIldoYXQ/IjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQkvLyBjb25maXJtIHJlcXVlc3QKLQkJCQlsb2cuZGVidWcoIlJFU1BPTlNFOiIgKyByZXNwb25zZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXF1ZXN0T3V0LndyaXRlKHJlc3BvbnNlICsgIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXF1ZXN0T3V0LmZsdXNoKCk7Ci0KLQkJCQkvKgotCQkJCSAqIGlmIChSRVFVRVNUX1FVSVQuZXF1YWxzKGlucHV0TGluZSkpIHsgd2FpdEZvckZpbmlzaChkZWJ1Z2dlclRocmVhZCk7IGJyZWFrOyB9Ci0JCQkJICovCi0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQl0aHJvdyBuZXcgVHJhbnNmb3JtYXRpb25FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9Ci0JCWxvZy5kZWJ1ZygiZXhpdGVkIGxvb3AiKTsgLy8kTk9OLU5MUy0xJAotCQlldmVudE91dC53cml0ZSgidGVybWluYXRlZFxuIik7IC8vJE5PTi1OTFMtMSQKLQkJZXZlbnRPdXQuZmx1c2goKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlIG9mIHRoaXMgLSBjbG9zZSBhbGwgb3BlbiBzb2NrZXRzLgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbgotCXsKLQkJaWYgKHJlcXVlc3RJbiAhPSBudWxsKQotCQl7Ci0JCQl0cnkKLQkJCXsKLQkJCQlyZXF1ZXN0SW4uY2xvc2UoKTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKQotCQkJewotCQkJCWxvZy5lcnJvcigiQ291bGQgbm90IGNsb3NlIHJlcXVlc3QgaW5wdXQgc3RyZWFtIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlpZiAocmVxdWVzdE91dCAhPSBudWxsKQotCQl7Ci0JCQlyZXF1ZXN0T3V0LmNsb3NlKCk7Ci0JCX0KLQkJaWYgKGV2ZW50T3V0ICE9IG51bGwpCi0JCXsKLQkJCWV2ZW50T3V0LmNsb3NlKCk7Ci0JCX0KLQkJaWYgKHJlcXVlc3RTb2NrZXQgIT0gbnVsbCkKLQkJewotCQkJdHJ5Ci0JCQl7Ci0JCQkJcmVxdWVzdFNvY2tldC5jbG9zZSgpOwotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0JCQl7Ci0JCQkJbG9nLmVycm9yKCJDb3VsZCBub3QgY2xvc2UgcmVxdWVzdCBzb2NrZXQiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCWlmIChldmVudFNvY2tldCAhPSBudWxsKQotCQl7Ci0JCQl0cnkKLQkJCXsKLQkJCQlldmVudFNvY2tldC5jbG9zZSgpOwotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0JCQl7Ci0JCQkJbG9nLmVycm9yKCJDb3VsZCBub3QgY2xvc2UgZXZlbnQgc29ja2V0IiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIFNvY2tldCBnZXRTb2NrZXQoaW50IHBvcnQpIHRocm93cyBJT0V4Y2VwdGlvbgotCXsKLQkJSW5ldEFkZHJlc3MgbG9jYWxob3N0ID0gSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKCJsb2NhbGhvc3QiKTsgLy8kTk9OLU5MUy0xJAotCQlTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0ID0gbmV3IFNlcnZlclNvY2tldChwb3J0LCA1LCBsb2NhbGhvc3QpOwotCQlTb2NrZXQgY2xpZW50U29ja2V0ID0gc2VydmVyU29ja2V0LmFjY2VwdCgpOwotCQlzZXJ2ZXJTb2NrZXQuY2xvc2UoKTsKLQkJcmV0dXJuIGNsaWVudFNvY2tldDsKLQl9Ci0KLQkvKioKLQkgKiBFeHBlY3RlZCBhcmd1bWVudHM6Ci0JICogCi0JICogPG9sPgotCSAqIDxsaT50aGUgY2xhc3MgbmFtZSBvZiB0aGUgaW52b2tlcgotCSAqIDxsaT50aGUgZmlsZSBuYW1lIG9mIHRoZSBYTUwgbGF1bmNoIGNvbmZpZ3VyYXRpb24gZmlsZQotCSAqIDxsaT50aGUgVVJMIG9mIHRoZSBzb3VyY2UgZG9jdW1lbnQKLQkgKiA8bGk+dGhlIGZpbGUgb2YgdGhlIG91dHB1dCBkb2N1bWVudAotCSAqIDxsaT5ub3QgdXNlZCAoYW55dGhpbmcpCi0JICogPGxpPnRoZSBjbGFzcyBuYW1lIG9mIHRoZSA8Y29kZT5JWFNMRGVidWdnZXI8L2NvZGU+IGluc3RhbmNlCi0JICogPGxpPnRoZSBwb3J0IHVzZWQgZm9yIHJlcXVlc3RzCi0JICogPGxpPnRoZSBwb3J0IHVzZWQgZm9yIGRlYnVnIGV2ZW50cwotCSAqIDxsaT50aGUgcG9ydCB1c2VkIGZvciBnZW5lcmF0ZSBldmVudHMKLQkgKiA8L29sPgotCSAqIAotCSAqIEBwYXJhbSBhcmdzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKLQl7Ci0JCWxvZy5pbmZvKCJqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeT0iICsgU3lzdGVtLmdldFByb3BlcnR5KCJqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeSIpKTsgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCWxvZy5pbmZvKCJqYXZhLmVuZG9yc2VkLmRpcnM9IiArIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5lbmRvcnNlZC5kaXJzIikpOyAgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQotCQlTdHJpbmcgaW52b2tlckNsYXNzTmFtZSA9IGFyZ3NbMF07Ci0JCUZpbGUgbGF1bmNoRmlsZSA9IG5ldyBGaWxlKGFyZ3NbMV0pOwotCQlTdHJpbmcgc3JjID0gYXJnc1syXTsKLQkJU3RyaW5nIHRhcmdldCA9IGFyZ3NbM107Ci0JCVN0cmluZyBkZWJ1Z2dlckNsYXNzTmFtZSA9IGFyZ3NbNV07Ci0KLQkJbG9nLmluZm8oInNyYzogIiArIHNyYyk7IC8vJE5PTi1OTFMtMSQKLQkJbG9nLmluZm8oInRhcmdldDogIiArIHRhcmdldCk7IC8vJE5PTi1OTFMtMSQKLQkJbG9nLmluZm8oImxhdW5jaEZpbGU6ICIgKyBsYXVuY2hGaWxlKTsgLy8kTk9OLU5MUy0xJAotCQlsb2cuaW5mbygiZGVidWdnZXI6ICIgKyBkZWJ1Z2dlckNsYXNzTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQotCQlEZWJ1Z1J1bm5lciBkZWJ1Z1J1bm5lciA9IG51bGw7Ci0JCXRyeQotCQl7Ci0JCQlmaW5hbCBJWFNMRGVidWdnZXIgZGVidWdnZXIgPSBjcmVhdGVEZWJ1Z2dlcihkZWJ1Z2dlckNsYXNzTmFtZSk7Ci0JCQkvLyBjcmVhdGUgdGhlIGludm9rZXIKLQkJCUlQcm9jZXNzb3JJbnZva2VyIGludm9rZXIgPSBuZXcgSkFYUFNBWFByb2Nlc3Nvckludm9rZXIoKQotCQkJewotCi0JCQkJcHJvdGVjdGVkIFRyYW5zZm9ybWVyRmFjdG9yeSBjcmVhdGVUcmFuc2Zvcm1lckZhY3RvcnkoKQotCQkJCXsKLQkJCQkJVHJhbnNmb3JtZXJGYWN0b3J5IHRGYWN0b3J5ID0gc3VwZXIuY3JlYXRlVHJhbnNmb3JtZXJGYWN0b3J5KCk7Ci0JCQkJCWRlYnVnZ2VyLnNldFRyYW5zZm9ybWVyRmFjdG9yeSh0RmFjdG9yeSk7Ci0JCQkJCXJldHVybiB0RmFjdG9yeTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBhZGRTdHlsZXNoZWV0KFVSTCBzdHlsZXNoZWV0LCBNYXAgcGFyYW1ldGVycywgUHJvcGVydGllcyBvdXRwdXRQcm9wZXJ0aWVzLCBVUklSZXNvbHZlciByZXNvbHZlcikgdGhyb3dzIFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotCQkJCXsKLQkJCQkJSW5wdXRTb3VyY2UgaW5wdXRzb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2Uoc3R5bGVzaGVldC50b1N0cmluZygpKTsKLQkJCQkJLy8gaWYgcmVxdWlyZWQgaW4gZnV0dXJlLCBwYXJzZSB0aGUgZG9jdW1lbnQgd2l0aCBsaW5lIG51bWJlcnMgKHRvIGdldCB0aGUgZW5kIGxpbmUgbnVtYmVycykKLS8vCQkJCQlYTUxSZWFkZXJXcmFwcGVyIHJlYWRlciA9IG5ldyBYTUxSZWFkZXJXcmFwcGVyKGNyZWF0ZVJlYWRlcigpKTsKLS8vCQkJCQlTQVhTb3VyY2Ugc291cmNlID0gbmV3IFNBWFNvdXJjZShyZWFkZXIsaW5wdXRzb3VyY2UpOwotCQkJCQlhZGRTdHlsZXNoZWV0KG5ldyBTQVhTb3VyY2UoaW5wdXRzb3VyY2UpLCByZXNvbHZlciwgcGFyYW1ldGVycywgb3V0cHV0UHJvcGVydGllcyk7Ci0JCQkJfQotCQkJCQotCQkJCXByb3RlY3RlZCBUcmFuc2Zvcm1lciBhZGRTdHlsZXNoZWV0KFNvdXJjZSBzb3VyY2UsIFVSSVJlc29sdmVyIHJlc29sdmVyLCBNYXAgcGFyYW1ldGVycywgUHJvcGVydGllcyBvdXRwdXRQcm9wZXJ0aWVzKSB0aHJvd3MgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0JCQkJewotCQkJCQlUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHN1cGVyLmFkZFN0eWxlc2hlZXQoc291cmNlLCByZXNvbHZlciwgcGFyYW1ldGVycywgb3V0cHV0UHJvcGVydGllcyk7Ci0JCQkJCWRlYnVnZ2VyLmFkZFRyYW5zZm9ybWVyKHRyYW5zZm9ybWVyKTsKLQkJCQkJcmV0dXJuIHRyYW5zZm9ybWVyOwotCQkJCX0KLQkJCX07Ci0KLQkJCWlmIChhcmdzLmxlbmd0aCA9PSA5KQotCQkJewotCQkJCWludCByZXF1ZXN0UG9ydCA9IEludGVnZXIucGFyc2VJbnQoYXJnc1s2XSk7Ci0JCQkJaW50IGV2ZW50UG9ydCA9IEludGVnZXIucGFyc2VJbnQoYXJnc1s3XSk7Ci0JCQkJaW50IGdlbmVyYXRlUG9ydCA9IEludGVnZXIucGFyc2VJbnQoYXJnc1s4XSk7Ci0KLQkJCQlsb2cuZGVidWcoInJlcXVlc3RQb3J0OiAiICsgcmVxdWVzdFBvcnQpOyAvLyROT04tTkxTLTEkCi0JCQkJbG9nLmRlYnVnKCJldmVudFBvcnQ6ICIgKyBldmVudFBvcnQpOyAvLyROT04tTkxTLTEkCi0JCQkJbG9nLmRlYnVnKCJnZW5lcmF0ZVBvcnQ6ICIgKyBnZW5lcmF0ZVBvcnQpOyAvLyROT04tTkxTLTEkCi0KLQkJCQl0cnkKLQkJCQl7Ci0JCQkJCWRlYnVnUnVubmVyID0gbmV3IERlYnVnUnVubmVyKHJlcXVlc3RQb3J0LCBldmVudFBvcnQsIGdlbmVyYXRlUG9ydCk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkKLQkJCQl7Ci0JCQkJCWhhbmRsZUZhdGFsRXJyb3IoIkNvdWxkIG5vdCBpbnN0YW50aWF0ZSBpbnZva2VyOiAiICsgaW52b2tlckNsYXNzTmFtZSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKFN5c3RlbS5pbikpOwotCQkJCWRlYnVnUnVubmVyID0gbmV3IERlYnVnUnVubmVyKGJyLCBuZXcgUHJpbnRXcml0ZXIoU3lzdGVtLm91dCksIG5ldyBQcmludFdyaXRlcihTeXN0ZW0uZXJyKSwgbnVsbCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJ4c2w+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJUGlwZWxpbmVEZWZpbml0aW9uIHBpcGVsaW5lID0gbmV3IFBpcGVsaW5lRGVmaW5pdGlvbihsYXVuY2hGaWxlKTsKLQkJCXBpcGVsaW5lLmNvbmZpZ3VyZShpbnZva2VyKTsKLQotCQkJZGVidWdnZXIuc2V0SW52b2tlcihpbnZva2VyKTsKLQkJCWRlYnVnZ2VyLnNldFNvdXJjZShuZXcgVVJMKHNyYykpOwotCQkJZGVidWdnZXIuc2V0VGFyZ2V0KG5ldyBGaWxlV3JpdGVyKG5ldyBGaWxlKHRhcmdldCkpKTsKLQotCQkJZGVidWdSdW5uZXIubG9vcChkZWJ1Z2dlcik7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQloYW5kbGVGYXRhbEVycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJfQotCQlmaW5hbGx5Ci0JCXsKLQkJCWlmIChkZWJ1Z1J1bm5lciAhPSBudWxsKQotCQkJewotCQkJCXRyeQotCQkJCXsKLQkJCQkJZGVidWdSdW5uZXIuZGlzcG9zZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkKLQkJCQl7Ci0JCQkJCWhhbmRsZUZhdGFsRXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIElYU0xEZWJ1Z2dlciBjcmVhdGVEZWJ1Z2dlcihTdHJpbmcgY2xhc3NuYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgotCXsKLQkJQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKGNsYXNzbmFtZSk7Ci0JCXJldHVybiAoSVhTTERlYnVnZ2VyKSBjbGF6ei5uZXdJbnN0YW5jZSgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgaGFuZGxlRmF0YWxFcnJvcihTdHJpbmcgbXNnLCBUaHJvd2FibGUgdCkKLQl7Ci0JCWxvZy5mYXRhbChtc2csIHQpOwotCQlTeXN0ZW0uZXhpdCgxKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2RlYnVnL2RlYnVnZ2VyL0lYU0xEZWJ1Z2dlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9kZWJ1Zy9kZWJ1Z2dlci9JWFNMRGVidWdnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRmMGIwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2RlYnVnL2RlYnVnZ2VyL0lYU0xEZWJ1Z2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy5kZWJ1Z2dlcjsKLQotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcuaW52b2tlci5JUHJvY2Vzc29ySW52b2tlcjsKLQotLyoqCi0gKiBBbiBpbnRlcmZhY2UgdG8gWFNMIGRlYnVnZ2VyIGluc3RhbmNlcy4KLSAqIAotICogQGF1dGhvciBEb3VnIFNhdGNod2VsbAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElYU0xEZWJ1Z2dlciBleHRlbmRzIFJ1bm5hYmxlCi17Ci0JLyoqCi0JICogU2V0IHRoZSBpbnZva2VyIHRvIHVzZS4KLQkgKiAKLQkgKiBAcGFyYW0gaW52b2tlciB0aGUgaW52b2tlciB0byBzZXQKLQkgKi8KLQl2b2lkIHNldEludm9rZXIoSVByb2Nlc3Nvckludm9rZXIgaW52b2tlcik7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHRyYW5zZm9ybWVyIGZhY3RvcnkgdG8gdXNlLgotCSAqIAotCSAqIEBwYXJhbSBmYWN0b3J5IHRoZSBmYWN0b3J5IHRvIHVzZQotCSAqLwotCXZvaWQgc2V0VHJhbnNmb3JtZXJGYWN0b3J5KFRyYW5zZm9ybWVyRmFjdG9yeSBmYWN0b3J5KTsKLQotCS8qKgotCSAqIEFkZCBhIHRyYW5zZm9ybWVyIHRvIHRoaXMuCi0JICogCi0JICogQHBhcmFtIHRyYW5zZm9ybWVyCi0JICovCi0Jdm9pZCBhZGRUcmFuc2Zvcm1lcihUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lcik7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIFdyaXRlciBmb3IgdGhpcyB0byB3cml0ZSBldmVudHMgdG8uCi0JICogCi0JICogQHBhcmFtIHdyaXRlciB0aGUgd3JpdGVyIHRvIHdyaXRlIGV2ZW50cyB0bwotCSAqLwotCXZvaWQgc2V0RXZlbnRXcml0ZXIoV3JpdGVyIHdyaXRlcik7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIE9iamVjdE91dHB1dFN0cmVhbSBmb3IgdGhpcyB0byB3cml0ZSBnZW5lcmF0ZWQgZXZlbnRzIHRvLgotCSAqIAotCSAqIEBwYXJhbSB3cml0ZXIgdGhlIHN0cmVhbSB0byB3cml0ZSBnZW5lcmF0ZSBldmVudHMgdG8KLQkgKi8KLQl2b2lkIHNldEdlbmVyYXRlZFdyaXRlcihXcml0ZXIgd3JpdGVyKTsKLQotCS8qKgotCSAqIFNldCB0aGUgVVJMIG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiBzb3VyY2UgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlVVJMIHRoZSBzb3VyY2UgVVJMCi0JICovCi0Jdm9pZCBzZXRTb3VyY2UoVVJMIHNvdXJjZVVSTCk7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHRyYW5zZm9ybWF0aW9uIFJlc3VsdC4KLQkgKiAKLQkgKiBAcGFyYW0gd3JpdGVyIHRoZSByZXN1bHQKLQkgKi8KLQl2b2lkIHNldFRhcmdldChXcml0ZXIgd3JpdGVyKTsKLQotCS8qKgotCSAqIEFkZCBhIGJyZWFrcG9pbnQgdG8gdGhpcy4KLQkgKiAKLQkgKiBAcGFyYW0gYnJlYWtwb2ludAotCSAqLwotCXZvaWQgYWRkQnJlYWtwb2ludChCcmVha1BvaW50IGJyZWFrcG9pbnQpOwotCi0JLyoqCi0JICogUmVtb3ZlIGEgYnJlYWtwb2ludCBmcm9tIHRoaXMuCi0JICogCi0JICogQHBhcmFtIGJyZWFrcG9pbnQKLQkgKi8KLQl2b2lkIHJlbW92ZUJyZWFrcG9pbnQoQnJlYWtQb2ludCBicmVha3BvaW50KTsKLQotCS8qKgotCSAqIFBlcmZvcm0gYSAnc3RlcCBpbnRvJyBvcGVyYXRpb24uCi0JICovCi0Jdm9pZCBzdGVwSW50bygpOwotCi0JLyoqCi0JICogUGVyZm9ybSBhICdzdGVwIG92ZXInIG9wZXJhdGlvbi4KLQkgKi8KLQl2b2lkIHN0ZXBPdmVyKCk7Ci0KLQkvKioKLQkgKiBQZXJmb3JtIGEgJ3N0ZXAgcmV0dXJuJyBvcGVyYXRpb24uCi0JICovCi0Jdm9pZCBzdGVwUmV0dXJuKCk7Ci0KLQkvKioKLQkgKiBQZXJmb3JtIGEgJ3N1c3BlbmQnIG9wZXJhdGlvbi4KLQkgKi8KLQl2b2lkIHN1c3BlbmQoKTsKLQotCS8qKgotCSAqIFBlcmZvcm0gYSAncmVzdW1lJyBvcGVyYXRpb24uCi0JICovCi0Jdm9pZCByZXN1bWUoKTsKLQotCS8qKgotCSAqIFF1aXQgZGVidWdnaW5nLgotCSAqLwotCXZvaWQgcXVpdCgpOwotCi0JLyoqCi0JICogR2VuZXJhdGUgYSBzdHJpbmcgdGhhdCByZXByZXNlbnRzIHRoZSBjdXJyZW50IGNhbGwgc3RhY2sgb2YgZnJhbWVzIGFuZCB0aGVpciB2YXJpYWJsZXMuCi0JICogPHA+Ci0JICogRnJhbWVzIGFyZSBnZW5lcmF0ZWQgd2l0aCB0aGUgZm9sbG93aW5nIGZvcm1hdDogPGk+ZmlsZTwvaT58PGk+ZnJhbWVJZDwvaT58PGk+bGluZU51bWJlcjwvaT58PGk+bmFtZTwvaT4KLQkgKiBUaGlzIGlzIGltbWVkaWF0ZWx5IGZvbGxvd2VkIHdpdGggdGhlIGlkJ3Mgb2YgdGhlIGZyYW1lJ3MgdmFyaWFibGVzIChlYWNoIHZhcmlhYmxlIGlkIGJlaW5nIHVuaXF1ZSBmb3IgdGhlIHdob2xlIHByb2Nlc3MpLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGUgc2VwYXJhdG9yIGZvciBmcmFtZXMgaXMgJCQkLiBXaXRoaW4gYSBmcmFtZSwgdGhlIHNlcGFyYXRvciBmb3IgdmFyaWFibGUgaWQncyBpcyB8LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBlLmcuIGZpbGU6L3RyYW4xLnhzbHwxfDEyfHhzbDp0ZW1wbGF0ZSBuYW1lPSJ0ZW1wMSJ8MXwyfDMkJCRmaWxlOi90cmFuMi54c2x8MnwzNHx4c2w6dGVtcGxhdGUgbmFtZT0idGVtcDIifDR8NXw2Ci0JICogCi0JICogVGhpcyBkZWZpbmVzIDIgZnJhbWVzIHdpdGggaWQncyAxIGFuZCAyLCB3aGljaCBhcmUgb2NjdXIgaW4gZmlsZXMgdHJhbjEueHNsIGFuZCB0cmFuMi54c2wgcmVzcGVjdGl2ZWx5LgotCSAqIEZyYW1lIDEgaXMgY3VycmVudGx5IGF0IGxpbmUgMTIsIGluIGEgdGVtcGxhdGUgd2l0aCBuYW1lIHRlbXAxLCBhbmQgaXQgZGVmaW5lcyAzIHZhcmlhYmxlcyB3aXRoIGlkJ3MgMSwgMiBhbmQgMy4gCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGdlbmVyYXRlZCBzdHJpbmcKLQkgKi8KLQlTdHJpbmcgc3RhY2soKTsKLQotCS8qKgotCSAqIEdldCB0aGUgdmFyaWFibGUgd2l0aCB0aGUgZ2l2ZW4gaWQuCi0JICogCi0JICogQHBhcmFtIGlkIHRoZSBpZCBvZiB0aGUgdmFyaWFibGUKLQkgKiBAcmV0dXJuIHRoZSB2YXJpYWJsZQotCSAqLwotCVZhcmlhYmxlIGdldFZhcmlhYmxlKGludCBpZCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2RlYnVnL2RlYnVnZ2VyL1N0eWxlRnJhbWUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvZGVidWcvZGVidWdnZXIvU3R5bGVGcmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzdlZjlhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvZGVidWcvZGVidWdnZXIvU3R5bGVGcmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy5kZWJ1Z2dlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQW4gPGNvZGU+eHNsOnRlbXBsYXRlPC9jb2RlPiB0aGF0IGZvcm1zIHBhcnQgb2YgdGhlIGNhbGwgc3RhY2suCi0gKiAKLSAqIEBhdXRob3IgRG91ZyBTYXRjaHdlbGwKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFN0eWxlRnJhbWUKLXsKLQlwcml2YXRlIHN0YXRpYyBpbnQgbmV4dElkOwotCXByaXZhdGUgZmluYWwgU3R5bGVGcmFtZSBwYXJlbnQ7Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgZmluYWwgaW50IGlkOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgdXNpbmcgdGhlIGdpdmVuIGZyYW1lIGFzIGl0cyBwYXJlbnQgKG1heSBiZSBudWxsIGlmIHRoaXMgaXMgdGhlIHJvb3QgZnJhbWUpLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBmcmFtZQotCSAqLwotCXB1YmxpYyBTdHlsZUZyYW1lKFN0eWxlRnJhbWUgcGFyZW50KQotCXsKLQkJdGhpcy5pZCA9IG5leHRJZCsrOwotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJaWYgKHBhcmVudCAhPSBudWxsKQotCQkJcGFyZW50LmFkZENoaWxkKHRoaXMpOwotCX0KLQkKLQkvKioKLQkgKiBBIHVuaXF1ZSBpZCBmb3IgdGhpcyBmcmFtZQotCSAqIAotCSAqIEByZXR1cm4gYSB1bmlxdWUgaWQgZm9yIHRoaXMgZnJhbWUKLQkgKi8KLQlwdWJsaWMgaW50IGdldElkKCkKLQl7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIG5hbWUgb2YgdGhpcyBmcmFtZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIEdldCB0aGUgZmlsZSBpbiB3aGljaCB0aGlzIGZyYW1lIGlzIGZvdW5kLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZpbGVuYW1lIGZvciB0aGlzCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRGaWxlbmFtZSgpOwotCi0JLyoqCi0JICogR2V0IHRoZSBsaW5lIG51bWJlciBhdCB3aGljaCB0aGUgZnJhbWUgaXMgY3VycmVudGx5IGxvY2F0ZWQuCi0JICogCi0JICogQHJldHVybiB0aGUgbGluZSBudW1iZXIgYXQgd2hpY2ggdGhpcyBpcyBoZWxkCi0JICovCi0JcHVibGljIGFic3RyYWN0IGludCBnZXRDdXJyZW50TGluZSgpOwotCi0JLyoqCi0JICogR2V0IGEgbGlzdCBvZiA8Y29kZT5WYXJpYWJsZXM8L2NvZGU+J3MKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIHZhcmlhYmxlcyBmb3IgdGhpcyBmcmFtZQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBMaXN0IGdldFZhcmlhYmxlU3RhY2soKTsKLQotCS8qKgotCSAqIEdldCB0aGUgcGFyZW50IG9mIHRoaXMuCi0JICogCi0JICogQHJldHVybiB0aGUgcGFyZW50IGZyYW1lCi0JICovCi0JcHVibGljIFN0eWxlRnJhbWUgZ2V0UGFyZW50KCkKLQl7Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogQWRkIGEgY2hpbGQgZnJhbWUgdG8gdGhpcy4KLQkgKiAKLQkgKiBAcGFyYW0gY2hpbGQgdGhlIGZyYW1lIHRvIGFkZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENoaWxkKFN0eWxlRnJhbWUgY2hpbGQpCi0JewotCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhIGNoaWxkIGZyYW1lIGZyb20gdGhpcy4KLQkgKiAKLQkgKiBAcGFyYW0gY2hpbGQgdGhlIGZyYW1lIHRvIHJlbW92ZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUNoaWxkKFN0eWxlRnJhbWUgY2hpbGQpCi0JewotCQljaGlsZHJlbi5yZW1vdmUoY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgY2hpbGRyZW4gb2YgdGhpcwotCSAqIAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIDxjb2RlPlN0eWxlRnJhbWU8L2NvZGU+J3MKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbigpCi0JewotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHN0cmluZyBpbiB0aGUgZm9ybWF0IDxpPmZpbGU8L2k+fDxpPmZyYW1lSWQ8L2k+fDxpPmxpbmVOdW1iZXI8L2k+fDxpPm5hbWU8L2k+LgotCSAqIFNpbmNlIHBpcGUgaXMgdXNlZCBhcyBhIHNlcGFyYXRvciwgdGhlIG5hbWUgaGFzIGFueSBwaXBlICh8KSBjaGFyYWN0ZXJzIHJlcGxhY2VkIHdpdGggdGhlIGxpdGVyYWwgJyVAX1BJUEVfQCUnCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlTdHJpbmcgc2FmZW5hbWUgPSBnZXROYW1lKCkucmVwbGFjZUFsbCgiXFx8IiwgIiVAX1BJUEVfQCUiKTsgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCXJldHVybiBnZXRGaWxlbmFtZSgpICsgInwiICsgZ2V0SWQoKSArICJ8IiArIGdldEN1cnJlbnRMaW5lKCkgKyAifCIgKyBzYWZlbmFtZTsgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMyQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2RlYnVnL2RlYnVnZ2VyL1ZhcmlhYmxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2RlYnVnL2RlYnVnZ2VyL1ZhcmlhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZTI1ZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9kZWJ1Zy9kZWJ1Z2dlci9WYXJpYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIERhdmlkIENhcnZlciAoU1RBUikgLSBidWcgMjE0MjM1IC0gQ2hhbmdlZCBtYXggdmFsdWUgc2l6ZSB0byAybWVnLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy5kZWJ1Z2dlcjsKLQotLyoqCi0gKiBBbiBhYnN0cmFjdCBjbGFzcyB0aGF0IFhTTCBwcm9jZXNzb3IgaW1wbGVtZW50YXRpb25zIGNhbiBzdWJjbGFzcyBmb3IgdGhlaXIgdmFyaWFibGVzLgotICogCi0gKiBAYXV0aG9yIERvdWcgU2F0Y2h3ZWxsCi0gKiBAYXV0aG9yIERhdmlkIENhcnZlcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVmFyaWFibGUKLXsKLQlwcml2YXRlIHN0YXRpYyBpbnQgaWRTZXF1ZW5jZSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RhbnQgZGVub3RpbmcgYSBsb2NhbCBzY29wZSB2YXJpYWJsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTF9TQ09QRSA9ICJMIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFRoZSBjb25zdGFudCBkZW5vdGluZyBhIHR1bm5lbCBzY29wZSB2YXJpYWJsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUVU5ORUxfU0NPUEUgPSAiVCI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBUaGUgY29uc3RhbnQgZGVub3RpbmcgYSBnbG9iYWwgc2NvcGUgdmFyaWFibGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0xPQkFMX1NDT1BFID0gIkciOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGludCBNQVhJTVVNX1ZBTFVFX1NJWkUgPSAyMDk3MTUyOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5SRVNPTFZFRCA9ICJ1bnJlc29sdmVkIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEJPT0xFQU4gPSAiYm9vbGVhbiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOVU1CRVIgPSAibnVtYmVyIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUklORyA9ICJzdHJpbmciOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERVNFVCA9ICJub2Rlc2V0IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE9CSkVDVCA9ICJvYmplY3QiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5LTk9XTiA9ICJ1bmtub3duIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBuYW1lOwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgc2NvcGU7Ci0JcHJvdGVjdGVkIGZpbmFsIGludCBzbG90TnVtYmVyOwotCi0JcHJpdmF0ZSBpbnQgaWQ7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyB3aXRoIHRoZSBnaXZlbiBuYW1lLCBzY29wZSBhbmQgc2xvdCBudW1iZXIuCi0JICogCi0JICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhpcwotCSAqIEBwYXJhbSBzY29wZSB0aGUgc2NvcGUgb2YgdGhpcwotCSAqIEBwYXJhbSBzbG90TnVtYmVyIHRoZSBzbG90IG51bWJlciBvZiB0aGlzCi0JICovCi0JcHVibGljIFZhcmlhYmxlKFN0cmluZyBuYW1lLCBTdHJpbmcgc2NvcGUsIGludCBzbG90TnVtYmVyKQotCXsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5zY29wZSA9IHNjb3BlOwotCQl0aGlzLnNsb3ROdW1iZXIgPSBzbG90TnVtYmVyOwotCQl0aGlzLmlkID0gaWRTZXF1ZW5jZSsrOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgaWQgdXNlZCBmb3IgdGhpcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YXJpYWJsZSBpZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SWQoKQotCXsKLQkJcmV0dXJuIGlkOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIHZhcmlhYmxlIG5hbWUuCi0JICogCi0JICogQHJldHVybiB0aGUgdmFyaWFibGUgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHR5cGUgb2YgdGhpcyB2YXJpYWJsZSBlLmcuIHN0cmluZywgb3Igbm9kZQotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhcmlhYmxlIHR5cGUKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFR5cGUoKTsKLQotCS8qKgotCSAqIEdldCB0aGUgc2NvcGUgb2YgdGhpcyB2YXJpYWJsZSAtIG9uZSBvZiA8Y29kZT5MT0NBTF9TQ09QRTwvY29kZT4sIDxjb2RlPlRVTk5FTF9TQ09QRTwvY29kZT4gb3IgPGNvZGU+R0xPQkFMX1NDT1BFPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YXJpYWJsZSBzY29wZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2NvcGUoKQotCXsKLQkJcmV0dXJuIHNjb3BlOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGlzIHZhcmlhYmxlIGFzIGEgU3RyaW5nLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoaXMKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIHZhbHVlIHRydW5jYXRpbmcgdG8gPGNvZGU+TUFYSU1VTV9WQUxVRV9TSVpFPC9jb2RlPiB3aGVyZSBuZWNlc3NhcnkuCi0JICogCi0JICogQHJldHVybiB0aGUgZmlyc3QgbGluZSBvZiB0aGUgdmFsdWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlRmlyc3RMaW5lKCkKLQl7Ci0JCVN0cmluZyB2YWx1ZSA9IGdldFZhbHVlKCk7Ci0JCWlmICh2YWx1ZSAhPSBudWxsKQotCQl7Ci0JCQkvLyBtYWtlIHN1cmUgaXQgaXMgbm90IHRvbyBsb25nCi0JCQl2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoJ1xuJywgJy4nKTsKLQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA+IE1BWElNVU1fVkFMVUVfU0laRSkKLQkJCQl2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZygwLCBNQVhJTVVNX1ZBTFVFX1NJWkUpOwotCQl9Ci0JCWVsc2UKLQkJCXZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgc2xvdCBudW1iZXIgZm9yIHRoaXMuCi0JICogCi0JICogQHJldHVybiB0aGUgc2xvdCBudW1iZXIKLQkgKi8KLQlwdWJsaWMgaW50IGdldFNsb3ROdW1iZXIoKQotCXsKLQkJcmV0dXJuIHNsb3ROdW1iZXI7Ci0JfQotCi0JcHVibGljIGludCBoYXNoQ29kZSgpCi0JewotCQlyZXR1cm4gMyAqIHNjb3BlLmhhc2hDb2RlKCkgKyA1ICogc2xvdE51bWJlcjsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopCi0JewotCQlpZiAob2JqID09IHRoaXMpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFZhcmlhYmxlKQotCQl7Ci0JCQlWYXJpYWJsZSB2ID0gKFZhcmlhYmxlKSBvYmo7Ci0JCQlyZXR1cm4gdi5zY29wZS5lcXVhbHMoc2NvcGUpICYmIHNsb3ROdW1iZXIgPT0gdi5zbG90TnVtYmVyOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvZGVidWcvaW52b2tlci9JUHJvY2Vzc29ySW52b2tlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9kZWJ1Zy9pbnZva2VyL0lQcm9jZXNzb3JJbnZva2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYjY1N2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9kZWJ1Zy9pbnZva2VyL0lQcm9jZXNzb3JJbnZva2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcuaW52b2tlcjsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5VUklSZXNvbHZlcjsKLQotCi0vKioKLSAqIEludGVyZmFjZSB1c2VkIGJ5IHRoZSBsYXVuY2hlZCBwcm9jZXNzIHRvIGRlZmluZSB0aGUgWFNMIHRyYW5zZm9ybWF0aW9uIHBpcGVsaW5lLgotICogVGhlIDxjb2RlPnNldEF0dHJpYnV0ZXM8L2NvZGU+IGFuZCA8Y29kZT5hZGRTdHlsZXNoZWV0PC9jb2RlPiBtZXRob2RzIHNob3VsZCBiZSBjYWxsZWQKLSAqIGJlZm9yZSBjYWxsaW5nIDxjb2RlPnRyYW5zZm9ybTwvY29kZT4gdG8gZG8gdGhlIGFjdHVhbCB0cmFuc2Zvcm1hdGlvbi4KLSAqIAotICogPHA+Ci0gKiBJZiA8Y29kZT5hZGRTdHlsZXNoZWV0PC9jb2RlPiBpcyBub3QgY2FsbGVkIGJlZm9yZSA8Y29kZT50cmFuc2Zvcm08L2NvZGU+LCB0aGVuCi0gKiBpdCBpcyBhc3N1bWVkIHRoYXQgdGhlIHNvdXJjZSBkb2N1bWVudCBjb250YWlucyBhbmQgZW1iZWRkZWQgc3R5bGVzaGVldCBpbnN0cnVjdGlvbi4KLSAqIDwvcD4KLSAqIAotICogQGF1dGhvciBEb3VnIFNhdGNod2VsbAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQcm9jZXNzb3JJbnZva2VyCi17Ci0JLyoqCi0JICogU2V0IHRoZSBwcm9jZXNzb3Itc3BlY2lmaWMgYXR0cmlidXRlcyB0byB1c2UuCi0JICogCi0JICogQHBhcmFtIGF0dHJpYnV0ZXMgYSBtYXAgb2YgU3RyaW5nIHYuIFN0cmluZyBhdHRyaWJ1dGVzCi0JICovCi0Jdm9pZCBzZXRBdHRyaWJ1dGVzKE1hcCBhdHRyaWJ1dGVzKTsKLQotCS8qKgotCSAqIEFkZCBhIHN0eWxlc2hlZXQgdG8gdGhlIHBpcGVsaW5lIChvcmRlciBpcyBpbXBvcnRhbnQpLgotCSAqIAotCSAqIEBwYXJhbSBzdHlsZXNoZWV0IHRoZSBVUkwgb2YgdGhlIHN0eWxlc2hlZXQgdG8gYWRkCi0JICogQHBhcmFtIHBhcmFtZXRlcnMgdGhlIG1hcCBvZiBwYXJhbWV0ZXJzIGZvciB0aGUgc3R5bGVzaGVldAotCSAqIEBwYXJhbSBvdXRwdXRQcm9wZXJ0aWVzIHRoZSBvdXRwdXQgcHJvcGVydGllcwotCSAqIEBwYXJhbSByZXNvbHZlciB0aGUgPGNvZGU+VVJJUmVzb2x2ZXI8L2NvZGU+IHRvIHVzZQotCSAqIEB0aHJvd3MgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGlmIHN0eWxlc2hlZXQgY291bGQgbm90IGJlIGFkZGVkCi0JICovCi0Jdm9pZCBhZGRTdHlsZXNoZWV0KFVSTCBzdHlsZXNoZWV0LCBNYXAgcGFyYW1ldGVycywgUHJvcGVydGllcyBvdXRwdXRQcm9wZXJ0aWVzLCBVUklSZXNvbHZlciByZXNvbHZlcikgdGhyb3dzIFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFBlcmZvcm0gdGhlIGFjdHVhbCB0cmFuc2Zvcm1hdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlIHRoZSBVUkwgb2YgdGhlIFhNTCBzb3VyY2UgZG9jdW1lbnQKLQkgKiBAcGFyYW0gcmVzIHRoZSB0cmFuc2Zvcm1hdGlvbiByZXN1bHQKLQkgKiBAdGhyb3dzIFRyYW5zZm9ybWF0aW9uRXhjZXB0aW9uIGlmIHRoZSB0cmFuc2Zvcm1hdGlvbiBmYWlsZWQKLQkgKi8KLQl2b2lkIHRyYW5zZm9ybShVUkwgc291cmNlLCBSZXN1bHQgcmVzKSB0aHJvd3MgVHJhbnNmb3JtYXRpb25FeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2RlYnVnL2ludm9rZXIvTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvZGVidWcvaW52b2tlci9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTY5NDJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvZGVidWcvaW52b2tlci9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLmludm9rZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoqCi0gKiBNZXNzYWdlcyBmb3IgdGhlIGNvbmZpZ3VyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgRG91ZyBTYXRjaHdlbGwKLSAqLwotY2xhc3MgTWVzc2FnZXMKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLmludm9rZXIubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoQlVORExFX05BTUUpOwotCi0JcHJpdmF0ZSBNZXNzYWdlcygpCi0JewotCX0KLQotCS8qKgotCSAqIEdldCBhIG1lc3NhZ2UgZm9yIHRoZSBnaXZlbiBrZXkuCi0JICogCi0JICogQHBhcmFtIGtleSB0aGUgbWVzc2FnZSBrZXkKLQkgKiBAcmV0dXJuIHRoZSBtZXNzYWdlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpCi0JewotCQl0cnkKLQkJewotCQkJcmV0dXJuIFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoa2V5KTsKLQkJfQotCQljYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpCi0JCXsKLQkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2RlYnVnL2ludm9rZXIvUGlwZWxpbmVEZWZpbml0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2RlYnVnL2ludm9rZXIvUGlwZWxpbmVEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5OGY5OTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9kZWJ1Zy9pbnZva2VyL1BpcGVsaW5lRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy5pbnZva2VyOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy5pbnZva2VyLmludGVybmFsLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLmludm9rZXIuaW50ZXJuYWwuQ3JlYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLS8qKgotICogVGhlIGRlZmluaXRpb24gb2YgdGhlIHRyYW5zZm9ybWF0aW9uIHBpcGVsaW5lLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIGxvYWRlZCBvbiBib3RoIHRoZSBFY2xpcHNlIGNsYXNzcGF0aCBhbmQgdGhlIHRyYW5zZm9ybWF0aW9uIHByb2Nlc3MncyBjbGFzc3BhdGguCi0gKiBUaGUgd2hvbGUgZGVmaW5pdGlvbiBpcyBzZXJpYWxpemVkIHRvIGFuIFhNTCBkb2N1bWVudCBieSB0aGUgRWNsaXBzZSBsYXVuY2hlciwgYW5kIGlzIHRoZW4gCi0gKiByZWFkIGJ5IHRoZSB0cmFuc2Zvcm1hdGlvbiBwcm9jZXNzIHdoZW4gbGF1bmNoZWQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBhdXRob3IgRG91ZyBTYXRjaHdlbGwKLSAqLwotcHVibGljIGNsYXNzIFBpcGVsaW5lRGVmaW5pdGlvbgotewotCXByaXZhdGUgU3RyaW5nIHNvdXJjZVVSTDsKLQlwcml2YXRlIFN0cmluZyB0YXJnZXRGaWxlOwotCXByaXZhdGUgZmluYWwgTGlzdCB0cmFuc2Zvcm1EZWZzID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgZmluYWwgU2V0IGF0dHJpYnV0ZXMgPSBuZXcgSGFzaFNldCgpOwotCXByaXZhdGUgYm9vbGVhbiB1c2VFbWJlZGRlZDsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBlbXB0eSBpbnN0YW5jZSBvZiB0aGlzLgotCSAqLwotCXB1YmxpYyBQaXBlbGluZURlZmluaXRpb24oKQotCXsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBieSByZWFkaW5nIHRoZSBzcGVjaWZpZWQgWE1MIGZpbGUuCi0JICogCi0JICogQHBhcmFtIGxhdW5jaEZpbGUgdGhlIFhTTCBmaWxlIHRvIGxvYWQKLQkgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBpZiBwcm9ibGVtcyBvY2N1ciBkdXJpbmcgcGFyc2luZwotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgcHJvYmxlbXMgb2NjdXIgZHVyaW5nIHBhcnNpbmcKLQkgKiBAdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gaWYgcHJvYmxlbXMgb2NjdXIgZHVyaW5nIHBhcnNpbmcKLQkgKi8KLQlwdWJsaWMgUGlwZWxpbmVEZWZpbml0aW9uKEZpbGUgbGF1bmNoRmlsZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KLQl7Ci0JCXRoaXMoRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpLnBhcnNlKG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0obGF1bmNoRmlsZSkpKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgZnJvbSB0aGUgc3BlY2lmaWVkIGRvY3VtZW50Ci0JICogCi0JICogQHBhcmFtIGRvYyB0aGUgRG9jdW1lbnQgdG8gY3JlYXRlIHRoaXMgZnJvbQotCSAqLwotCXB1YmxpYyBQaXBlbGluZURlZmluaXRpb24oRG9jdW1lbnQgZG9jKQotCXsKLQkJRWxlbWVudCByb290RWwgPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0KLQkJRWxlbWVudCBhdHRyaWJ1dGVzRWwgPSAoRWxlbWVudCkgcm9vdEVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBdHRyaWJ1dGVzIikuaXRlbSgwKTsgLy8kTk9OLU5MUy0xJAotCQlOb2RlTGlzdCBhdHRyaWJ1dGVFbHMgPSBhdHRyaWJ1dGVzRWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkF0dHJpYnV0ZSIpOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlRWxzLmdldExlbmd0aCgpOyBpKyspCi0JCXsKLQkJCUVsZW1lbnQgYXR0cmlidXRlRWwgPSAoRWxlbWVudCkgYXR0cmlidXRlRWxzLml0ZW0oaSk7Ci0JCQlTdHJpbmcgbmFtZSA9IGF0dHJpYnV0ZUVsLmdldEF0dHJpYnV0ZSgibmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgdHlwZSA9IGF0dHJpYnV0ZUVsLmdldEF0dHJpYnV0ZSgidHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgdmFsdWUgPSBhdHRyaWJ1dGVFbC5nZXRBdHRyaWJ1dGUoInZhbHVlIik7IC8vJE5PTi1OTFMtMSQKLQkJCWFkZEF0dHJpYnV0ZShuZXcgVHlwZWRWYWx1ZShuYW1lLCB0eXBlLCB2YWx1ZSkpOwotCQl9Ci0KLQkJRWxlbWVudCB0cmFuc2Zvcm1zRWwgPSAoRWxlbWVudCkgcm9vdEVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJUcmFuc2Zvcm1zIikuaXRlbSgwKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgdXNlRW1iZWRkZWQgPSB0cmFuc2Zvcm1zRWwuZ2V0QXR0cmlidXRlKCJ1c2VFbWJlZGRlZCIpOyAvLyROT04tTkxTLTEkCi0JCWJvb2xlYW4gZW1iZWRkZWQgPSBCb29sZWFuLmdldEJvb2xlYW4odXNlRW1iZWRkZWQpOwotCQlzZXRVc2VFbWJlZGRlZChlbWJlZGRlZCk7Ci0JCWlmICghZW1iZWRkZWQpCi0JCXsKLQkJCU5vZGVMaXN0IHRyYW5zZm9ybUVscyA9IHRyYW5zZm9ybXNFbC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVHJhbnNmb3JtIik7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdHJhbnNmb3JtRWxzLmdldExlbmd0aCgpOyBpKyspCi0JCQl7Ci0JCQkJRWxlbWVudCB0cmFuc2Zvcm1FbCA9IChFbGVtZW50KSB0cmFuc2Zvcm1FbHMuaXRlbShpKTsKLQkJCQlUcmFuc2Zvcm1EZWZpbml0aW9uIHRkZWYgPSBUcmFuc2Zvcm1EZWZpbml0aW9uLmZyb21YTUwodHJhbnNmb3JtRWwpOwotCQkJCWFkZFRyYW5zZm9ybURlZih0ZGVmKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENvbmZpZ3VyZSB0aGUgaW52b2tlciBmcm9tIHRoaXMuCi0JICogCi0JICogQHBhcmFtIGludm9rZXIgdGhlIGludm9rZXIgdG8gY29uZmlndXJlCi0JICogQHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgZHVyaW5nIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb25maWd1cmUoSVByb2Nlc3Nvckludm9rZXIgaW52b2tlcikgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KLQl7Ci0JCU1hcCBhdHRWYWxzID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYXR0cmlidXRlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0JCXsKLQkJCVR5cGVkVmFsdWUgYXR0ID0gKFR5cGVkVmFsdWUpIGl0ZXIubmV4dCgpOwotCQkJT2JqZWN0IHZhbHVlOwotCQkJdHJ5Ci0JCQl7Ci0JCQkJdmFsdWUgPSBhdHQuY3JlYXRlVmFsdWUoKTsKLQkJCX0KLQkJCWNhdGNoIChDcmVhdGlvbkV4Y2VwdGlvbiBlKQotCQkJewotCQkJCXRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCX0KLQkJCWF0dFZhbHMucHV0KGF0dC51cmksIHZhbHVlKTsKLQkJfQotCQlpbnZva2VyLnNldEF0dHJpYnV0ZXMoYXR0VmFscyk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdHJhbnNmb3JtRGVmcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0JCXsKLQkJCVRyYW5zZm9ybURlZmluaXRpb24gdGRlZiA9IChUcmFuc2Zvcm1EZWZpbml0aW9uKSBpdGVyLm5leHQoKTsKLQkJCU1hcCBwYXJhbXMgPSBudWxsOwotCQkJdHJ5Ci0JCQl7Ci0JCQkJcGFyYW1zID0gdGRlZi5nZXRQYXJhbWV0ZXJzQXNNYXAoKTsKLQkJCX0KLQkJCWNhdGNoIChDcmVhdGlvbkV4Y2VwdGlvbiBlKQotCQkJewotCQkJCXRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiUGlwZWxpbmVEZWZpbml0aW9uLjgiKSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCVVSTCB1cmwgPSBudWxsOwotCQkJdHJ5Ci0JCQl7Ci0JCQkJdXJsID0gbmV3IFVSTCh0ZGVmLmdldFN0eWxlc2hlZXRVUkwoKSk7Ci0JCQl9Ci0JCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpCi0JCQl7Ci0JCQkJdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJQaXBlbGluZURlZmluaXRpb24uOSIpICsgdGRlZi5nZXRTdHlsZXNoZWV0VVJMKCksIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSB0ZGVmLmdldE91dHB1dFByb3BlcnRpZXMoKTsKLQkJCXRyeQotCQkJewotCQkJCWludm9rZXIuYWRkU3R5bGVzaGVldCh1cmwsIHBhcmFtcywgcHJvcGVydGllcywgbnVsbCk7Ci0JCQl9Ci0JCQljYXRjaCAoVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpCi0JCQl7Ci0JCQkJdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJQaXBlbGluZURlZmluaXRpb24uMTAiKSArIHRkZWYuZ2V0U3R5bGVzaGVldFVSTCgpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBzZXQgb2YgYXR0cmlidXRlcyBkZWZpbmVkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNldCBvZiBhdHRyaWJ1dGVzCi0JICovCi0JcHVibGljIFNldCBnZXRBdHRyaWJ1dGVzKCkKLQl7Ci0JCXJldHVybiBhdHRyaWJ1dGVzOwotCX0KLQotCS8qKgotCSAqIEFkZCBhIGF0dHJpYnV0ZSB0byB0aGlzIGNvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gYXR0cmlidXRlIHRoZSBhdHRyaWJ1dGUgdG8gYWRkCi0JICovCi0JcHVibGljIHZvaWQgYWRkQXR0cmlidXRlKFR5cGVkVmFsdWUgYXR0cmlidXRlKQotCXsKLQkJYXR0cmlidXRlcy5hZGQoYXR0cmlidXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYSBhdHRyaWJ1dGUgZnJvbSB0aGUgc2V0IG9mIGF0dHJpYnV0ZXMKLQkgKiAKLQkgKiBAcGFyYW0gYXR0cmlidXRlIHRoZSBhdHRyaWJ1dGUgdG8gcmVtb3ZlCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlKFR5cGVkVmFsdWUgYXR0cmlidXRlKQotCXsKLQkJYXR0cmlidXRlcy5yZW1vdmUoYXR0cmlidXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGxpc3Qgb2YgPGNvZGU+VHJhbnNmb3JtRGVmaW5pdGlvbjwvY29kZT4ncy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIHRyYW5zZm9ybSBkZWZpbml0aW9ucwotCSAqLwotCXB1YmxpYyBMaXN0IGdldFRyYW5zZm9ybURlZnMoKQotCXsKLQkJcmV0dXJuIHRyYW5zZm9ybURlZnM7Ci0JfQotCi0JLyoqCi0JICogQWRkIGEgdHJhbnNmb3JtIGRlZmluaXRpb24gdG8gdGhpcy4KLQkgKiAKLQkgKiBAcGFyYW0gdGRlZiB0aGUgdHJhbnNmb3JtIGRlZmluaXRpb24gdG8gYWRkCi0JICovCi0JcHVibGljIHZvaWQgYWRkVHJhbnNmb3JtRGVmKFRyYW5zZm9ybURlZmluaXRpb24gdGRlZikKLQl7Ci0JCXRyYW5zZm9ybURlZnMuYWRkKHRkZWYpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhIHRyYW5zZm9ybSBkZWZpbml0aW9uIGZyb20gdGhpcy4KLQkgKiAKLQkgKiBAcGFyYW0gdGRlZiB0aGUgdHJhbnNmb3JtIGRlZmluaXRpb24gdG8gcmVtb3ZlCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlVHJhbnNmb3JtRGVmKFRyYW5zZm9ybURlZmluaXRpb24gdGRlZikKLQl7Ci0JCXRyYW5zZm9ybURlZnMucmVtb3ZlKHRkZWYpOwotCX0KLQotCS8qKgotCSAqIFNldCB3aGV0aGVyIHRvIHVzZSBhbiBYU0wgZGVjbGFyYXRpb24gZW1iZWRkZWQgaW4gdGhlIFhNTCBmaWxlIAotCSAqIAotCSAqIEBwYXJhbSBlbWJlZGRlZCB0cnVlIHRvIHVzZSBlbWJlZGRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVzZUVtYmVkZGVkKGJvb2xlYW4gZW1iZWRkZWQpCi0JewotCQl1c2VFbWJlZGRlZCA9IGVtYmVkZGVkOwotCX0KLQotCS8qKgotCSAqIEdldCB3aGV0aGVyIHRvIHVzZSBhbiBYU0wgZGVjbGFyYXRpb24gZW1iZWRkZWQgaW4gdGhlIFhNTCBmaWxlIAotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBlbWJlZGRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHVzZUVtYmVkZGVkKCkKLQl7Ci0JCXJldHVybiB1c2VFbWJlZGRlZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXJpYWxpemUgdGhpcyB0byBhIERPTSBEb2N1bWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzZXJpYWxpemVkIGRvY3VtZW50Ci0JICogQHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGlmIGEgcHJvYmxlbSBvY2N1cnMgZHVyaW5nIHNlcmlhbGl6YXRpb24KLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnQgdG9YTUwoKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotCXsKLQkJRG9jdW1lbnQgZG9jID0gbmV3RG9jdW1lbnQoKTsKLQkJRWxlbWVudCByb290RWwgPSBkb2MuY3JlYXRlRWxlbWVudCgiUGlwZWxpbmUiKTsgLy8kTk9OLU5MUy0xJAotCQlyb290RWwuc2V0QXR0cmlidXRlKCJzb3VyY2UiLCBzb3VyY2VVUkwpOyAvLyROT04tTkxTLTEkCi0JCXJvb3RFbC5zZXRBdHRyaWJ1dGUoInRhcmdldCIsIHRhcmdldEZpbGUpOyAvLyROT04tTkxTLTEkCi0JCWRvYy5hcHBlbmRDaGlsZChyb290RWwpOwotCi0JCUVsZW1lbnQgYXR0cmlidXRlc0VsID0gZG9jLmNyZWF0ZUVsZW1lbnQoIkF0dHJpYnV0ZXMiKTsgLy8kTk9OLU5MUy0xJAotCQlyb290RWwuYXBwZW5kQ2hpbGQoYXR0cmlidXRlc0VsKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYXR0cmlidXRlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0JCXsKLQkJCVR5cGVkVmFsdWUgYXR0cmlidXRlID0gKFR5cGVkVmFsdWUpIGl0ZXIubmV4dCgpOwotCQkJRWxlbWVudCBhdHRyaWJ1dGVFbCA9IGRvYy5jcmVhdGVFbGVtZW50KCJBdHRyaWJ1dGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJYXR0cmlidXRlRWwuc2V0QXR0cmlidXRlKCJuYW1lIiwgYXR0cmlidXRlLnVyaSk7IC8vJE5PTi1OTFMtMSQKLQkJCWF0dHJpYnV0ZUVsLnNldEF0dHJpYnV0ZSgidHlwZSIsIGF0dHJpYnV0ZS50eXBlKTsgLy8kTk9OLU5MUy0xJAotCQkJYXR0cmlidXRlRWwuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIGF0dHJpYnV0ZS52YWx1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCWF0dHJpYnV0ZXNFbC5hcHBlbmRDaGlsZChhdHRyaWJ1dGVFbCk7Ci0JCX0KLQotCQlyb290RWwuc2V0QXR0cmlidXRlKCJ1c2VFbWJlZGRlZCIsIFN0cmluZy52YWx1ZU9mKHVzZUVtYmVkZGVkKSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCF1c2VFbWJlZGRlZCkKLQkJewotCQkJRWxlbWVudCB0cmFuc2Zvcm1zRWwgPSBkb2MuY3JlYXRlRWxlbWVudCgiVHJhbnNmb3JtcyIpOyAvLyROT04tTkxTLTEkCi0JCQlyb290RWwuYXBwZW5kQ2hpbGQodHJhbnNmb3Jtc0VsKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHRyYW5zZm9ybURlZnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotCQkJewotCQkJCVRyYW5zZm9ybURlZmluaXRpb24gdGRlZiA9IChUcmFuc2Zvcm1EZWZpbml0aW9uKSBpdGVyLm5leHQoKTsKLQkJCQlFbGVtZW50IHRkZWZFbCA9IHRkZWYuYXNYTUwoZG9jKTsKLQkJCQl0cmFuc2Zvcm1zRWwuYXBwZW5kQ2hpbGQodGRlZkVsKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBkb2M7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRG9jdW1lbnQgbmV3RG9jdW1lbnQoKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotCXsKLQkJRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkJRG9jdW1lbnRCdWlsZGVyIGRvY0J1aWxkZXIgPSBkZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLQkJRG9jdW1lbnQgZG9jID0gZG9jQnVpbGRlci5uZXdEb2N1bWVudCgpOwotCQlyZXR1cm4gZG9jOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvZGVidWcvaW52b2tlci9UcmFuc2Zvcm1EZWZpbml0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2RlYnVnL2ludm9rZXIvVHJhbnNmb3JtRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Njc5ZDkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvZGVidWcvaW52b2tlci9UcmFuc2Zvcm1EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLmludm9rZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLmludm9rZXIuaW50ZXJuYWwuQ3JlYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotLyoqCi0gKiBBIGRlZmluaXRpb24gb2YgYSBwYXJ0aWN1bGFyIHN0ZXAgaW4gdGhlIHRyYW5zZm9ybWF0aW9uIHBpcGVsaW5lLgotICogCi0gKiBAYXV0aG9yIERvdWcgU2F0Y2h3ZWxsCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFuc2Zvcm1EZWZpbml0aW9uCi17Ci0JcHJpdmF0ZSBTdHJpbmcgc3R5bGVzaGVldFVSTDsKLQlwcml2YXRlIFN0cmluZyByZXNvbHZlckNsYXNzOwotCXByaXZhdGUgUHJvcGVydGllcyBvdXRwdXRQcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLQlwcml2YXRlIGZpbmFsIFNldCBwYXJhbWV0ZXJzID0gbmV3IEhhc2hTZXQoKTsKLQotCS8qKgotCSAqIEdldCB0aGUgcGFyYW1ldGVycyBhcyBhIG1hcCBvZiBuYW1lICg8Y29kZT5TdHJpbmc8L2NvZGU+KSB2LiB2YWx1ZSA8Y29kZT5UeXBlZFZhbHVlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWFwIG9mIG5hbWVzIGFuZCB2YWx1ZXMKLQkgKiBAdGhyb3dzIENyZWF0aW9uRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnJlZCBkdXJpbmcgb2JqZWN0IGNyZWF0aW9uCi0JICovCi0JcHVibGljIE1hcCBnZXRQYXJhbWV0ZXJzQXNNYXAoKSB0aHJvd3MgQ3JlYXRpb25FeGNlcHRpb24KLQl7Ci0JCU1hcCBtID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcGFyYW1ldGVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0JCXsKLQkJCVR5cGVkVmFsdWUgdHYgPSAoVHlwZWRWYWx1ZSkgaXRlci5uZXh0KCk7Ci0JCQlTdHJpbmcga2V5ID0gdHYudXJpOwotCQkJT2JqZWN0IHZhbHVlID0gdHYuY3JlYXRlVmFsdWUoKTsKLQkJCW0ucHV0KGtleSwgdmFsdWUpOwotCQl9Ci0JCXJldHVybiBtOwotCX0KLQotCS8qKgotCSAqIFRoZSBzZXQgb2YgcGFyYW1ldGVycwotCSAqIAotCSAqIEByZXR1cm4gYSBzZXQgb2YgPGNvZGU+VHlwZWRWYWx1ZTwvY29kZT4ncwotCSAqLwotCXB1YmxpYyBTZXQgZ2V0UGFyYW1ldGVycygpCi0JewotCQlyZXR1cm4gcGFyYW1ldGVyczsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYSBwYXJhbWV0ZXIgdG8gdGhlIHNldCBvZiBwYXJhbWV0ZXJzCi0JICogCi0JICogQHBhcmFtIHBhcmFtZXRlciB0aGUgcGFyYW1ldGVyIHRvIGFkZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBhcmFtZXRlcihUeXBlZFZhbHVlIHBhcmFtZXRlcikKLQl7Ci0JCXBhcmFtZXRlcnMuYWRkKHBhcmFtZXRlcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGEgcGFyYW1ldGVyLgotCSAqIAotCSAqIEBwYXJhbSBwYXJhbWV0ZXIgdGhlIHBhcmFtZXRlciB0byByZW1vdmUKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQYXJhbWV0ZXIoVHlwZWRWYWx1ZSBwYXJhbWV0ZXIpCi0JewotCQlwYXJhbWV0ZXJzLnJlbW92ZShwYXJhbWV0ZXIpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgb3V0cHV0IHByb3BlcnRpZXMgZm9yIHRoaXMuCi0JICogCi0JICogQHJldHVybiB0aGUgb3V0cHV0IHByb3BlcnRpZXMKLQkgKi8KLQlwdWJsaWMgUHJvcGVydGllcyBnZXRPdXRwdXRQcm9wZXJ0aWVzKCkKLQl7Ci0JCXJldHVybiBvdXRwdXRQcm9wZXJ0aWVzOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgb3V0cHV0IHByb3BlcnRpZXMgZm9yIHRoaXMuCi0JICogCi0JICogQHBhcmFtIG91dHB1dFByb3BlcnRpZXMgdGhlIG91dHB1dCBwcm9wZXJ0aWVzIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE91dHB1dFByb3BlcnRpZXMoUHJvcGVydGllcyBvdXRwdXRQcm9wZXJ0aWVzKQotCXsKLQkJdGhpcy5vdXRwdXRQcm9wZXJ0aWVzID0gb3V0cHV0UHJvcGVydGllczsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWMgb3V0cHV0IHByb3BlcnR5LgotCSAqIAotCSAqIEBwYXJhbSBuYW1lIHRoZSBvdXRwdXQgcHJvcGVydHkKLQkgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3V0cHV0UHJvcGVydHkoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkKLQl7Ci0JCW91dHB1dFByb3BlcnRpZXMucHV0KG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYW4gb3V0cHV0IHByb3BlcnR5LgotCSAqIAotCSAqIEBwYXJhbSBuYW1lIHRoZSBvdXRwdXQgcHJvcGVydHkgdG8gcmVtb3ZlCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlT3V0cHV0UHJvcGVydHkoU3RyaW5nIG5hbWUpCi0JewotCQlvdXRwdXRQcm9wZXJ0aWVzLnJlbW92ZShuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIDxjb2RlPlVSSVJlc29sdmVyPC9jb2RlPiBjbGFzcyB0byB1c2UuCi0JICogCi0JICogQHJldHVybiB0aGUgcmVzb2x2ZXIncyBjbGFzcyBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZXNvbHZlckNsYXNzKCkKLQl7Ci0JCXJldHVybiByZXNvbHZlckNsYXNzOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgbmFtZSBvZiB0aGUgPGNvZGU+VVJJUmVzb2x2ZXI8L2NvZGU+IGNsYXNzIHRvIHVzZS4KLQkgKiAKLQkgKiAgQHBhcmFtIHJlc29sdmVyIHRoZSByZXNvbHZlcidzIGNsYXNzIG5hbWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXNvbHZlckNsYXNzKFN0cmluZyByZXNvbHZlcikKLQl7Ci0JCXJlc29sdmVyQ2xhc3MgPSByZXNvbHZlcjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIFVSTCBvZiB0aGUgc3R5bGVzaGVldC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzdHlsZXNoZWV0IFVSTAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3R5bGVzaGVldFVSTCgpCi0JewotCQlyZXR1cm4gc3R5bGVzaGVldFVSTDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIFVSTCBvZiB0aGUgc3R5bGVzaGVldC4KLQkgKiAKLQkgKiBAcGFyYW0gc3R5bGVzaGVldCB0aGUgc3R5bGVzaGVldCBVUkwKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdHlsZXNoZWV0VVJMKFN0cmluZyBzdHlsZXNoZWV0KQotCXsKLQkJc3R5bGVzaGVldFVSTCA9IHN0eWxlc2hlZXQ7Ci0JfQotCi0JLyoqCi0JICogU2VyaWFsaXplIHRoaXMgdG8gYSBEb2N1bWVudCBmcmFnbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jIHRoZSBkb2N1bWVudCB0byBhdHRhY2ggdG8KLQkgKiBAcmV0dXJuIHRoZSByb290IGVsZW1lbnQgb2YgdGhlIGZyYWdtZW50Ci0JICovCi0JcHVibGljIEVsZW1lbnQgYXNYTUwoRG9jdW1lbnQgZG9jKQotCXsKLQkJRWxlbWVudCB0ZGVmRWwgPSBkb2MuY3JlYXRlRWxlbWVudCgiVHJhbnNmb3JtIik7IC8vJE5PTi1OTFMtMSQKLQkJdGRlZkVsLnNldEF0dHJpYnV0ZShNZXNzYWdlcy5nZXRTdHJpbmcoIlRyYW5zZm9ybURlZmluaXRpb24uMSIpLCBzdHlsZXNoZWV0VVJMKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAocmVzb2x2ZXJDbGFzcyAhPSBudWxsKQotCQkJdGRlZkVsLnNldEF0dHJpYnV0ZSgidXJpUmVzb2x2ZXIiLCByZXNvbHZlckNsYXNzKTsgLy8kTk9OLU5MUy0xJAotCQlFbGVtZW50IG9wRWwgPSBkb2MuY3JlYXRlRWxlbWVudCgiT3V0cHV0UHJvcGVydGllcyIpOyAvLyROT04tTkxTLTEkCi0JCXRkZWZFbC5hcHBlbmRDaGlsZChvcEVsKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gb3V0cHV0UHJvcGVydGllcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLQkJewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQlFbGVtZW50IHByb3BFbCA9IGRvYy5jcmVhdGVFbGVtZW50KCJQcm9wZXJ0eSIpOyAvLyROT04tTkxTLTEkCi0JCQlwcm9wRWwuc2V0QXR0cmlidXRlKCJuYW1lIiwgKFN0cmluZykgZW50cnkuZ2V0S2V5KCkpOyAvLyROT04tTkxTLTEkCi0JCQlwcm9wRWwuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIChTdHJpbmcpIGVudHJ5LmdldFZhbHVlKCkpOyAvLyROT04tTkxTLTEkCi0JCQlvcEVsLmFwcGVuZENoaWxkKHByb3BFbCk7Ci0JCX0KLQkJRWxlbWVudCBwYXJhbXNFbCA9IGRvYy5jcmVhdGVFbGVtZW50KCJQYXJhbWV0ZXJzIik7IC8vJE5PTi1OTFMtMSQKLQkJdGRlZkVsLmFwcGVuZENoaWxkKHBhcmFtc0VsKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcGFyYW1ldGVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0JCXsKLQkJCUVsZW1lbnQgcHJvcEVsID0gZG9jLmNyZWF0ZUVsZW1lbnQoIlBhcmFtZXRlciIpOyAvLyROT04tTkxTLTEkCi0JCQlUeXBlZFZhbHVlIHBhcmFtID0gKFR5cGVkVmFsdWUpIGl0ZXIubmV4dCgpOwotCQkJcHJvcEVsLnNldEF0dHJpYnV0ZSgibmFtZSIsIHBhcmFtLnVyaSk7IC8vJE5PTi1OTFMtMSQKLQkJCXByb3BFbC5zZXRBdHRyaWJ1dGUoInR5cGUiLCBwYXJhbS50eXBlKTsgLy8kTk9OLU5MUy0xJAotCQkJcHJvcEVsLnNldEF0dHJpYnV0ZSgidmFsdWUiLCBwYXJhbS52YWx1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCXBhcmFtc0VsLmFwcGVuZENoaWxkKHByb3BFbCk7Ci0JCX0KLQkJcmV0dXJuIHRkZWZFbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBmcm9tIGl0cyBzZXJpYWxpemVkIGZvcm0uCi0JICogCi0JICogQHBhcmFtIHRyYW5zZm9ybUVsIHRoZSBlbGVtZW50IHRvIGNyZWF0ZSB0aGlzIGZyb20KLQkgKiBAcmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRyYW5zZm9ybURlZmluaXRpb24gZnJvbVhNTChFbGVtZW50IHRyYW5zZm9ybUVsKQotCXsKLQkJVHJhbnNmb3JtRGVmaW5pdGlvbiB0ZGVmID0gbmV3IFRyYW5zZm9ybURlZmluaXRpb24oKTsKLQkJU3RyaW5nIHVybCA9IHRyYW5zZm9ybUVsLmdldEF0dHJpYnV0ZSgidXJsIik7IC8vJE5PTi1OTFMtMSQKLQkJdGRlZi5zZXRTdHlsZXNoZWV0VVJMKHVybCk7Ci0JCVN0cmluZyB1cmlSZXNvbHZlciA9IHRyYW5zZm9ybUVsLmdldEF0dHJpYnV0ZSgidXJpUmVzb2x2ZXIiKTsgLy8kTk9OLU5MUy0xJAotCQl0ZGVmLnNldFJlc29sdmVyQ2xhc3ModXJpUmVzb2x2ZXIpOwotCi0JCUVsZW1lbnQgb3BFbCA9IChFbGVtZW50KSB0cmFuc2Zvcm1FbC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiT3V0cHV0UHJvcGVydGllcyIpLml0ZW0oMCk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG9wRWwgIT0gbnVsbCkKLQkJewotCQkJTm9kZUxpc3QgcHJvcEVscyA9IG9wRWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlByb3BlcnR5Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcEVscy5nZXRMZW5ndGgoKTsgaSsrKQotCQkJewotCQkJCUVsZW1lbnQgcHJvcEVsID0gKEVsZW1lbnQpIHByb3BFbHMuaXRlbShpKTsKLQkJCQlTdHJpbmcgbmFtZSA9IHByb3BFbC5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyB2YWx1ZSA9IHByb3BFbC5nZXRBdHRyaWJ1dGUoInZhbHVlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl0ZGVmLnNldE91dHB1dFByb3BlcnR5KG5hbWUsIHZhbHVlKTsKLQkJCX0KLQkJfQotCi0JCUVsZW1lbnQgcGFyYW1zRWwgPSAoRWxlbWVudCkgdHJhbnNmb3JtRWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoTWVzc2FnZXMuZ2V0U3RyaW5nKCJUcmFuc2Zvcm1EZWZpbml0aW9uLjE4IikpLml0ZW0oMCk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHBhcmFtc0VsICE9IG51bGwpCi0JCXsKLQkJCU5vZGVMaXN0IHBhcmFtRWxzID0gcGFyYW1zRWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoTWVzc2FnZXMuZ2V0U3RyaW5nKCJUcmFuc2Zvcm1EZWZpbml0aW9uLjE5IikpOyAvLyROT04tTkxTLTEkCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtRWxzLmdldExlbmd0aCgpOyBpKyspCi0JCQl7Ci0JCQkJRWxlbWVudCBwYXJhbUVsID0gKEVsZW1lbnQpIHBhcmFtRWxzLml0ZW0oaSk7Ci0JCQkJU3RyaW5nIG5hbWUgPSBwYXJhbUVsLmdldEF0dHJpYnV0ZShNZXNzYWdlcy5nZXRTdHJpbmcoIlRyYW5zZm9ybURlZmluaXRpb24uMjAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgdHlwZSA9IHBhcmFtRWwuZ2V0QXR0cmlidXRlKE1lc3NhZ2VzLmdldFN0cmluZygiVHJhbnNmb3JtRGVmaW5pdGlvbi4yMSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyB2YWx1ZSA9IHBhcmFtRWwuZ2V0QXR0cmlidXRlKE1lc3NhZ2VzLmdldFN0cmluZygiVHJhbnNmb3JtRGVmaW5pdGlvbi4yMiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCXRkZWYuYWRkUGFyYW1ldGVyKG5ldyBUeXBlZFZhbHVlKG5hbWUsIHR5cGUsIHZhbHVlKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdGRlZjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2RlYnVnL2ludm9rZXIvVHJhbnNmb3JtYXRpb25FeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvZGVidWcvaW52b2tlci9UcmFuc2Zvcm1hdGlvbkV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTBhY2FmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvZGVidWcvaW52b2tlci9UcmFuc2Zvcm1hdGlvbkV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLmludm9rZXI7Ci0KLS8qKgotICogQ2hlY2tlZCBFeGNlcHRpb24gZm9yIHRyYW5zZm9ybWF0aW9uIGVycm9ycy4KLSAqIAotICogQGF1dGhvciBEb3VnIFNhdGNod2VsbAotICovCi1wdWJsaWMgY2xhc3MgVHJhbnNmb3JtYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UuCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpCi0JewotCQlzdXBlcihtZXNzYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlIGFuZCBjYXVzZS4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQotCSAqIEBwYXJhbSBjYXVzZSB0aGUgY2F1c2UKLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkKLQl7Ci0JCXN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9kZWJ1Zy9pbnZva2VyL1R5cGVkVmFsdWUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvZGVidWcvaW52b2tlci9UeXBlZFZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNTFjNGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9kZWJ1Zy9pbnZva2VyL1R5cGVkVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcuaW52b2tlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy5pbnZva2VyLmludGVybmFsLkNyZWF0aW9uRXhjZXB0aW9uOwotCi0vKioKLSAqIEEgdmFsdWUgdGhhdCBpcyB0byBiZSBpbnN0YW50aWF0ZWQgZnJvbSBhIHBhcnRpY3VsYXIgdHlwZSBlLmcuIERvdWJsZSwgT2JqZWN0LgotICogCi0gKiBAYXV0aG9yIERvdWcgU2F0Y2h3ZWxsCi0gKi8KLXB1YmxpYyBjbGFzcyBUeXBlZFZhbHVlCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9TVFJJTkcgPSAic3RyaW5nIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0JPT0xFQU4gPSAiYm9vbGVhbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9JTlQgPSAiaW50IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0RPVUJMRSA9ICJkb3VibGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRkxPQVQgPSAiZmxvYXQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfT0JKRUNUID0gIm9iamVjdCI7IC8vJE5PTi1OTFMtMSQKLQotCWZpbmFsIFN0cmluZyB1cmk7Ci0JZmluYWwgU3RyaW5nIHR5cGU7Ci0JZmluYWwgU3RyaW5nIHZhbHVlOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgZnJvbSB0aGUgZ2l2ZW4gaW5mb3JtYXRpb24uIAotCSAqIAotCSAqIEBwYXJhbSB1cmkgdGhlIFVSSQotCSAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIG9mIHZhbHVlCi0JICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBUeXBlZFZhbHVlKFN0cmluZyB1cmksIFN0cmluZyB0eXBlLCBTdHJpbmcgdmFsdWUpCi0JewotCQl0aGlzLnVyaSA9IHVyaTsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgdHlwZSBvZiBvYmplY3QgZGVmaW5lZCBieSB0aGlzLiAKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZQotCSAqIEB0aHJvd3MgQ3JlYXRpb25FeGNlcHRpb24gaWYgYSBwcm9ibGVtIG9jY3VycmVkCi0JICovCi0JcHVibGljIE9iamVjdCBjcmVhdGVWYWx1ZSgpIHRocm93cyBDcmVhdGlvbkV4Y2VwdGlvbgotCXsKLQkJT2JqZWN0IG8gPSBudWxsOwotCQlpZiAoVFlQRV9TVFJJTkcuZXF1YWxzKHR5cGUpKQotCQl7Ci0JCQlvID0gdmFsdWU7Ci0JCX0KLQkJZWxzZSBpZiAoVFlQRV9CT09MRUFOLmVxdWFscyh0eXBlKSkKLQkJewotCQkJYm9vbGVhbiBiID0gInllcyIuZXF1YWxzSWdub3JlQ2FzZSh2YWx1ZSkgfHwgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UodmFsdWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCW8gPSBuZXcgQm9vbGVhbihiKTsKLQkJfQotCQllbHNlIGlmIChUWVBFX0lOVC5lcXVhbHModHlwZSkpCi0JCXsKLQkJCXRyeQotCQkJewotCQkJCW8gPSBuZXcgSW50ZWdlcih2YWx1ZSk7Ci0JCQl9Ci0JCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpCi0JCQl7Ci0JCQkJdGhyb3cgbmV3IENyZWF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiVHlwZWRWYWx1ZS45IikgKyB2YWx1ZSArIE1lc3NhZ2VzLmdldFN0cmluZygiVHlwZWRWYWx1ZS4xMCIpLCBlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoVFlQRV9ET1VCTEUuZXF1YWxzKHR5cGUpKQotCQl7Ci0JCQl0cnkKLQkJCXsKLQkJCQlvID0gbmV3IERvdWJsZSh2YWx1ZSk7Ci0JCQl9Ci0JCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpCi0JCQl7Ci0JCQkJdGhyb3cgbmV3IENyZWF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiVHlwZWRWYWx1ZS4xMSIpICsgdmFsdWUgKyBNZXNzYWdlcy5nZXRTdHJpbmcoIlR5cGVkVmFsdWUuMTIiKSwgZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKFRZUEVfRkxPQVQuZXF1YWxzKHR5cGUpKQotCQl7Ci0JCQl0cnkKLQkJCXsKLQkJCQlvID0gbmV3IEZsb2F0KHZhbHVlKTsKLQkJCX0KLQkJCWNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkKLQkJCXsKLQkJCQl0aHJvdyBuZXcgQ3JlYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJUeXBlZFZhbHVlLjEzIikgKyB2YWx1ZSArIE1lc3NhZ2VzLmdldFN0cmluZygiVHlwZWRWYWx1ZS4xNCIpLCBlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoVFlQRV9DTEFTUy5lcXVhbHModHlwZSkpCi0JCXsKLQkJCXRyeQotCQkJewotCQkJCW8gPSBDbGFzcy5mb3JOYW1lKHZhbHVlKTsKLQkJCX0KLQkJCWNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpCi0JCQl7Ci0JCQkJdGhyb3cgbmV3IENyZWF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiVHlwZWRWYWx1ZS4xNSIpICsgdmFsdWUgKyBNZXNzYWdlcy5nZXRTdHJpbmcoIlR5cGVkVmFsdWUuMTYiKSwgZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKFRZUEVfT0JKRUNULmVxdWFscyh0eXBlKSkKLQkJewotCQkJdHJ5Ci0JCQl7Ci0JCQkJQ2xhc3MgYyA9IENsYXNzLmZvck5hbWUodmFsdWUpOwotCQkJCW8gPSBjLm5ld0luc3RhbmNlKCk7Ci0JCQl9Ci0JCQljYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKQotCQkJewotCQkJCXRocm93IG5ldyBDcmVhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoIlR5cGVkVmFsdWUuMTciKSArIHZhbHVlICsgTWVzc2FnZXMuZ2V0U3RyaW5nKCJUeXBlZFZhbHVlLjE4IiksIGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCWNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpCi0JCQl7Ci0JCQkJdGhyb3cgbmV3IENyZWF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiVHlwZWRWYWx1ZS4xOSIpICsgdmFsdWUgKyBNZXNzYWdlcy5nZXRTdHJpbmcoIlR5cGVkVmFsdWUuMjAiKSwgZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkKLQkJCXsKLQkJCQl0aHJvdyBuZXcgQ3JlYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJUeXBlZFZhbHVlLjIxIikgKyB2YWx1ZSArIE1lc3NhZ2VzLmdldFN0cmluZygiVHlwZWRWYWx1ZS4yMiIpLCBlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQl0aHJvdyBuZXcgQ3JlYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJUeXBlZFZhbHVlLjIzIikgKyB0eXBlICsgTWVzc2FnZXMuZ2V0U3RyaW5nKCJUeXBlZFZhbHVlLjI0IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlyZXR1cm4gbzsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9kZWJ1Zy9pbnZva2VyL2ludGVybmFsL0NvbmZpZ3VyYXRpb25FeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvZGVidWcvaW52b2tlci9pbnRlcm5hbC9Db25maWd1cmF0aW9uRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MjZjNzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9kZWJ1Zy9pbnZva2VyL2ludGVybmFsL0NvbmZpZ3VyYXRpb25FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy5pbnZva2VyLmludGVybmFsOwotCi0vKioKLSAqIEFuIGV4Y2VwdGlvbiB0aHJvd24gd2hlbiBjb25maWd1cmF0aW9uIG9mIGFuIFhTTCB0cmFuc2Zvcm0gcGlwZWxpbmUgZmFpbHMuCi0gKiAKLSAqIEBhdXRob3IgRG91ZyBTYXRjaHdlbGwKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgZXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBtc2cgdGhlIGV4Y2VwdGlvbiBtZXNzYWdlCi0JICogQHBhcmFtIHQgdGhlIHVuZGVybHlpbmcgY2F1c2UKLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbihTdHJpbmcgbXNnLCBUaHJvd2FibGUgdCkKLQl7Ci0JCXN1cGVyKG1zZywgdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9kZWJ1Zy9pbnZva2VyL2ludGVybmFsL0NyZWF0aW9uRXhjZXB0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2RlYnVnL2ludm9rZXIvaW50ZXJuYWwvQ3JlYXRpb25FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJhMDdiZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2RlYnVnL2ludm9rZXIvaW50ZXJuYWwvQ3JlYXRpb25FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy5pbnZva2VyLmludGVybmFsOwotCi0vKioKLSAqIENoZWNrZWQgRXhjZXB0aW9uIGZvciBvYmplY3QgY3JlYXRpb24gZXJyb3JzLgotICogCi0gKiBAYXV0aG9yIERvdWcgU2F0Y2h3ZWxsCi0gKi8KLXB1YmxpYyBjbGFzcyBDcmVhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBDcmVhdGlvbkV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkKLQl7Ci0JCXN1cGVyKG1lc3NhZ2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UgYW5kIGNhdXNlLgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCi0JICogQHBhcmFtIGNhdXNlIHRoZSBjYXVzZQotCSAqLwotCXB1YmxpYyBDcmVhdGlvbkV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKQotCXsKLQkJc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2RlYnVnL2ludm9rZXIvaW50ZXJuYWwvSkFYUFNBWFByb2Nlc3Nvckludm9rZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvZGVidWcvaW52b2tlci9pbnRlcm5hbC9KQVhQU0FYUHJvY2Vzc29ySW52b2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGM0MjRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvZGVidWcvaW52b2tlci9pbnRlcm5hbC9KQVhQU0FYUHJvY2Vzc29ySW52b2tlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy5pbnZva2VyLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLkVycm9yTGlzdGVuZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlNBWFNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnNheC5TQVhUcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguVHJhbnNmb3JtZXJIYW5kbGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLmludm9rZXIuSVByb2Nlc3Nvckludm9rZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLmludm9rZXIuVHJhbnNmb3JtYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLQotLyoqCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5JUHJvY2Vzc29ySW52b2tlcjwvY29kZT4gdGhhdCB1c2VzIEpBWFAgYXMgdGhlIHVuZGVybHlpbmcKLSAqIHRyYW5zZm9ybWF0aW9uIG1lY2hhbmlzbS4KLSAqIAotICogQGF1dGhvciBEb3VnIFNhdGNod2VsbAotICovCi1wdWJsaWMgY2xhc3MgSkFYUFNBWFByb2Nlc3Nvckludm9rZXIgaW1wbGVtZW50cyBJUHJvY2Vzc29ySW52b2tlcgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhKQVhQU0FYUHJvY2Vzc29ySW52b2tlci5jbGFzcyk7Ci0KLQlwcml2YXRlIFhNTFJlYWRlciByZWFkZXI7Ci0JcHJpdmF0ZSBTQVhUcmFuc2Zvcm1lckZhY3RvcnkgdEZhY3Rvcnk7Ci0JcHJpdmF0ZSBUcmFuc2Zvcm1lckhhbmRsZXIgdGg7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcy4KLQkgKiAKLQkgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBpZiBlcnJvcnMgb2NjdXIgd2hpbGUgY3JlYXRpbmcgYW4gPGNvZGU+WE1MUmVhZGVyPC9jb2RlPgotCSAqIEB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBpZiBlcnJvcnMgb2NjdXIgd2hpbGUgY3JlYXRpbmcgYW4gPGNvZGU+WE1MUmVhZGVyPC9jb2RlPgotCSAqLwotCXB1YmxpYyBKQVhQU0FYUHJvY2Vzc29ySW52b2tlcigpIHRocm93cyBTQVhFeGNlcHRpb24sIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KLQl7Ci0JCXJlYWRlciA9IGNyZWF0ZVJlYWRlcigpOwotCX0KLQotCXByb3RlY3RlZCBYTUxSZWFkZXIgY3JlYXRlUmVhZGVyKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotCXsKLQkJU0FYUGFyc2VyRmFjdG9yeSBzcGYgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0JCXNwZi5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLQkJcmV0dXJuIHNwZi5uZXdTQVhQYXJzZXIoKS5nZXRYTUxSZWFkZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVzKE1hcCBhdHRyaWJ1dGVzKSB0aHJvd3MgVHJhbnNmb3JtZXJGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yCi0JewotCQljcmVhdGVUcmFuc2Zvcm1lckZhY3RvcnkoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYXR0cmlidXRlcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLQkJewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQlTdHJpbmcgdXJpID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7Ci0JCQlPYmplY3QgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJbG9nLmluZm8oTWVzc2FnZXMuZ2V0U3RyaW5nKCJKQVhQU0FYUHJvY2Vzc29ySW52b2tlci4wIikgKyB1cmkgKyBNZXNzYWdlcy5nZXRTdHJpbmcoIkpBWFBTQVhQcm9jZXNzb3JJbnZva2VyLjEiKSArIHZhbHVlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl0RmFjdG9yeS5zZXRBdHRyaWJ1dGUodXJpLCB2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgVHJhbnNmb3JtZXJGYWN0b3J5IGNyZWF0ZVRyYW5zZm9ybWVyRmFjdG9yeSgpCi0JewotCQl0RmFjdG9yeSA9IChTQVhUcmFuc2Zvcm1lckZhY3RvcnkpIFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCQl0RmFjdG9yeS5zZXRFcnJvckxpc3RlbmVyKG5ldyBFcnJvckxpc3RlbmVyKCkKLQkJewotCi0JCQlwdWJsaWMgdm9pZCBlcnJvcihUcmFuc2Zvcm1lckV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgotCQkJewotCQkJCWxvZy5lcnJvcihleGNlcHRpb24uZ2V0TWVzc2FnZUFuZExvY2F0aW9uKCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uCi0JCQl7Ci0JCQkJbG9nLmVycm9yKGV4Y2VwdGlvbi5nZXRNZXNzYWdlQW5kTG9jYXRpb24oKSwgZXhjZXB0aW9uKTsKLQkJCQl0aHJvdyBleGNlcHRpb247Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdhcm5pbmcoVHJhbnNmb3JtZXJFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KLQkJCXsKLQkJCQlsb2cud2FybihleGNlcHRpb24uZ2V0TWVzc2FnZUFuZExvY2F0aW9uKCkpOwotCQkJfQotCi0JCX0pOwotCQlyZXR1cm4gdEZhY3Rvcnk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkU3R5bGVzaGVldChVUkwgc3R5bGVzaGVldCwgTWFwIHBhcmFtZXRlcnMsIFByb3BlcnRpZXMgb3V0cHV0UHJvcGVydGllcywgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIpIHRocm93cyBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KLQl7Ci0JCUlucHV0U291cmNlIGlucHV0c291cmNlID0gbmV3IElucHV0U291cmNlKHN0eWxlc2hlZXQudG9TdHJpbmcoKSk7Ci0KLQkJLy8gVE9ETyBwYXJzZSBkb2N1bWVudCB3aXRoIGxpbmVudW1iZXJzCi0KLQkJLy8gWE1MUmVhZGVyIHJlYWRlciA9IGNyZWF0ZVJlYWRlcigpOwotCQkvLyBMaW5lUmVhZGluZ0NvbnRlbnRIYW5kbGVyIGNoID0gbmV3IExpbmVSZWFkaW5nQ29udGVudEhhbmRsZXIoKTsKLQkJLy8gcmVhZGVyLnNldENvbnRlbnRIYW5kbGVyKGNoKTsKLQkJU0FYU291cmNlIHNvdXJjZSA9IG5ldyBTQVhTb3VyY2UoaW5wdXRzb3VyY2UpOwotCi0JCWFkZFN0eWxlc2hlZXQoc291cmNlLCByZXNvbHZlciwgcGFyYW1ldGVycywgb3V0cHV0UHJvcGVydGllcyk7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgVHJhbnNmb3JtZXIgYWRkU3R5bGVzaGVldChTb3VyY2Ugc291cmNlLCBVUklSZXNvbHZlciByZXNvbHZlciwgTWFwIHBhcmFtZXRlcnMsIFByb3BlcnRpZXMgb3V0cHV0UHJvcGVydGllcykgdGhyb3dzIFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotCXsKLQkJaWYgKHRGYWN0b3J5ID09IG51bGwpCi0JCQljcmVhdGVUcmFuc2Zvcm1lckZhY3RvcnkoKTsKLQotCQlUcmFuc2Zvcm1lckhhbmRsZXIgbmV3VGggPSB0RmFjdG9yeS5uZXdUcmFuc2Zvcm1lckhhbmRsZXIoc291cmNlKTsKLQkJVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSBuZXdUaC5nZXRUcmFuc2Zvcm1lcigpOwotCi0JCWlmIChyZXNvbHZlciAhPSBudWxsKQotCQkJdHJhbnNmb3JtZXIuc2V0VVJJUmVzb2x2ZXIocmVzb2x2ZXIpOwotCi0JCWlmIChwYXJhbWV0ZXJzICE9IG51bGwpCi0JCXsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHBhcmFtZXRlcnMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0JCQl7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLQkJCQlPYmplY3QgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCWxvZy5pbmZvKE1lc3NhZ2VzLmdldFN0cmluZygiSkFYUFNBWFByb2Nlc3Nvckludm9rZXIuMiIpICsgbmFtZSArIE1lc3NhZ2VzLmdldFN0cmluZygiSkFYUFNBWFByb2Nlc3Nvckludm9rZXIuMyIpICsgdmFsdWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl0cmFuc2Zvcm1lci5zZXRQYXJhbWV0ZXIobmFtZSwgdmFsdWUpOwotCQkJfQotCQl9Ci0JCWlmIChvdXRwdXRQcm9wZXJ0aWVzICE9IG51bGwpCi0JCXsKLQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG91dHB1dFByb3BlcnRpZXMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0JCQl7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJc2IuYXBwZW5kKGVudHJ5LmdldEtleSgpKS5hcHBlbmQoIj0iKS5hcHBlbmQoZW50cnkuZ2V0VmFsdWUoKSkuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJaWYgKG91dHB1dFByb3BlcnRpZXMuc2l6ZSgpID4gMCkKLQkJCXsKLQkJCQlsb2cuaW5mbyhNZXNzYWdlcy5nZXRTdHJpbmcoIkpBWFBTQVhQcm9jZXNzb3JJbnZva2VyLjYiKSArIHNiLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydGllcyhvdXRwdXRQcm9wZXJ0aWVzKTsKLQkJCX0KLQkJfQotCi0JCWlmICh0aCAhPSBudWxsKQotCQkJdGguc2V0UmVzdWx0KG5ldyBTQVhSZXN1bHQobmV3VGgpKTsKLQkJZWxzZSB7Ci0JCQlyZWFkZXIuc2V0Q29udGVudEhhbmRsZXIobmV3VGgpOwotCQkJdHJ5IHsKLQkJCQlyZWFkZXIuc2V0UHJvcGVydHkoImh0dHA6Ly94bWwub3JnL3NheC9wcm9wZXJ0aWVzL2xleGljYWwtaGFuZGxlciIsIG5ld1RoKTsKLQkJCX0gY2F0Y2ggKFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24gZXgpIHsKLQkJCQlsb2cud2FybigiVW5hYmxlIHRvIHNldCBsZXhpY2FsIGNvbnRlbnQgaGFuZGxlci4gIENvbW1lbnRzIGFuZCBQcm9jZXNzaW5nIGluc3RydWN0aW9ucyBtYXkgYmUgc2tpcHBlZCIpOwotCQkJfSBjYXRjaCAoU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpIHsKLQkJCQlsb2cud2FybigiTGV4aWNhbCBwcm9wZXJ0eSBub3Qgc3VwcG9ydGVkLiAgQ29tbWVudHMgYW5kIFByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIG1heSBiZSBza2lwcGVkIik7Ci0JCQl9Ci0JCX0KLQkJdGggPSBuZXdUaDsKLQkJcmV0dXJuIHRoLmdldFRyYW5zZm9ybWVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdHJhbnNmb3JtKFVSTCBzb3VyY2VVUkwsIFJlc3VsdCByZXMpIHRocm93cyBUcmFuc2Zvcm1hdGlvbkV4Y2VwdGlvbgotCXsKLQkJdHJhbnNmb3JtKG5ldyBJbnB1dFNvdXJjZShzb3VyY2VVUkwudG9FeHRlcm5hbEZvcm0oKSksIHJlcyk7Ci0JfQotCi0JLyoqCi0JICogVHJhbnNmb3JtIHVzaW5nIGFuIElucHV0U291cmNlIHJhdGhlciB0aGFuIGEgVVJMCi0JICogCi0JICogQHBhcmFtIGlucHV0c291cmNlIHRoZSBJbnB1dFNvdXJjZSB0byB1c2UKLQkgKiBAcGFyYW0gcmVzIHRoZSBSZXN1bHQKLQkgKiBAdGhyb3dzIFRyYW5zZm9ybWF0aW9uRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycmVkIGR1cmluZyB0cmFuc2Zvcm1hdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRyYW5zZm9ybShJbnB1dFNvdXJjZSBpbnB1dHNvdXJjZSwgUmVzdWx0IHJlcykgdGhyb3dzIFRyYW5zZm9ybWF0aW9uRXhjZXB0aW9uCi0JewotCQl0cnkKLQkJewotCQkJaWYgKHRoID09IG51bGwpCi0JCQl7Ly8gbm8gc3R5bGVzaGVldHMgaGF2ZSBiZWVuIGFkZGVkLCBzbyB0cnkgdG8gdXNlIGVtYmVkZGVkLi4uCi0JCQkJU0FYU291cmNlIHNheFNvdXJjZSA9IG5ldyBTQVhTb3VyY2UoaW5wdXRzb3VyY2UpOwotCQkJCVNvdXJjZSBzcmMgPSBzYXhTb3VyY2U7Ci0JCQkJU3RyaW5nIG1lZGlhID0gbnVsbCwgdGl0bGUgPSBudWxsLCBjaGFyc2V0ID0gbnVsbDsKLQkJCQl3aGlsZSAodHJ1ZSkKLQkJCQl7Ci0JCQkJCXNyYyA9IHRGYWN0b3J5LmdldEFzc29jaWF0ZWRTdHlsZXNoZWV0KHNyYywgbWVkaWEsIHRpdGxlLCBjaGFyc2V0KTsKLQkJCQkJaWYgKHNyYyAhPSBudWxsKQotCQkJCQl7Ci0JCQkJCQlhZGRTdHlsZXNoZWV0KHNheFNvdXJjZSwgbnVsbCwgQ29sbGVjdGlvbnMuRU1QVFlfTUFQLCBuZXcgUHJvcGVydGllcygpKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCXRocm93IG5ldyBUcmFuc2Zvcm1hdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoIkpBWFBTQVhQcm9jZXNzb3JJbnZva2VyLjciKSArIGlucHV0c291cmNlLmdldFN5c3RlbUlkKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQl0aC5zZXRSZXN1bHQocmVzKTsKLQkJCWxvZy5pbmZvKE1lc3NhZ2VzLmdldFN0cmluZygiSkFYUFNBWFByb2Nlc3Nvckludm9rZXIuOCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJcmVhZGVyLnBhcnNlKGlucHV0c291cmNlKTsKLQkJCWxvZy5pbmZvKE1lc3NhZ2VzLmdldFN0cmluZygiSkFYUFNBWFByb2Nlc3Nvckludm9rZXIuOSIpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkKLQkJewotCQkJdGhyb3cgbmV3IFRyYW5zZm9ybWF0aW9uRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvZGVidWcvaW52b2tlci9pbnRlcm5hbC9NYWluLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2RlYnVnL2ludm9rZXIvaW50ZXJuYWwvTWFpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2NkY2U4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvZGVidWcvaW52b2tlci9pbnRlcm5hbC9NYWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcuaW52b2tlci5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLmludm9rZXIuSVByb2Nlc3Nvckludm9rZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLmludm9rZXIuUGlwZWxpbmVEZWZpbml0aW9uOwotCi0vKioKLSAqIFRoZSBjbGFzcyB3aG9zZSA8Y29kZT5tYWluPC9jb2RlPiBtZXRob2QgaXMgY2FsbGVkIHdoZW4gbGF1bmNoaW5nIHRoZSB0cmFuc2Zvcm1hdGlvbiBwcm9jZXNzIGZyb20KLSAqIEVjbGlwc2UuCi0gKiAKLSAqIEBhdXRob3IgRG91ZyBTYXRjaHdlbGwKLSAqLwotcHVibGljIGNsYXNzIE1haW4KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coTWFpbi5jbGFzcyk7Ci0KLQkvKioKLQkgKiBUaGUgPGNvZGU+bWFpbjwvY29kZT4gbWV0aG9kIGNhbGxlZCB3aGVuIGxhdW5jaGluZyB0aGUgdHJhbnNmb3JtYXRpb24gcHJvY2Vzcy4KLQkgKiBUaGVyZSBhcmUgNCByZXF1aXJlZCBhcmd1bWVudHM6Ci0JICogPG9sPgotCSAqIDxsaT5UaGUgY2xhc3MgbmFtZSBvZiB0aGUgPGNvZGU+SVByb2Nlc3Nvckludm9rZXI8L2NvZGU+IHRvIHVzZQotCSAqIDxsaT5UaGUgbGF1bmNoIGZpbGUgKHNlcmlhbGl6ZWQgPGNvZGU+UGlwZWxpbmVEZWZpbml0aW9uPC9jb2RlPikKLQkgKiA8bGk+VGhlIFVSTCBvZiB0aGUgc291cmNlIFhNTCBkb2N1bWVudAotCSAqIDxsaT5UaGUgZmlsZSB3aGVyZSBvdXRwdXQgd2lsbCBiZSB3cml0dGVuCi0JICogPC9vbD4KLQkgKiAKLQkgKiBAcGFyYW0gYXJncyB0aGUgNCByZXF1aXJlZCBhcmd1bWVudHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQotCXsKLQkJbG9nLmluZm8oImphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5PSIgKyBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJbG9nLmluZm8oImphdmEuZW5kb3JzZWQuZGlycz0iICsgU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmVuZG9yc2VkLmRpcnMiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkKLQkJU3RyaW5nIGludm9rZXJDbGFzc05hbWUgPSBhcmdzWzBdOwotCQlGaWxlIGxhdW5jaEZpbGUgPSBuZXcgRmlsZShhcmdzWzFdKTsKLQkJU3RyaW5nIHNyYyA9IGFyZ3NbMl07Ci0JCVN0cmluZyB0YXJnZXQgPSBhcmdzWzNdOwotCi0JCWxvZy5pbmZvKE1lc3NhZ2VzLmdldFN0cmluZygiTWFpbi40IikgKyBsYXVuY2hGaWxlKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIGNyZWF0ZSB0aGUgaW52b2tlcgotCQlJUHJvY2Vzc29ySW52b2tlciBpbnZva2VyID0gbnVsbDsKLQkJdHJ5Ci0JCXsKLQkJCUNsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShpbnZva2VyQ2xhc3NOYW1lKTsKLQkJCWludm9rZXIgPSAoSVByb2Nlc3Nvckludm9rZXIpIGNsYXp6Lm5ld0luc3RhbmNlKCk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQloYW5kbGVGYXRhbEVycm9yKE1lc3NhZ2VzLmdldFN0cmluZygiTWFpbi41IikgKyBpbnZva2VyQ2xhc3NOYW1lLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRyeQotCQl7Ci0JCQlQaXBlbGluZURlZmluaXRpb24gcGlwZWxpbmUgPSBuZXcgUGlwZWxpbmVEZWZpbml0aW9uKGxhdW5jaEZpbGUpOwotCQkJcGlwZWxpbmUuY29uZmlndXJlKGludm9rZXIpOwotCQkJaW52b2tlci50cmFuc2Zvcm0obmV3IFVSTChzcmMpLCBuZXcgU3RyZWFtUmVzdWx0KG5ldyBGaWxlT3V0cHV0U3RyZWFtKG5ldyBGaWxlKHRhcmdldCkpKSk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQloYW5kbGVGYXRhbEVycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgaGFuZGxlRmF0YWxFcnJvcihTdHJpbmcgbXNnLCBUaHJvd2FibGUgdCkKLQl7Ci0JCWxvZy5mYXRhbChtc2csIHQpOwotCQlTeXN0ZW0uZXhpdCgxKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2RlYnVnL2ludm9rZXIvaW50ZXJuYWwvTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvZGVidWcvaW52b2tlci9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWUzOTk1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvZGVidWcvaW52b2tlci9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLmludm9rZXIuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoqCi0gKiBNZXNzYWdlcyBmb3IgdGhlIHRyYW5zZm9ybWF0aW9uLgotICogCi0gKiBAYXV0aG9yIERvdWcgU2F0Y2h3ZWxsCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcwotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcuaW52b2tlci5pbnRlcm5hbC5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkKLQl7Ci0JfQotCi0JLyoqCi0JICogR2V0IGEgbWVzc2FnZSBmb3IgdGhlIGdpdmVuIGtleS4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5IHRoZSBtZXNzYWdlIGtleQotCSAqIEByZXR1cm4gdGhlIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkKLQl7Ci0JCXRyeQotCQl7Ci0JCQlyZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOwotCQl9Ci0JCWNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkKLQkJewotCQkJcmV0dXJuICchJyArIGtleSArICchJzsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvZGVidWcvaW52b2tlci9pbnRlcm5hbC9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9kZWJ1Zy9pbnZva2VyL2ludGVybmFsL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmOGY5YTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9kZWJ1Zy9pbnZva2VyL2ludGVybmFsL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1KQVhQU0FYUHJvY2Vzc29ySW52b2tlci4wPVNldHRpbmcgYXR0cmlidXRlICcKLUpBWFBTQVhQcm9jZXNzb3JJbnZva2VyLjE9JyB0byB2YWx1ZSAKLUpBWFBTQVhQcm9jZXNzb3JJbnZva2VyLjI9U2V0dGluZyBwYXJhbWV0ZXIgJwotSkFYUFNBWFByb2Nlc3Nvckludm9rZXIuMz0nIHRvIHZhbHVlIAotSkFYUFNBWFByb2Nlc3Nvckludm9rZXIuNj1TZXR0aW5nIHByb3BlcnRpZXM6IAotSkFYUFNBWFByb2Nlc3Nvckludm9rZXIuNz1ObyBlbWJlZGRlZCBzdHlsZXNoZWV0IGluc3RydWN0aW9uIGZvciBmaWxlOiAKLUpBWFBTQVhQcm9jZXNzb3JJbnZva2VyLjg9VHJhbnNmb3JtaW5nLi4uCi1KQVhQU0FYUHJvY2Vzc29ySW52b2tlci45PURvbmUuCi1NYWluLjQ9bGF1bmNoRmlsZTogCi1NYWluLjU9Q291bGQgbm90IGluc3RhbnRpYXRlIGludm9rZXI6IApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9kZWJ1Zy9pbnZva2VyL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2RlYnVnL2ludm9rZXIvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVhOWIzYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2RlYnVnL2ludm9rZXIvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLVBpcGVsaW5lRGVmaW5pdGlvbi4xMD1FcnJvciB3aXRoIHN0eWxlc2hlZXQ6IAotUGlwZWxpbmVEZWZpbml0aW9uLjg9Q291bGQgbm90IGluc3RhbnRpYXRlIHBhcmFtZXRlcgotUGlwZWxpbmVEZWZpbml0aW9uLjk9SW52YWxpZCBzdHlsZXNoZWV0IFVSTDogCi1UcmFuc2Zvcm1EZWZpbml0aW9uLjE9dXJsCi1UcmFuc2Zvcm1EZWZpbml0aW9uLjE4PVBhcmFtZXRlcnMKLVRyYW5zZm9ybURlZmluaXRpb24uMTk9UGFyYW1ldGVyCi1UcmFuc2Zvcm1EZWZpbml0aW9uLjIwPW5hbWUKLVRyYW5zZm9ybURlZmluaXRpb24uMjE9dHlwZQotVHJhbnNmb3JtRGVmaW5pdGlvbi4yMj12YWx1ZQotVHlwZWRWYWx1ZS4xMD0nIHRvIGFuIEludGVnZXIKLVR5cGVkVmFsdWUuMTE9Q291bGQgbm90IGNvbnZlcnQgdmFsdWUgJwotVHlwZWRWYWx1ZS4xMj0nIHRvIGEgRG91YmxlCi1UeXBlZFZhbHVlLjEzPUNvdWxkIG5vdCBjb252ZXJ0IHZhbHVlICcKLVR5cGVkVmFsdWUuMTQ9JyB0byBhIEZsb2F0Ci1UeXBlZFZhbHVlLjE1PUNsYXNzICcKLVR5cGVkVmFsdWUuMTY9JyBjb3VsZCBub3QgYmUgbG9jYXRlZCAoY2hlY2sgdGhlIGNsYXNzcGF0aCkKLVR5cGVkVmFsdWUuMTc9Q2xhc3MgJwotVHlwZWRWYWx1ZS4xOD0nIGNvdWxkIG5vdCBiZSBsb2NhdGVkIChjaGVjayB0aGUgY2xhc3NwYXRoKQotVHlwZWRWYWx1ZS4xOT1PYmplY3QgJwotVHlwZWRWYWx1ZS4yMD0nIGNvdWxkIG5vdCBiZSBpbnN0YW50aWF0ZWQKLVR5cGVkVmFsdWUuMjE9T2JqZWN0ICcKLVR5cGVkVmFsdWUuMjI9XCBjb3VsZCBub3QgYmUgaW5zdGFudGlhdGVkCi1UeXBlZFZhbHVlLjIzPUF0dHJpYnV0ZSB0eXBlICcKLVR5cGVkVmFsdWUuMjQ9JyBpcyBub3QgcmVjb2duaXNlZAotVHlwZWRWYWx1ZS45PUNvdWxkIG5vdCBjb252ZXJ0IHZhbHVlICcKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0YzVlMzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGVhN2VjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmc8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5hcGkudG9vbHMuYXBpQW5hbHlzaXNCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5hcGkudG9vbHMuYXBpQW5hbHlzaXNOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTZjYTM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jVHVlIEZlYiAxMCAwNToyNTo0NSBHTVQgMjAwOQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdEZXNjcmlwdGlvbj1yZXR1cm5fdGFnCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL0pSRURlZmF1bHRBdHRyaWJ1dGVzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvSlJFRGVmYXVsdEF0dHJpYnV0ZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMyNDRkMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvSlJFRGVmYXVsdEF0dHJpYnV0ZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL0pSRURlZmF1bHRPdXRwdXRQcm9wZXJ0aWVzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvSlJFRGVmYXVsdE91dHB1dFByb3BlcnRpZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQyM2U5ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvSlJFRGVmYXVsdE91dHB1dFByb3BlcnRpZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLW1ldGhvZD1tZXRob2QKLW1ldGhvZC5ERVNDPSJ4bWwiIHwgImh0bWwiIHwgInRleHQiIHwgcW5hbWUtYnV0LW5vdC1uY25hbWUgCi0KLXZlcnNpb249dmVyc2lvbgotdmVyc2lvbi5ERVNDPXNwZWNpZmllcyB0aGUgdmVyc2lvbiBvZiB0aGUgb3V0cHV0IG1ldGhvZAotCi1pbmRlbnQ9aW5kZW50Ci1pbmRlbnQuREVTQz1zcGVjaWZpZXMgd2hldGhlciB0aGUgWFNMVCBwcm9jZXNzb3IgbWF5IGFkZCBhZGRpdGlvbmFsIHdoaXRlc3BhY2Ugd2hlbiBvdXRwdXR0aW5nIHRoZSByZXN1bHQgdHJlZTsgdGhlIHZhbHVlIG11c3QgYmUgeWVzIG9yIG5vCi0KLWVuY29kaW5nPWVuY29kaW5nCi1lbmNvZGluZy5ERVNDPXNwZWNpZmllcyB0aGUgcHJlZmVycmVkIGNoYXJhY3RlciBlbmNvZGluZyB0aGF0IHRoZSBYU0xUIHByb2Nlc3NvciBzaG91bGQgdXNlIHRvIGVuY29kZSBzZXF1ZW5jZXMgb2YgY2hhcmFjdGVycyBhcyBzZXF1ZW5jZXMgb2YgYnl0ZXM7IHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIHNob3VsZCBiZSB0cmVhdGVkIGNhc2UtaW5zZW5zaXRpdmVseTsgdGhlIHZhbHVlIG11c3QgY29udGFpbiBvbmx5IGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlICN4MjEgdG8gI3g3RSAoaS5lLiBwcmludGFibGUgQVNDSUkgY2hhcmFjdGVycyk7IHRoZSB2YWx1ZSBzaG91bGQgZWl0aGVyIGJlIGEgY2hhcnNldCByZWdpc3RlcmVkIHdpdGggdGhlIEludGVybmV0IEFzc2lnbmVkIE51bWJlcnMgQXV0aG9yaXR5IFtJQU5BXSwgW1JGQzIyNzhdIG9yIHN0YXJ0IHdpdGggWC0KLQotbWVkaWEtdHlwZT1tZWRpYS10eXBlCi1tZWRpYS10eXBlLkRFU0M9c3BlY2lmaWVzIHRoZSBtZWRpYSB0eXBlIChNSU1FIGNvbnRlbnQgdHlwZSkgb2YgdGhlIGRhdGEgdGhhdCByZXN1bHRzIGZyb20gb3V0cHV0dGluZyB0aGUgcmVzdWx0IHRyZWU7IHRoZSBjaGFyc2V0IHBhcmFtZXRlciBzaG91bGQgbm90IGJlIHNwZWNpZmllZCBleHBsaWNpdGx5OyBpbnN0ZWFkLCB3aGVuIHRoZSB0b3AtbGV2ZWwgbWVkaWEgdHlwZSBpcyB0ZXh0LCBhIGNoYXJzZXQgcGFyYW1ldGVyIHNob3VsZCBiZSBhZGRlZCBhY2NvcmRpbmcgdG8gdGhlIGNoYXJhY3RlciBlbmNvZGluZyBhY3R1YWxseSB1c2VkIGJ5IHRoZSBvdXRwdXQgbWV0aG9kCi0KLWRvY3R5cGUtc3lzdGVtPWRvY3R5cGUtc3lzdGVtCi1kb2N0eXBlLXN5c3RlbS5ERVNDPXNwZWNpZmllcyB0aGUgc3lzdGVtIGlkZW50aWZpZXIgdG8gYmUgdXNlZCBpbiB0aGUgZG9jdW1lbnQgdHlwZSBkZWNsYXJhdGlvbgotCi1kb2N0eXBlLXB1YmxpYz1kb2N0eXBlLXB1YmxpYwotZG9jdHlwZS1wdWJsaWMuREVTQz1zcGVjaWZpZXMgdGhlIHB1YmxpYyBpZGVudGlmaWVyIHRvIGJlIHVzZWQgaW4gdGhlIGRvY3VtZW50IHR5cGUgZGVjbGFyYXRpb24KLQotb21pdC14bWwtZGVjbGFyYXRpb249b21pdC14bWwtZGVjbGFyYXRpb24KLW9taXQteG1sLWRlY2xhcmF0aW9uLkRFU0M9c3BlY2lmaWVzIHdoZXRoZXIgdGhlIFhTTFQgcHJvY2Vzc29yIHNob3VsZCBvdXRwdXQgYW4gWE1MIGRlY2xhcmF0aW9uOyB0aGUgdmFsdWUgbXVzdCBiZSB5ZXMgb3Igbm8KLQotc3RhbmRhbG9uZT1zdGFuZGFsb25lCi1zdGFuZGFsb25lLkRFU0M9c3BlY2lmaWVzIHdoZXRoZXIgdGhlIFhTTFQgcHJvY2Vzc29yIHNob3VsZCBvdXRwdXQgYSBzdGFuZGFsb25lIGRvY3VtZW50IGRlY2xhcmF0aW9uOyB0aGUgdmFsdWUgbXVzdCBiZSB5ZXMgb3Igbm8KLQotY2RhdGEtc2VjdGlvbi1lbGVtZW50cz1jZGF0YS1zZWN0aW9uLWVsZW1lbnRzCi1jZGF0YS1zZWN0aW9uLWVsZW1lbnRzLkRFU0M9c3BlY2lmaWVzIGEgbGlzdCBvZiB0aGUgbmFtZXMgb2YgZWxlbWVudHMgd2hvc2UgdGV4dCBub2RlIGNoaWxkcmVuIHNob3VsZCBiZSBvdXRwdXQgdXNpbmcgQ0RBVEEgc2VjdGlvbnMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5YmJmMTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmc7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLmludGVybmFsLkpBWFBMYXVuY2hpbmdQbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUudmFyaWFibGVzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjEwMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmc7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWc7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uub3NnaS51dGlsO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcsCi0gb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuaW50ZXJuYWwucmVnaXN0cnk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLm1vZGVsCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMzAwMDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5BdWd1c3QsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZjMzZhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgc2NoZW1hLyxcCi0gICAgICAgICAgICAgICBKUkVEZWZhdWx0QXR0cmlidXRlcy5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIEpSRURlZmF1bHRPdXRwdXRQcm9wZXJ0aWVzLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9sb2c0ai5kZWJ1Zy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL2xvZzRqLmRlYnVnLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyZGZiNjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL2xvZzRqLmRlYnVnLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0jIFNldCByb290IGxvZ2dlciBsZXZlbCB0byBERUJVRyBhbmQgaXRzIGFwcGVuZGVycyBhcmUgQTEgYW5kIEEyCi1sb2c0ai5yb290TG9nZ2VyPUVSUk9SLCBBMgotCi0jIEEyIGlzIHNldCB0byBiZSBhIENvbnNvbGVBcHBlbmRlcgotbG9nNGouYXBwZW5kZXIuQTI9b3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXIKLQotIyBBMiB1c2VzIFBhdHRlcm5MYXlvdXQuCi1sb2c0ai5hcHBlbmRlci5BMi5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0Ci1sb2c0ai5hcHBlbmRlci5BMi5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49JWR7SEg6bW06c3MsU1NTfSAlLTVwIFsldF0gJWN7MX0gJXggLSAlbSVuCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMzN2Q1Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUJ1bmRsZS1WZW5kb3IuMCA9IEVjbGlwc2Uub3JnCi1CdW5kbGUtTmFtZS4wID0gWFNMIEpBWFAgTGF1bmNoaW5nIChJbmN1YmF0aW5nKQotbGF1bmNoRGVsZWdhdGUubmFtZS4wID0gSmF2YQotcHJvY2Vzc29yVHlwZS5sYWJlbC4xID0gSlJFIERlZmF1bHQKLXByb2Nlc3Nvci5sYWJlbC4xID0gSlJFIEluc3RhbmNlIERlZmF1bHQKLWRlYnVnZ2VyID0gZGVidWdnZXIKLWludm9rZSA9IGludm9rZQotcHJvY2Vzc29yID0gcHJvY2Vzc29yCi1wcm9jZXNzb3JUeXBlID0gcHJvY2Vzc29yVHlwZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MjU0OWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImRlYnVnZ2VyIiBuYW1lPSIlZGVidWdnZXIiIHNjaGVtYT0ic2NoZW1hL2RlYnVnZ2VyLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9Imludm9rZSIgbmFtZT0iJWludm9rZSIgc2NoZW1hPSJzY2hlbWEvaW52b2tlLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InByb2Nlc3NvciIgbmFtZT0iJXByb2Nlc3NvciIgc2NoZW1hPSJzY2hlbWEvcHJvY2Vzc29yLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InByb2Nlc3NvclR5cGUiIG5hbWU9IiVwcm9jZXNzb3JUeXBlIiBzY2hlbWE9InNjaGVtYS9wcm9jZXNzb3JUeXBlLmV4c2QiLz4KLSA8ZXh0ZW5zaW9uCi0gICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubGF1bmNoRGVsZWdhdGVzIj4KLSAgICA8bGF1bmNoRGVsZWdhdGUKLSAgICAgICAgICBkZWxlZ2F0ZT0ib3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5pbnRlcm5hbC5KQVhQSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZSIKLSAgICAgICAgICBkZWxlZ2F0ZURlc2NyaXB0aW9uPSJUaGUgWFNMVCBMYXVuY2hlciBmb3IgSkFYUCBzdXBwb3J0cyBydW5uaW5nIGFuZCBkZWJ1Z2dpbmcgdHJhbnNmb3JtYXRpb25zIHVzaW5nIEpBWFAtY29tcGxpYW50IFhTTFQgcHJvY2Vzc29ycyIKLSAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuaW50ZXJuYWwuamF4cC5KQVhQTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlIgotICAgICAgICAgIG1vZGVzPSJydW4sIGRlYnVnIgotICAgICAgICAgIG5hbWU9IiVsYXVuY2hEZWxlZ2F0ZS5uYW1lLjAiCi0gICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcubGF1bmNoQ29uZmlndXJhdGlvblR5cGUiPgotICAgIDwvbGF1bmNoRGVsZWdhdGU+ICAgIAotIDwvZXh0ZW5zaW9uPgotICAgICAJCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIj4KLQkJPGluaXRpYWxpemVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5pbnRlcm5hbC5QcmVmZXJlbmNlSW5pdGlhbGl6ZXIiPgotCQk8L2luaXRpYWxpemVyPgotCTwvZXh0ZW5zaW9uPgotIAotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuaW52b2tlIj4KLQkJPGludm9rZXIgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmpheHAuaW52b2tlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy5pbnZva2VyLmludGVybmFsLkpBWFBTQVhQcm9jZXNzb3JJbnZva2VyIgotCQkJY2xhc3NwYXRoPSIke2VjbGlwc2Vfb3JiaXQ6b3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnfTske2VjbGlwc2Vfb3JiaXQ6b3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmd9OyR7ZWNsaXBzZV9vcmJpdDpvcmcuYXBhY2hlLmxvZzRqfSIgLz4KLQk8L2V4dGVuc2lvbj4KLQotICAJPGV4dGVuc2lvbgotCSAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5wcm9jZXNzb3JUeXBlIj4KLSAgICAgPHByb2Nlc3NvclR5cGUKLSAgICAgICAgICAgIGF0dHJpYnV0ZVByb3BlcnRpZXM9IkpSRURlZmF1bHRBdHRyaWJ1dGVzLnByb3BlcnRpZXMiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcucHJvY2Vzc29yVHlwZS5qcmVEZWZhdWx0IgotICAgICAgICAgICAgbGFiZWw9IiVwcm9jZXNzb3JUeXBlLmxhYmVsLjEiCi0gICAgICAgICAgICBvdXRwdXRQcm9wZXJ0aWVzPSJKUkVEZWZhdWx0T3V0cHV0UHJvcGVydGllcy5wcm9wZXJ0aWVzIiAvPgotCSA8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24KLQkgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5wcm9jZXNzb3IiPgotICAgICAgICA8cHJvY2Vzc29yCi0gICAgICAgICAgICAgIGNsYXNzcGF0aD0iIgotICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuanJlLmRlZmF1bHQiCi0gICAgICAgICAgICAgIGxhYmVsPSIlcHJvY2Vzc29yLmxhYmVsLjEiCi0gICAgICAgICAgICAgIHByb2Nlc3NvclR5cGVJZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcucHJvY2Vzc29yVHlwZS5qcmVEZWZhdWx0IgotICAgICAgICAgICAgICBzdXBwb3J0cz0iMS4wIi8+Ci0JIDwvZXh0ZW5zaW9uPgotIAotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc2NoZW1hL2RlYnVnZ2VyLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc2NoZW1hL2RlYnVnZ2VyLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmODBmMDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NjaGVtYS9kZWJ1Z2dlci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmpheHAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuamF4cCIgaWQ9ImRlYnVnZ2VyIiBuYW1lPSJYU0xUIERlYnVnZ2VyIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvbnRyaWJ1dGUgYSBkZWJ1Z2dlciBmb3IgYSBwYXJ0aWN1bGFyIEpBWFAgcHJvY2Vzc29yIHR5cGUgKGUuZy4gU2F4b24pLiBUaGUgZXh0ZW5zaW9uIHBvaW50IHByaW1hcmlseSBkZWZpbmVzIHRoZSBjbGFzc3BhdGggYW5kIHRyYW5zZm9ybWVyIGZhY3RvcnkgdG8gYmUgdXNlZCB3aGVuIGRlYnVnZ2luZy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IC8+Ci0gICAgICAgICA8L2FwcGluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImRlYnVnZ2VyIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcGluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImRlYnVnZ2VyIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBBIGRlYnVnZ2VyIGZvciBhIHByb2Nlc3NvciB0eXBlCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgdW5pcXVlIGlkIGZvciB0aGlzIGRlYnVnZ2VyCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIG5hbWUgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBVSQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzcGF0aCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBICZhcG9zOzsmYXBvczstc2VwYXJhdGVkIGNsYXNzcGF0aCByZXF1aXJlZCB0byBydW4gdGhlIGRlYnVnZ2VyIChpbiBhZGRpdGlvbiB0byB0aGF0IGFscmVhZHkgYWRkZWQgYnkgdGhlIHByb2Nlc3NvciBpdHNlbGYpLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InByb2Nlc3NvclR5cGVJZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgcHJvY2Vzc29yIHR5cGUgdGhhdCB0aGlzIGRlYnVnZ2VyIHdvcmtzIHdpdGgKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc05hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSBmdWxseS1xdWFsaWZpZWQgY2xhc3MgdGhhdCBpbXBsZW1lbnQgdGhlIElYU0xEZWJ1Z2dlciBpbnRlcmZhY2UuIEl0IGlzIGVhc2llciB0byBleHRlbmQgQWJzdHJhY3RYU0xEZWJ1Z2dlci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249IjpvcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcuZGVidWdnZXIuSVhTTERlYnVnZ2VyIi8+Ci0gICAgICAgICAgICAgICA8L2FwcGluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHJhbnNmb3JtZXJGYWN0b3J5Q2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGZ1bGx5LXF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSB0cmFuc2Zvcm1lciBmYWN0b3J5IHRvIHVzZSBmb3IgZGVidWdnaW5nLiBUaGlzIG11c3QgYmUgb25lIG9mIHRoZSB0cmFuc2Zvcm1lciBmYWN0b3JpZXMgYmVsb25naW5nIHRvIHRoZSBwcm9jZXNzb3IgdHlwZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249ImphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OiIvPgotICAgICAgICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLmRlYnVnZ2VyJnF1b3Q7Jmd0OwotICAgICAgJmx0O2RlYnVnZ2VyCi0gICAgICAgICAgICBjbGFzc05hbWU9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi5kZWJ1Z2dlci5YYWxhbkRlYnVnZ2VyJnF1b3Q7Ci0gICAgICAgICAgICBjbGFzc3BhdGg9JnF1b3Q7JHtlY2xpcHNlX29yYml0Om9yZy5lY2xpcHNlLndzdC54c2wueGFsYW59JnF1b3Q7Ci0gICAgICAgICAgICBpZD0mcXVvdDtvcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLmRlYnVnZ2VyJnF1b3Q7Ci0gICAgICAgICAgICBuYW1lPSZxdW90O1hhbGFuIDIuNS4xIG9yIGdyZWF0ZXImcXVvdDsKLSAgICAgICAgICAgIHByb2Nlc3NvclR5cGVJZD0mcXVvdDtvcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLnByb2Nlc3NvclR5cGUmcXVvdDsKLSAgICAgICAgICAgIHRyYW5zZm9ybWVyRmFjdG9yeUNsYXNzPSZxdW90O29yZy5hcGFjaGUueGFsYW4ucHJvY2Vzc29yLlRyYW5zZm9ybWVyRmFjdG9yeUltcGwmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7L2RlYnVnZ2VyJmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotCi0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSAmbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrJmx0Oy9hJmd0Oy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NjaGVtYS9pbnZva2UuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zY2hlbWEvaW52b2tlLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMGMxZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NjaGVtYS9pbnZva2UuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmpheHAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuamF4cCIgaWQ9Imludm9rZSIgbmFtZT0iWFNMVCBQcm9jZXNzb3IgSW52b2tlciIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGludGVybmFsPSJ0cnVlIiAvPgotICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJpbnZva2VyIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcGluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Imludm9rZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBVbmlxdWUgaWQgZm9yIHRoaXMgaW52b2tlcgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBJUHJvY2Vzc29ySW52b2tlciBpbnRlcmZhY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc3BhdGgiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSBzZW1pLWNvbG9uIHNlcGFyYXRlZCBsaXN0IG9mIGphcnMgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIGNvbnRyaWJ1dGluZyBwbHVnaW4uIE9uZSBvZiB0aGUgamFycyBtdXN0IGNvbnRhaW4gdGhlIEludm9rZXIgY2xhc3MgbmFtZWQgaW4gdGhlIGNsYXNzIGF0dHJpYnV0ZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotCi0KLQotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51ayZxdW90OyZndDtodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51ayZsdDsvYSZndDsuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zY2hlbWEvcHJvY2Vzc29yLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc2NoZW1hL3Byb2Nlc3Nvci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTllMDhjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zY2hlbWEvcHJvY2Vzc29yLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuamF4cCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5qYXhwIiBpZD0icHJvY2Vzc29yIiBuYW1lPSJYU0xUIFByb2Nlc3NvciIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb250cmlidXRlIGEgSmF2YSBYU0xUIHByb2Nlc3NvciBpbnN0YW5jZSAoZS5nLiBYYWxhbiAyLjcuMCkuIFRoZSBleHRlbnNpb24gcG9pbnQgcHJpbWFyaWx5IGRlZmluZXMgdGhlIGNsYXNzcGF0aCB0byBiZSB1c2VkIHdoZW4gbGF1bmNoaW5nIGFuIFhTTFQgdHJhbnNmb3JtYXRpb24uCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCAvPgotICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJwcm9jZXNzb3IiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icHJvY2Vzc29yIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJsYWJlbCIvPgotICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBBbiBpbnN0YW5jZSBvZiBhIEpBWFAtY29tcGxpYW50IFhTTFQgcHJvY2Vzc29yCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgdW5pcXVlIGlkIGZvciB0aGlzIHByb2Nlc3NvciBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImxhYmVsIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgbGFiZWwgZm9yIHRoaXMgaW5zdGFuY2UgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBVSQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcGluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJvY2Vzc29yVHlwZUlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBpZCBmb3IgdGhlIHByb2Nlc3NvciB0eXBlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NwYXRoIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBjbGFzc3BhdGggdG8gdXNlIHdoZW4gdGhpcyBwcm9jZXNzb3IgaXMgbGF1bmNoZWQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZWJ1Z2dlcklkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBpZCBvZiBhIGRlYnVnZ2VyIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBwcm9jZXNzb3IKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdXBwb3J0cyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHN1cHBvcnRlZCBYU0xUIHZlcnNpb25zIGUuZy4gMS4wLDIuMAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLnByb2Nlc3NvciZxdW90OyZndDsKLSAgICAgICZsdDshLS0gQW4gYWRvcHRlciBjYW4gc3BlY2lmeSB0aGUgJHtlY2xpcHNlX29yYml0OiB9IHZhcmlhYmxlIHRvIGluZGljYXRlIHdoaWNoIGVjbGlwc2UKLSAgICAgICAgICAgYnVuZGxlIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgY2xhc3MgcGF0aC4gLS0mZ3Q7Ci0gICAgICAmbHQ7cHJvY2Vzc29yCi0gICAgICBjbGFzc3BhdGg9JnF1b3Q7JHtlY2xpcHNlX29yYml0Om9yZy5hcGFjaGUueGFsYW59OyR7ZWNsaXBzZV9vcmJpdDpvcmcuYXBhY2hlLnhtbC5zZXJpYWxpemVyfTske2VjbGlwc2Vfb3JiaXQ6b3JnLmFwYWNoZS5iY2VsfTske2VjbGlwc2Vfb3JiaXQ6amF2YV9jdXAucnVudGltZX0mcXVvdDsKLSAgICAgICAgICAgIGlkPSZxdW90O29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLnhhbGFuLnByb2Nlc3NvciZxdW90OwotICAgICAgICAgICAgbGFiZWw9JnF1b3Q7JXByb2Nlc3Nvci5sYWJlbC4xJnF1b3Q7Ci0gICAgICAgICAgICBwcm9jZXNzb3JUeXBlSWQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi5wcm9jZXNzb3JUeXBlJnF1b3Q7Ci0gICAgICAgICAgICBkZWJ1Z2dlcklkPSZxdW90O29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4uZGVidWdnZXImcXVvdDsKLSAgICAgICAgICAgIHN1cHBvcnRzPSZxdW90OzEuMCZxdW90OyZndDsKLSAgICAgICZsdDsvcHJvY2Vzc29yJmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotCi0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSAmbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrJmx0Oy9hJmd0Oy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NjaGVtYS9wcm9jZXNzb3JUeXBlLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc2NoZW1hL3Byb2Nlc3NvclR5cGUuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFhZGE1Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc2NoZW1hL3Byb2Nlc3NvclR5cGUuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5qYXhwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmpheHAiIGlkPSJwcm9jZXNzb3JUeXBlIiBuYW1lPSJYU0xUIFByb2Nlc3NvciBUeXBlIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvbnRyaWJ1dGUgYSBKYXZhIFhTTFQgcHJvY2Vzc29yIHR5cGUgKGUuZy4gWGFsYW4sIFNheG9uKS4gVGhlIHByb2Nlc3NvciB0eXBlIGRlZmluZXMgd2hpY2ggSkFYUCBhdHRyaWJ1dGVzIGFuZCBvdXRwdXQgcHJvcGVyaWVzIGFyZSBzdXBwb3J0ZWQsIGFuZCBhbHNvIHRoZSB0cmFuc2Zvcm1lciBmYWN0b3J5IGNsYXNzZXMgaXQgY29udGFpbnMuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCAvPgotICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJwcm9jZXNzb3JUeXBlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcGluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InByb2Nlc3NvclR5cGUiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9ImxhYmVsIi8+Ci0gICAgICAgICA8L2FwcGluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InRyYW5zZm9ybWVyRmFjdG9yeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVW5pcXVlIGlkIGZvciB0aGUgcHJvY2Vzc29yIHR5cGUKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsYWJlbCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBOYW1lIGZvciBkaXNwbGF5IGluIHRoZSBVSQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcGluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3V0cHV0UHJvcGVydGllcyIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBMb2NhdGlvbiBvZiBhIHByb3BlcnRpZXMgZmlsZSBjb250YWluaW5nIHRoZSBsaXN0IG9mIHRoZSBwcm9jZXNzb3JzIG91dHB1dCBwcm9wZXJ0aWVzLiBNdXN0IGJlIGEgcGF0aCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgYnVuZGxlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImF0dHJpYnV0ZVByb3BlcnRpZXMiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgTG9jYXRpb24gb2YgYSBwcm9wZXJ0aWVzIGZpbGUgY29udGFpbmluZyB0aGUgbGlzdCBvZiB0aGUgYXR0cmlidXRlcyBzdXBwb3J0ZWQgYnkgdGhpcyBwcm9jZXNzb3IuIE11c3QgYmUgYSBwYXRoIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBidW5kbGUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InRyYW5zZm9ybWVyRmFjdG9yeSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgQSBUcmFuc2Zvcm1lckZhY3RvcnkgZm9yIHRoaXMgdHlwZQotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWN0b3J5Q2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGZ1bGx5LXF1YWxpZmllZCB0cmFuc2Zvcm1lciBmYWN0b3J5IGNsYXNzCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeToiLz4KLSAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgbmFtZSBmb3IgdGhpcyB0cmFuc2Zvcm1lciBmYWN0b3J5IHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgVUkKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLnByb2Nlc3NvclR5cGUmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7cHJvY2Vzc29yVHlwZQotICAgICAgICAgICAgYXR0cmlidXRlUHJvcGVydGllcz0mcXVvdDtYYWxhbkF0dHJpYnV0ZXMucHJvcGVydGllcyZxdW90OwotICAgICAgICAgICAgaWQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi5wcm9jZXNzb3JUeXBlJnF1b3Q7Ci0gICAgICAgICAgICBsYWJlbD0mcXVvdDslcHJvY2Vzc29yVHlwZS5sYWJlbC4wJnF1b3Q7Ci0gICAgICAgICAgICBvdXRwdXRQcm9wZXJ0aWVzPSZxdW90O1hhbGFuT3V0cHV0UHJvcGVydGllcy5wcm9wZXJ0aWVzJnF1b3Q7Jmd0OwotICAgICAgICAgJmx0O3RyYW5zZm9ybWVyRmFjdG9yeQotICAgICAgICAgICAgICAgZmFjdG9yeUNsYXNzPSZxdW90O29yZy5hcGFjaGUueGFsYW4ucHJvY2Vzc29yLlRyYW5zZm9ybWVyRmFjdG9yeUltcGwmcXVvdDsKLSAgICAgICAgICAgICAgIG5hbWU9JnF1b3Q7SW50ZXJwcmV0aXZlJnF1b3Q7Jmd0OwotICAgICAgICAgJmx0Oy90cmFuc2Zvcm1lckZhY3RvcnkmZ3Q7Ci0gICAgICAgICAmbHQ7dHJhbnNmb3JtZXJGYWN0b3J5Ci0gICAgICAgICAgICAgICBmYWN0b3J5Q2xhc3M9JnF1b3Q7b3JnLmFwYWNoZS54YWxhbi54c2x0Yy50cmF4LlRyYW5zZm9ybWVyRmFjdG9yeUltcGwmcXVvdDsKLSAgICAgICAgICAgICAgIG5hbWU9JnF1b3Q7Q29tcGlsaW5nJnF1b3Q7Jmd0OwotICAgICAgICAgJmx0Oy90cmFuc2Zvcm1lckZhY3RvcnkmZ3Q7Ci0gICAgICAmbHQ7L3Byb2Nlc3NvclR5cGUmZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtICZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsmcXVvdDsmZ3Q7aHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsmbHQ7L2EmZ3Q7LiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvSUF0dHJpYnV0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL0lBdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY3OTE0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvSUF0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi0vKioKLSAqIEEgYXR0cmlidXRlIHN1cHBvcnRlZCBieSBhbiBYU0xUIHByb2Nlc3Nvci4gCi0gKiAKLSAqIEBhdXRob3IgRG91ZyBTYXRjaHdlbGwKLSAqLwotcHVibGljIGludGVyZmFjZSBJQXR0cmlidXRlCi17Ci0JLyoqCi0JICogQ29uc3RhbnQgZm9yIGF0dHJpYnV0ZXMgb2YgdHlwZSA8Y29kZT5zdHJpbmc8L2NvZGU+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICovCi0JU3RyaW5nIFRZUEVfU1RSSU5HID0gInN0cmluZyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb25zdGFudCBmb3IgYXR0cmlidXRlcyBvZiB0eXBlIDxjb2RlPmJvb2xlYW48L2NvZGU+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICovCi0JU3RyaW5nIFRZUEVfQk9PTEVBTiA9ICJib29sZWFuIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENvbnN0YW50IGZvciBhdHRyaWJ1dGVzIG9mIHR5cGUgPGNvZGU+aW50PC9jb2RlPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqLwotCVN0cmluZyBUWVBFX0lOVCA9ICJpbnQiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ29uc3RhbnQgZm9yIGF0dHJpYnV0ZXMgb2YgdHlwZSA8Y29kZT5kb3VibGU8L2NvZGU+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICovCi0JU3RyaW5nIFRZUEVfRE9VQkxFID0gImRvdWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb25zdGFudCBmb3IgYXR0cmlidXRlcyBvZiB0eXBlIDxjb2RlPmZsb2F0PC9jb2RlPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqLwotCVN0cmluZyBUWVBFX0ZMT0FUID0gImZsb2F0IjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENvbnN0YW50IGZvciBhdHRyaWJ1dGVzIG9mIHR5cGUgPGNvZGU+Y2xhc3M8L2NvZGU+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICovCi0JU3RyaW5nIFRZUEVfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ29uc3RhbnQgZm9yIGF0dHJpYnV0ZXMgb2YgdHlwZSA8Y29kZT5vYmplY3Q8L2NvZGU+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICovCi0JU3RyaW5nIFRZUEVfT0JKRUNUID0gIm9iamVjdCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEdldCB0aGUgVVJJIGZvciB0aGlzIGF0dHJpYnV0ZQotCSAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSBVUkkKLQkgKi8KLQlTdHJpbmcgZ2V0VVJJKCk7Ci0KLQkvKioKLQkgKiBHZXQgYSBkZXNjcmlwdGlvbiBmb3IgdGhpcyBhdHRyaWJ1dGUKLQkgKiBAcmV0dXJuIHRoZSBhdHRyaWJ1dGUgZGVzY3JpcHRpb24KLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEdldCB0aGUgdHlwZSBvZiB0aGlzIGF0dHJpYnV0ZS4gV2lsbCBtYXRjaCBvbmUgb2YgdGhlIFRZUEUgY29uc3RhbnRzIGluIHRoaXMgaW50ZXJmYWNlLgotCSAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSB0eXBlOiBvbmUgb2YgPGNvZGU+VFlQRV9TVFJJTkc8L2NvZGU+LCA8Y29kZT5UWVBFX0JPT0xFQU48L2NvZGU+LCAKLQkgKiA8Y29kZT5UWVBFX0lOVDwvY29kZT4sIDxjb2RlPlRZUEVfRE9VQkxFPC9jb2RlPiwgPGNvZGU+VFlQRV9GTE9BVDwvY29kZT4sIDxjb2RlPlRZUEVfQ0xBU1M8L2NvZGU+LCAKLQkgKiBvciA8Y29kZT5UWVBFX09CSkVDVDwvY29kZT4KLQkgKi8KLQlTdHJpbmcgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIGlzIGEgdmFsaWQgb25lIGZvciB0aGlzIGF0dHJpYnV0ZS4KLQkgKiBAcmV0dXJuIGFuIDxjb2RlPklTdGF0dXM8L2NvZGU+IHdpdGggc2V2ZXJpdHkgPGNvZGU+T0s8L2NvZGU+IGlmIHZhbGlkLCBvciA8Y29kZT5FUlJPUjwvY29kZT4gaWYgaW52YWxpZC4KLQkgKi8KLQlJU3RhdHVzIHZhbGlkYXRlVmFsdWUoU3RyaW5nIHZhbHVlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9JRGVidWdnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9JRGVidWdnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUwMmY5NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvSURlYnVnZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nOwotCi0vKioKLSAqIEFuIFhTTFQgZGVidWdnZXIuIFR5cGljYWxseSB0aGlzIHdpbGwgaGF2ZSBiZWVuIAotICogY29udHJpYnV0ZWQgdmlhIHRoZSA8Y29kZT5vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5kZWJ1Z2dlcjwvY29kZT4gZXh0ZW5zaW9uIHBvaW50LgotICogCi0gKiBAYXV0aG9yIERvdWcgU2F0Y2h3ZWxsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURlYnVnZ2VyCi17Ci0JLyoqCi0JICogR2V0IHRoZSB1bmlxdWUgaWQgZm9yIHRoaXMgZGVidWdnZXIuCi0JICogQHJldHVybiBkZWJ1Z2dlciBpZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogR2V0IHRoZSBzZXQgb2YgYnVuZGxlLXJlbGF0aXZlIGphciBmaWxlcyB0byBhZGQgdG8gdGhlIGNsYXNzcGF0aC4gCi0JICogQHJldHVybiBhcnJheSBvZiBidW5kbGUtcmVsYXRpdmUgamFycwotCSAqLwotCVN0cmluZ1tdIGdldENsYXNzUGF0aCgpOwotCi0JLyoqCi0JICogR2V0IGEgdW5pcXVlIG5hbWUgZm9yIHRoaXMgZGVidWdnZXIKLQkgKiBAcmV0dXJuIHRoZSBuYW1lIGZvciB0aGUgZGVidWdnZXIKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogR2V0IHRoZSBwcm9jZXNzb3IgdHlwZSB0aGF0IHRoaXMgZGVidWdnZXIgaXMgYXNzb2NpYXRlZCB3aXRoCi0JICogQHJldHVybiB0aGUgcHJvY2Vzc29yIHR5cGUKLQkgKi8KLQlJUHJvY2Vzc29yVHlwZSBnZXRQcm9jZXNzb3JUeXBlKCk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGNsYXNzIG5hbWUgZm9yIHRoaXMgZGVidWdnZXIKLQkgKiBAcmV0dXJuIHRoZSBjbGFzcyBuYW1lCi0JICovCi0JU3RyaW5nIGdldENsYXNzTmFtZSgpOwotCQotCS8qKgotCSAqIEdldCB0aGUgdHJhbnNmb3JtZXIgZmFjdG9yeSB0aGlzIGRlYnVnZ2VyIGlzIGFzc29jaWF0ZWQgd2l0aAotCSAqIEByZXR1cm4gdGhlIHRyYW5zZm9ybWVyIGZhY3RvcnkKLQkgKi8KLQlTdHJpbmcgZ2V0VHJhbnNmb3JtZXJGYWN0b3J5KCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvSU91dHB1dFByb3BlcnR5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvSU91dHB1dFByb3BlcnR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliZDJjNzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL0lPdXRwdXRQcm9wZXJ0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZzsKLQotLyoqCi0gKiBBbiBvdXRwdXQgcHJvcGVydHkgc3VwcG9ydGVkIGJ5IGFuIFhTTFQgcHJvY2Vzc29yLiAKLSAqIAotICogQGF1dGhvciBEb3VnIFNhdGNod2VsbAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElPdXRwdXRQcm9wZXJ0eQotewotCS8qKgotCSAqIEdldCB0aGUgVVJJIG9mIHRoaXMgb3V0cHV0IHByb3BlcnR5LiAKLQkgKiBAcmV0dXJuIGEgdW5pcXVlIFVSSQotCSAqLwotCVN0cmluZyBnZXRVUkkoKTsKLQotCS8qKgotCSAqIEdldCBhIGRlc2NyaXB0aW9uIGZvciB0aGlzIG91dHB1dCBwcm9wZXJ0eS4gCi0JICogQHJldHVybiBhIGRlc2NyaXB0aW9uCi0JICovCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvSVByb2Nlc3Nvckluc3RhbGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9JUHJvY2Vzc29ySW5zdGFsbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2FiMjdiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9JUHJvY2Vzc29ySW5zdGFsbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZzsKLQotLyoqCi0gKiBBbiBpbnN0YW5jZSBvZiBhbiBYU0xUIHByb2Nlc3NvciAoZS5nLiBYYWxhbiAyLjcuMCkuCi0gKiAKLSAqIEBzZWUgSVByb2Nlc3Nvckluc3RhbGwKLSAqIEBhdXRob3IgRG91ZyBTYXRjaHdlbGwKLSAqLwotcHVibGljIGludGVyZmFjZSBJUHJvY2Vzc29ySW5zdGFsbAotewotCS8qKgotCSAqIEdldCB0aGUgdW5xaXVlIGlkIG9mIHRoaXMgaW5zdGFsbAotCSAqIEByZXR1cm4gdGhlIHVuaXF1ZSBpZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogR2V0IHRoZSBuYW1lIG9mIHRoaXMgaW5zdGFsbAotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBpbnN0YWxsCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIEdldCB0aGUgdGhlIHByb2Nlc3NvciB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGluc3RhbGwKLQkgKiBAcmV0dXJuIHRoZSBwcm9jZXNzb3IgdHlwZSBpZAotCSAqLwotCUlQcm9jZXNzb3JUeXBlIGdldFByb2Nlc3NvclR5cGUoKTsKLQotCS8qKgotCSAqIEdldCB0aGUgamFyIGZpbGVzIGZvciB0aGlzIHByb2Nlc3NvcgotCSAqIEByZXR1cm4gYSBzZXQgb2YgamFyIGZpbGVzCi0JICovCi0JSVByb2Nlc3NvckphcltdIGdldFByb2Nlc3NvckphcnMoKTsKLQotCS8qKgotCSAqIEdldCB3aGV0aGVyIHRoaXMgaW5zdGFsbCBoYXMgYmVlbiBjb250cmlidXRlZCB2aWEgdGhlIDxjb2RlPm9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLnByb2Nlc3NvcjwvY29kZT4gZXh0ZW5zaW9uIHBvaW50LgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgY29udHJpYnV0ZWQgdmlhIHRoZSBleHRlbnNpb24gcG9pbnQsIG90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICovCi0JYm9vbGVhbiBpc0NvbnRyaWJ1dGVkKCk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIFhTTFQgdmVyc2lvbnMKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaW5zdGFsbCBoYXMgYSBkZWJ1Z2dlciwgb3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKi8KLQkvLyBUT0RPIGRlcHJlY2F0ZSBhbmQgdXNlIGJvb2xlYW4gc3VwcG9ydHMgaW5zdGFlZAotCVN0cmluZyBnZXRTdXBwb3J0cygpOwotCi0JLyoqCi0JICogR2V0IHdoZXRoZXIgdGhpcyBpbnN0YWxsIHN1cHBvcnRzIHRoZSBzcGVjaWZpZWQgeHNsdCB2ZXJzaW9uLgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpbnN0YWxsIHN1cHBvcnRzIHRoZSB2ZXJzaW9uLCBvdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+LgotCSAqLwotCWJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHhzbHRWZXJzaW9uKTsKLQotCS8qKgotCSAqIEdldCB0aGUgZGVidWdnZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW5zdGFsbAotCSAqIEByZXR1cm4gdGhlIGRlYnVnZ2VyLCBvciBudWxsIGlmIG5vIGRlYnVnZ2VyIGhhcyBiZWVuIHNldAotCSAqLwotCUlEZWJ1Z2dlciBnZXREZWJ1Z2dlcigpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL0lQcm9jZXNzb3JJbnZva2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvSVByb2Nlc3Nvckludm9rZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQwMTAxYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvSVByb2Nlc3Nvckludm9rZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmc7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVByb2Nlc3Nvckludm9rZXIKLXsKLQlTdHJpbmcgZ2V0SWQoKTsKLQotCVN0cmluZyBnZXRJbnZva2VyQ2xhc3NOYW1lKCk7Ci0KLQlTdHJpbmdbXSBnZXRDbGFzc3BhdGhFbnRyaWVzKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvSVByb2Nlc3Nvckphci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL0lQcm9jZXNzb3JKYXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMwNTJiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvSVByb2Nlc3Nvckphci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZzsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLQotLyoqCi0gKiBBIGphciBmaWxlIGZvciBhbiBYU0xUIHByb2Nlc3NvcgotICogCi0gKiBAc2VlIElQcm9jZXNzb3JJbnN0YWxsCi0gKiBAYXV0aG9yIERvdWcgU2F0Y2h3ZWxsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVByb2Nlc3NvckphcgotewotCS8qKgotCSAqIFRoZSBwYXRoIG1heSBiZSByZWxhdGl2ZSBvciBhYnNvbHV0ZTsgaW4gdGhlIHdvcmtzcGFjZSBvciBleHRlcm5hbC4KLQkgKiBAcmV0dXJuIHRoZSBwYXRoIHRvIHRoaXMgamFyCi0JICovCi0JSVBhdGggZ2V0UGF0aCgpOwotCi0JLyoqCi0JICogVGhlIFVSTCB3aWxsIGFsd2F5cyBiZSBhYnNvbHV0ZSBhbmQgY2FuIGJlIG9wZW5lZC4KLQkgKiBAcmV0dXJuIGEgVVJMIHRvIHRoZSBqYXIKLQkgKi8KLQlVUkwgYXNVUkwoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9JUHJvY2Vzc29yVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL0lQcm9jZXNzb3JUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxM2U3MDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL0lQcm9jZXNzb3JUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBBIHBhcnRpY3VsYXIgdHlwZSBvZiBYU0xUIFByb2Nlc3NvciAoZS5nLiBYYWxhbikgZm9yIHdoaWNoIHRoZXJlIG1heSBiZSBhbnkgbnVtYmVyIG9mIGluc3RhbGxzLgotICogCi0gKiBAc2VlIElQcm9jZXNzb3JJbnN0YWxsCi0gKiBAYXV0aG9yIERvdWcgU2F0Y2h3ZWxsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVByb2Nlc3NvclR5cGUKLXsKLQlTdHJpbmcgZ2V0SWQoKTsKLQotCVN0cmluZyBnZXRMYWJlbCgpOwotCi0JYm9vbGVhbiBpc0pSRURlZmF1bHQoKTsKLQotCUlUcmFuc2Zvcm1lckZhY3RvcnlbXSBnZXRUcmFuc2Zvcm1lckZhY3RvcmllcygpOwotCi0JSUF0dHJpYnV0ZVtdIGdldEF0dHJpYnV0ZXMoKTsKLQotCU1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0QXR0cmlidXRlVmFsdWVzKCk7Ci0KLQlJT3V0cHV0UHJvcGVydHlbXSBnZXRPdXRwdXRQcm9wZXJ0aWVzKCk7Ci0KLQlNYXA8U3RyaW5nLCBTdHJpbmc+IGdldE91dHB1dFByb3BlcnR5VmFsdWVzKCk7Ci0KLQlJVHJhbnNmb3JtZXJGYWN0b3J5IGdldERlZmF1bHRUcmFuc2Zvcm1lckZhY3RvcnkoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9JVHJhbnNmb3JtZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvSVRyYW5zZm9ybWVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDcxNmFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9JVHJhbnNmb3JtZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZzsKLQotcHVibGljIGludGVyZmFjZSBJVHJhbnNmb3JtZXJGYWN0b3J5Ci17Ci0JU3RyaW5nIGdldE5hbWUoKTsKLQlTdHJpbmcgZ2V0RmFjdG9yeUNsYXNzKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvSkFYUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9KQVhQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWNmODJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9KQVhQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuaW50ZXJuYWwuSkFYUExhdW5jaGluZ1BsdWdpbjsKLQotcHVibGljIGNsYXNzIEpBWFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5WT0tFUl9ERVNDUklQVE9SID0gSkFYUExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQgKyAiLklOVk9LRVJfREVTQ1JJUFRPUiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1BST0NFU1NPUiA9IEpBWFBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lEICsgIi5BVFRSX1BST0NFU1NPUiI7IC8vJE5PTi1OTFMtMSQJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9PVVRQVVRfUFJPUEVSVElFUyA9IEpBWFBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lEICsgIi5BVFRSX09VVFBVVF9QUk9QRVJUSUVTIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQVRUUklCVVRFUyA9IEpBWFBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lEICsgIi5BVFRSX0FUVFJJQlVURVMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9ERUZBVUxUX0RFQlVHR0lOR19JTlNUQUxMX0lEID0gSkFYUExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQgKyAiLkFUVFJfREVGQVVMVF9ERUJVR0dJTkdfSU5TVEFMTF9JRCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1VTRV9ERUZBVUxUX1BST0NFU1NPUiA9IEpBWFBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lEICsgIi5BVFRSX1VTRV9ERUZBVUxUX1BST0NFU1NPUiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1RSQU5TRk9STUVSX0ZBQ1RPUlkgPSBKQVhQTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCArICIuQVRUUl9UUkFOU0ZPUk1FUl9GQUNUT1JZIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhBTEFOX1RZUEVfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi5wcm9jZXNzb3JUeXBlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBWE9OX1RZUEVfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzbC5zYXhvbi5wcm9jZXNzb3JUeXBlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBWE9OXzFfMF9UWVBFX0lEID0gIm9yZy5lY2xpcHNlLndzdC54c2wuc2F4b25fMV8wLnByb2Nlc3NvclR5cGUiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvSkFYUFJ1bnRpbWUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9KQVhQUnVudGltZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjllODJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9KQVhQUnVudGltZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLmludGVybmFsLkZlYXR1cmVQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLmludGVybmFsLkpBWFBMYXVuY2hpbmdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5pbnRlcm5hbC5PdXRwdXRQcm9wZXJ0eVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuaW50ZXJuYWwuUHJvY2Vzc29ySmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuaW50ZXJuYWwuUHJvY2Vzc29yUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5pbnRlcm5hbC5yZWdpc3RyeS5EZWJ1Z2dlclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuaW50ZXJuYWwucmVnaXN0cnkuSW52b2tlclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuaW50ZXJuYWwucmVnaXN0cnkuUHJvY2Vzc29yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5pbnRlcm5hbC5yZWdpc3RyeS5Qcm9jZXNzb3JUeXBlUmVnaXN0cnk7Ci0KLXB1YmxpYyBjbGFzcyBKQVhQUnVudGltZQotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfUFJPQ0VTU09SX1hNTCA9ICJQUkVGX1BST0NFU1NPUl9YTUwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9GRUFUVVJFX1hNTCA9ICJQUkVGX0ZFQVRVUkVfWE1MIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfT1VUUFVUX1BST1BFUlRJRVNfWE1MID0gIlBSRUZfT1VUUFVUX1BST1BFUlRJRVNfWE1MIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpSRV9ERUZBVUxUX1BST0NFU1NPUl9JRCA9ICJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5qcmUuZGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKUkVfREVGQVVMVF9QUk9DRVNTT1JfVFlQRV9JRCA9ICJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5wcm9jZXNzb3JUeXBlLmpyZURlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBieXRlW10gTkVYVF9JRF9MT0NLID0gbmV3IGJ5dGVbMF07Ci0JcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIFJFR0lTVFJZX0xPQ0sgPSBuZXcgYnl0ZVswXTsKLQotCXByaXZhdGUgc3RhdGljIGludCBsYXN0U3RhbmRpbklEOwotCXByaXZhdGUgc3RhdGljIFByb2Nlc3NvclR5cGVSZWdpc3RyeSBwcm9jZXNzb3JUeXBlUmVnaXN0cnk7Ci0JcHJpdmF0ZSBzdGF0aWMgUHJvY2Vzc29yUmVnaXN0cnkgcHJvY2Vzc29yUmVnaXN0cnk7Ci0JcHJpdmF0ZSBzdGF0aWMgSW52b2tlclJlZ2lzdHJ5IGludm9rZXJSZWdpc3RyeTsKLQlwcml2YXRlIHN0YXRpYyBEZWJ1Z2dlclJlZ2lzdHJ5IGRlYnVnZ2VyUmVnaXN0cnk7Ci0KLQlwcml2YXRlIHN0YXRpYyBQcm9jZXNzb3JUeXBlUmVnaXN0cnkgZ2V0UHJvY2Vzc29yVHlwZVJlZ2lzdHJ5KCkKLQl7Ci0JCXN5bmNocm9uaXplZCAoUkVHSVNUUllfTE9DSykKLQkJewotCQkJaWYgKHByb2Nlc3NvclR5cGVSZWdpc3RyeSA9PSBudWxsKQotCQkJCXByb2Nlc3NvclR5cGVSZWdpc3RyeSA9IG5ldyBQcm9jZXNzb3JUeXBlUmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gcHJvY2Vzc29yVHlwZVJlZ2lzdHJ5OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgUHJvY2Vzc29yUmVnaXN0cnkgZ2V0UHJvY2Vzc29yUmVnaXN0cnkoKQotCXsKLQkJc3luY2hyb25pemVkIChSRUdJU1RSWV9MT0NLKQotCQl7Ci0JCQlpZiAocHJvY2Vzc29yUmVnaXN0cnkgPT0gbnVsbCkKLQkJCQlwcm9jZXNzb3JSZWdpc3RyeSA9IG5ldyBQcm9jZXNzb3JSZWdpc3RyeSgpOwotCQl9Ci0JCXJldHVybiBwcm9jZXNzb3JSZWdpc3RyeTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJbnZva2VyUmVnaXN0cnkgZ2V0SW52b2tlclJlZ2lzdHJ5KCkKLQl7Ci0JCXN5bmNocm9uaXplZCAoUkVHSVNUUllfTE9DSykKLQkJewotCQkJaWYgKGludm9rZXJSZWdpc3RyeSA9PSBudWxsKQotCQkJCWludm9rZXJSZWdpc3RyeSA9IG5ldyBJbnZva2VyUmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gaW52b2tlclJlZ2lzdHJ5OwotCX0KLQotCXByaXZhdGUgc3RhdGljIERlYnVnZ2VyUmVnaXN0cnkgZ2V0RGVidWdnZXJSZWdpc3RyeSgpCi0JewotCQlzeW5jaHJvbml6ZWQgKFJFR0lTVFJZX0xPQ0spCi0JCXsKLQkJCWlmIChkZWJ1Z2dlclJlZ2lzdHJ5ID09IG51bGwpCi0JCQkJZGVidWdnZXJSZWdpc3RyeSA9IG5ldyBEZWJ1Z2dlclJlZ2lzdHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIGRlYnVnZ2VyUmVnaXN0cnk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgc2F2ZVByZWZlcmVuY2VzKCkKLQl7Ci0JCUpBWFBMYXVuY2hpbmdQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlzeW5jaHJvbml6ZWQgKFJFR0lTVFJZX0xPQ0spCi0JCXsKLQkJCS8vIGZvcmNlIHRoZSByZWdpc3RyaWVzIHRvIGJlIHJlLWluaXRpYWxpc2VkIG5leHQgdGltZSBpdCBpcyByZXF1aXJlZAotCQkJcHJvY2Vzc29yUmVnaXN0cnkgPSBudWxsOwotCQkJcHJvY2Vzc29yVHlwZVJlZ2lzdHJ5ID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEZpbmQgYSB1bmlxdWUgcHJvY2Vzc29yIGluc3RhbGwgaWQuIENoZWNrIGV4aXN0aW5nICdyZWFsJyBwcm9jZXNzb3JzLCBhcwotCSAqIHdlbGwgYXMgdGhlIGxhc3QgaWQgdXNlZCBmb3IgYSBzdGFuZGluLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZVVuaXF1ZVByb2Nlc3NvcklkKElQcm9jZXNzb3JUeXBlIHR5cGUpCi0JewotCQlJUHJvY2Vzc29ySW5zdGFsbFtdIGluc3RhbGxzID0gSkFYUFJ1bnRpbWUuZ2V0UHJvY2Vzc29ycyh0eXBlLmdldElkKCkpOwotCQlTdHJpbmcgaWQgPSBudWxsOwotCQlzeW5jaHJvbml6ZWQgKE5FWFRfSURfTE9DSykKLQkJewotCQkJZG8KLQkJCXsKLQkJCQlpZCA9IFN0cmluZy52YWx1ZU9mKCsrbGFzdFN0YW5kaW5JRCk7Ci0JCQl9Ci0JCQl3aGlsZSAoaXNUYWtlbihpZCwgaW5zdGFsbHMpKTsKLQkJfQotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJUHJvY2Vzc29ySmFyIGNyZWF0ZVByb2Nlc3NvckphcihJUGF0aCBwYXRoKQotCXsKLQkJcmV0dXJuIG5ldyBQcm9jZXNzb3JKYXIocGF0aCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1Rha2VuKFN0cmluZyBpZCwgSVByb2Nlc3Nvckluc3RhbGxbXSBpbnN0YWxscykKLQl7Ci0JCWZvciAoSVByb2Nlc3Nvckluc3RhbGwgaW5zdGFsbCA6IGluc3RhbGxzKQotCQl7Ci0JCQlpZiAoaW5zdGFsbC5nZXRJZCgpLmVxdWFscyhpZCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSURlYnVnZ2VyW10gZ2V0RGVidWdnZXJzKCkKLQl7Ci0JCXJldHVybiBnZXREZWJ1Z2dlclJlZ2lzdHJ5KCkuZ2V0RGVidWdnZXJzKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJRGVidWdnZXIgZ2V0RGVidWdnZXIoU3RyaW5nIGlkKQotCXsKLQkJcmV0dXJuIGdldERlYnVnZ2VyUmVnaXN0cnkoKS5nZXREZWJ1Z2dlcihpZCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJUHJvY2Vzc29ySW5zdGFsbFtdIGdldFByb2Nlc3NvcnMoKQotCXsKLQkJcmV0dXJuIGdldFByb2Nlc3NvclJlZ2lzdHJ5KCkuZ2V0UHJvY2Vzc29ycygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVByb2Nlc3Nvckluc3RhbGxbXSBnZXRQcm9jZXNzb3JzKFN0cmluZyB0eXBlSWQpCi0JewotCQlyZXR1cm4gZ2V0UHJvY2Vzc29yUmVnaXN0cnkoKS5nZXRQcm9jZXNzb3JzKHR5cGVJZCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJUHJvY2Vzc29ySW5zdGFsbCBnZXRQcm9jZXNzb3IoU3RyaW5nIHByb2Nlc3NvcklkKQotCXsKLQkJSVByb2Nlc3Nvckluc3RhbGxbXSBwcm9jZXNzb3JzID0gZ2V0UHJvY2Vzc29ycygpOwotCQlmb3IgKElQcm9jZXNzb3JJbnN0YWxsIGluc3RhbGwgOiBwcm9jZXNzb3JzKQotCQl7Ci0JCQlpZiAoaW5zdGFsbC5nZXRJZCgpLmVxdWFscyhwcm9jZXNzb3JJZCkpCi0JCQkJcmV0dXJuIGluc3RhbGw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJUHJvY2Vzc29ySW5zdGFsbCBnZXREZWZhdWx0UHJvY2Vzc29yKCkKLQl7Ci0JCXJldHVybiBnZXRQcm9jZXNzb3JSZWdpc3RyeSgpLmdldERlZmF1bHRQcm9jZXNzb3IoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElQcm9jZXNzb3JJbnN0YWxsIGdldEpSRURlZmF1bHRQcm9jZXNzb3IoKQotCXsKLQkJcmV0dXJuIGdldFByb2Nlc3NvclJlZ2lzdHJ5KCkuZ2V0SlJFRGVmYXVsdFByb2Nlc3NvcigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVByb2Nlc3NvclR5cGVbXSBnZXRQcm9jZXNzb3JUeXBlcygpCi0JewotCQlyZXR1cm4gZ2V0UHJvY2Vzc29yVHlwZVJlZ2lzdHJ5KCkuZ2V0UHJvY2Vzc29yVHlwZXMoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElQcm9jZXNzb3JUeXBlW10gZ2V0UHJvY2Vzc29yVHlwZXNFeGNsSlJFRGVmYXVsdCgpCi0JewotCQlyZXR1cm4gZ2V0UHJvY2Vzc29yVHlwZVJlZ2lzdHJ5KCkuZ2V0UHJvY2Vzc29yVHlwZXNFeGNsSlJFRGVmYXVsdCgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVByb2Nlc3NvclR5cGUgZ2V0UHJvY2Vzc29yVHlwZShTdHJpbmcgaWQpCi0JewotCQlyZXR1cm4gZ2V0UHJvY2Vzc29yVHlwZVJlZ2lzdHJ5KCkuZ2V0UHJvY2Vzc29yVHlwZShpZCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJUHJvY2Vzc29ySW52b2tlciBnZXRQcm9jZXNzb3JJbnZva2VyKFN0cmluZyBpbnZva2VySWQpCi0JewotCQlyZXR1cm4gZ2V0SW52b2tlclJlZ2lzdHJ5KCkuZ2V0UHJvY2Vzc29ySW52b2tlcihpbnZva2VySWQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVByb2Nlc3Nvckludm9rZXJbXSBnZXRQcm9jZXNzb3JJbnZva2VycygpCi0JewotCQlyZXR1cm4gZ2V0SW52b2tlclJlZ2lzdHJ5KCkuZ2V0UHJvY2Vzc29ySW52b2tlcnMoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcygpCi0JewotCQlyZXR1cm4gSkFYUExhdW5jaGluZ1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2F2ZUZlYXR1cmVQcmVmZXJlbmNlcyhNYXA8SVByb2Nlc3NvclR5cGUsIE1hcDxTdHJpbmcsIFN0cmluZz4+IHR5cGVGZWF0dXJlcywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJcmV0dXJuOwotCQl0cnkKLQkJewotCQkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMuWFNMVFJ1bnRpbWVfNSwgMTAwKTsgCi0JCQlGZWF0dXJlUHJlZmVyZW5jZXMgcHJlZnMgPSBuZXcgRmVhdHVyZVByZWZlcmVuY2VzKCk7Ci0JCQlNYXA8U3RyaW5nLE1hcDxTdHJpbmcsU3RyaW5nPj4gdHlwZUlkRmVhdHVyZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsTWFwPFN0cmluZyxTdHJpbmc+Pih0eXBlRmVhdHVyZXMuc2l6ZSgpKTsKLQkJCWZvciAoSVByb2Nlc3NvclR5cGUgdHlwZSA6IHR5cGVGZWF0dXJlcy5rZXlTZXQoKSkKLQkJCXsKLQkJCQlNYXA8U3RyaW5nLFN0cmluZz4gdmFsdWVzID0gdHlwZUZlYXR1cmVzLmdldCh0eXBlKTsKLQkJCQl0eXBlSWRGZWF0dXJlcy5wdXQodHlwZS5nZXRJZCgpLCB2YWx1ZXMpOwotCQkJfQotCQkJcHJlZnMuc2V0VHlwZUZlYXR1cmVzKHR5cGVJZEZlYXR1cmVzKTsKLQkJCVN0cmluZyB4bWwgPSBwcmVmcy5nZXRBc1hNTCgpOwotCQkJbW9uaXRvci53b3JrZWQoNDApOwotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCXJldHVybjsKLQkJCUpBWFBSdW50aW1lLmdldFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoSkFYUFJ1bnRpbWUuUFJFRl9GRUFUVVJFX1hNTCwgeG1sKTsKLQkJCW1vbml0b3Iud29ya2VkKDMwKTsKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQlyZXR1cm47Ci0JCQlKQVhQUnVudGltZS5zYXZlUHJlZmVyZW5jZXMoKTsKLQkJCW1vbml0b3Iud29ya2VkKDMwKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpCi0JCXsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUixKQVhQTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCxNZXNzYWdlcy5YU0xUUnVudGltZV82LGUpKTsgCi0JCX0KLQkJZmluYWxseQotCQl7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzYXZlT3V0cHV0UHJvcGVydHlQcmVmZXJlbmNlcyhNYXA8SVByb2Nlc3NvclR5cGUsIE1hcDxTdHJpbmcsU3RyaW5nPj4gdHlwZVByb3BlcnRpZXMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCXJldHVybjsKLQkJdHJ5Ci0JCXsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLlhTTFRSdW50aW1lXzcsIDEwMCk7IAotCQkJT3V0cHV0UHJvcGVydHlQcmVmZXJlbmNlcyBwcmVmcyA9IG5ldyBPdXRwdXRQcm9wZXJ0eVByZWZlcmVuY2VzKCk7Ci0JCQlmb3IgKElQcm9jZXNzb3JUeXBlIHR5cGUgOiB0eXBlUHJvcGVydGllcy5rZXlTZXQoKSkKLQkJCXsKLQkJCQlwcmVmcy5zZXRPdXRwdXRQcm9wZXJ0eVZhbHVlcyh0eXBlLmdldElkKCksIHR5cGVQcm9wZXJ0aWVzLmdldCh0eXBlKSk7Ci0JCQl9Ci0JCQlTdHJpbmcgeG1sID0gcHJlZnMuZ2V0QXNYTUwoKTsKLQkJCW1vbml0b3Iud29ya2VkKDQwKTsKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQlyZXR1cm47Ci0JCQlKQVhQUnVudGltZS5nZXRQcmVmZXJlbmNlcygpLnNldFZhbHVlKEpBWFBSdW50aW1lLlBSRUZfT1VUUFVUX1BST1BFUlRJRVNfWE1MLCB4bWwpOwotCQkJbW9uaXRvci53b3JrZWQoMzApOwotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCXJldHVybjsKLQkJCUpBWFBSdW50aW1lLnNhdmVQcmVmZXJlbmNlcygpOwotCQkJbW9uaXRvci53b3JrZWQoMzApOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkKLQkJewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLEpBWFBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lELE1lc3NhZ2VzLlhTTFRSdW50aW1lXzgsZSkpOyAKLQkJfQotCQlmaW5hbGx5Ci0JCXsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNhdmVQcm9jZXNzb3JQcmVmZXJlbmNlcyhJUHJvY2Vzc29ySW5zdGFsbFtdIGluc3RhbGxzLCBJUHJvY2Vzc29ySW5zdGFsbCBkZWZhdWx0SW5zdGFsbCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJcmV0dXJuOwotCQl0cnkKLQkJewotCQkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMuWFNMVFJ1bnRpbWVfOSwgMTAwKTsgCi0JCQlQcm9jZXNzb3JQcmVmZXJlbmNlcyBwcmVmcyA9IG5ldyBQcm9jZXNzb3JQcmVmZXJlbmNlcygpOwotCQkJaWYgKGRlZmF1bHRJbnN0YWxsICE9IG51bGwpCi0JCQkJcHJlZnMuc2V0RGVmYXVsdFByb2Nlc3NvcklkKGRlZmF1bHRJbnN0YWxsLmdldElkKCkpOwotCQkJcHJlZnMuc2V0UHJvY2Vzc29ycyhuZXcgQXJyYXlMaXN0PElQcm9jZXNzb3JJbnN0YWxsPihBcnJheXMuYXNMaXN0KGluc3RhbGxzKSkpOwotCQkJU3RyaW5nIHhtbCA9IHByZWZzLmdldEFzWE1MKCk7Ci0JCQltb25pdG9yLndvcmtlZCg0MCk7Ci0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJcmV0dXJuOwotCQkJSkFYUFJ1bnRpbWUuZ2V0UHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShKQVhQUnVudGltZS5QUkVGX1BST0NFU1NPUl9YTUwsIHhtbCk7Ci0JCQltb25pdG9yLndvcmtlZCgzMCk7Ci0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJcmV0dXJuOwotCQkJSkFYUFJ1bnRpbWUuc2F2ZVByZWZlcmVuY2VzKCk7Ci0JCQltb25pdG9yLndvcmtlZCgzMCk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsSkFYUExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQsTWVzc2FnZXMuWFNMVFJ1bnRpbWVfMTAsZSkpOyAKLQkJfQotCQlmaW5hbGx5Ci0JCXsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLFN0cmluZz4gY3JlYXRlRGVmYXVsdE91dHB1dFByb3BlcnRpZXMoU3RyaW5nIHR5cGVJZCkKLQl7Ci0JCU1hcDxTdHJpbmcsU3RyaW5nPiBwcm9wcyA9IG5ldyBIYXNoTWFwPFN0cmluZyxTdHJpbmc+KCk7Ci0JCWlmIChKUkVfREVGQVVMVF9QUk9DRVNTT1JfVFlQRV9JRC5lcXVhbHModHlwZUlkKSkKLQkJCXByb3BzLnB1dCgiaW5kZW50IiwgInllcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZWxzZSBpZiAoSkFYUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuWEFMQU5fVFlQRV9JRC5lcXVhbHModHlwZUlkKSkKLQkJewotCQkJcHJvcHMucHV0KCJpbmRlbnQiLCAieWVzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJcHJvcHMucHV0KCJ7aHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHR9aW5kZW50LWFtb3VudCIsICI0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWVsc2UgaWYgKEpBWFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLlNBWE9OX1RZUEVfSUQuZXF1YWxzKHR5cGVJZCkpCi0JCXsKLQkJCXByb3BzLnB1dCgiaW5kZW50IiwgInllcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXByb3BzLnB1dCgie2h0dHA6Ly9zYXhvbi5zZi5uZXQvfWluZGVudC1zcGFjZXMiLCAiNCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQllbHNlIGlmIChKQVhQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5TQVhPTl8xXzBfVFlQRV9JRC5lcXVhbHModHlwZUlkKSkKLQkJewotCQkJcHJvcHMucHV0KCJpbmRlbnQiLCAieWVzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJcHJvcHMucHV0KCJ7aHR0cDovL3NheG9uLnNmLm5ldC99aW5kZW50LXNwYWNlcyIsICI0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJldHVybiBwcm9wczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvTGF1bmNoQXR0cmlidXRlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL0xhdW5jaEF0dHJpYnV0ZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkODY5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvTGF1bmNoQXR0cmlidXRlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmc7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5jb25maWcuTGF1bmNoQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmNvbmZpZy5QcmVmZXJlbmNlVXRpbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1wdWJsaWMgY2xhc3MgTGF1bmNoQXR0cmlidXRlcwotewotCXByaXZhdGUgZmluYWwgU2V0PExhdW5jaEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IG5ldyBIYXNoU2V0PExhdW5jaEF0dHJpYnV0ZT4oKTsKLQotCXB1YmxpYyBTZXQ8TGF1bmNoQXR0cmlidXRlPiBnZXRBdHRyaWJ1dGVzKCkKLQl7Ci0JCXJldHVybiBhdHRyaWJ1dGVzOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEF0dHJpYnV0ZShMYXVuY2hBdHRyaWJ1dGUgYXR0cmlidXRlKQotCXsKLQkJYXR0cmlidXRlcy5hZGQoYXR0cmlidXRlKTsKLQl9Ci0KLQlwdWJsaWMgTGF1bmNoQXR0cmlidXRlIGdldEF0dHJpYnV0ZShTdHJpbmcgdXJpKQotCXsKLQkJZm9yIChJdGVyYXRvcjxMYXVuY2hBdHRyaWJ1dGU+IGl0ZXIgPSBhdHRyaWJ1dGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLQkJewotCQkJTGF1bmNoQXR0cmlidXRlIHR2ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAodHYudXJpLmVxdWFscyh1cmkpKQotCQkJCXJldHVybiB0djsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVBdHJpYnV0ZShTdHJpbmcgdXJpKQotCXsKLQkJZm9yIChJdGVyYXRvcjxMYXVuY2hBdHRyaWJ1dGU+IGl0ZXIgPSBhdHRyaWJ1dGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLQkJewotCQkJTGF1bmNoQXR0cmlidXRlIGF0dHJpYnV0ZSA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGF0dHJpYnV0ZS51cmkuZXF1YWxzKHVyaSkpCi0JCQkJaXRlci5yZW1vdmUoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9YTUwoKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFRyYW5zZm9ybWVyRXhjZXB0aW9uCi0JewotCQlEb2N1bWVudCBkb2MgPSBQcmVmZXJlbmNlVXRpbC5nZXREb2N1bWVudCgpOwotCi0JCUVsZW1lbnQgYXR0cmlidXRlc0VsID0gZG9jLmNyZWF0ZUVsZW1lbnQoIkF0dHJpYnV0ZXMiKTsgLy8kTk9OLU5MUy0xJAotCQlkb2MuYXBwZW5kQ2hpbGQoYXR0cmlidXRlc0VsKTsKLQotCQlmb3IgKEl0ZXJhdG9yPExhdW5jaEF0dHJpYnV0ZT4gaXRlciA9IGF0dHJpYnV0ZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotCQl7Ci0JCQlMYXVuY2hBdHRyaWJ1dGUgYXR0cmlidXRlID0gaXRlci5uZXh0KCk7Ci0JCQlFbGVtZW50IGF0dHJpYnV0ZUVsID0gZG9jLmNyZWF0ZUVsZW1lbnQoIkF0dHJpYnV0ZSIpOyAvLyROT04tTkxTLTEkCi0JCQlhdHRyaWJ1dGVFbC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBhdHRyaWJ1dGUudXJpKTsgLy8kTk9OLU5MUy0xJAotCQkJYXR0cmlidXRlRWwuc2V0QXR0cmlidXRlKCJ0eXBlIiwgYXR0cmlidXRlLnR5cGUpOyAvLyROT04tTkxTLTEkCi0JCQlhdHRyaWJ1dGVFbC5zZXRBdHRyaWJ1dGUoInZhbHVlIiwgYXR0cmlidXRlLnZhbHVlKTsgLy8kTk9OLU5MUy0xJAotCQkJYXR0cmlidXRlc0VsLmFwcGVuZENoaWxkKGF0dHJpYnV0ZUVsKTsKLQkJfQotCi0JCXJldHVybiBQcmVmZXJlbmNlVXRpbC5zZXJpYWxpemVEb2N1bWVudChkb2MpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGF1bmNoQXR0cmlidXRlcyBmcm9tWE1MKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJRG9jdW1lbnQgZG9jID0gUHJlZmVyZW5jZVV0aWwuZ2V0RG9jdW1lbnQoaW5wdXRTdHJlYW0pOwotCi0JCUxhdW5jaEF0dHJpYnV0ZXMgcGRlZiA9IG5ldyBMYXVuY2hBdHRyaWJ1dGVzKCk7Ci0KLQkJRWxlbWVudCBhdHRyaWJ1dGVzRWwgPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0KLQkJTm9kZUxpc3QgYXR0cmlidXRlRWxzID0gYXR0cmlidXRlc0VsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBdHRyaWJ1dGUiKTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZUVscy5nZXRMZW5ndGgoKTsgaSsrKQotCQl7Ci0JCQlFbGVtZW50IGF0dHJpYnV0ZUVsID0gKEVsZW1lbnQpIGF0dHJpYnV0ZUVscy5pdGVtKGkpOwotCQkJU3RyaW5nIG5hbWUgPSBhdHRyaWJ1dGVFbC5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHR5cGUgPSBhdHRyaWJ1dGVFbC5nZXRBdHRyaWJ1dGUoInR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHZhbHVlID0gYXR0cmlidXRlRWwuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpOyAvLyROT04tTkxTLTEkCi0JCQlwZGVmLmFkZEF0dHJpYnV0ZShuZXcgTGF1bmNoQXR0cmlidXRlKG5hbWUsIHR5cGUsIHZhbHVlKSk7Ci0JCX0KLQotCQlyZXR1cm4gcGRlZjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvTGF1bmNoUHJvcGVydGllcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL0xhdW5jaFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY5NjE0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvTGF1bmNoUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuY29uZmlnLlByZWZlcmVuY2VVdGlsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBMYXVuY2hQcm9wZXJ0aWVzCi17Ci0JcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQotCXB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFByb3BlcnRpZXMoKQotCXsKLQkJcmV0dXJuIHByb3BlcnRpZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkKLQl7Ci0JCXByb3BlcnRpZXMucHV0KG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBuYW1lKQotCXsKLQkJcmV0dXJuIHByb3BlcnRpZXMuZ2V0KG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5KFN0cmluZyBuYW1lKQotCXsKLQkJcHJvcGVydGllcy5yZW1vdmUobmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1hNTCgpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgVHJhbnNmb3JtZXJFeGNlcHRpb24KLQl7Ci0JCURvY3VtZW50IGRvYyA9IFByZWZlcmVuY2VVdGlsLmdldERvY3VtZW50KCk7Ci0KLQkJRWxlbWVudCBwcm9wZXJ0eXNFbCA9IGRvYy5jcmVhdGVFbGVtZW50KCJQcm9wZXJ0aWVzIik7IC8vJE5PTi1OTFMtMSQKLQkJZG9jLmFwcGVuZENoaWxkKHByb3BlcnR5c0VsKTsKLQotCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gcHJvcGVydHkgOiBwcm9wZXJ0aWVzLmVudHJ5U2V0KCkpCi0JCXsKLQkJCVN0cmluZyBuYW1lID0gcHJvcGVydHkuZ2V0S2V5KCk7Ci0JCQlTdHJpbmcgdmFsdWUgPSBwcm9wZXJ0eS5nZXRWYWx1ZSgpOwotCQkJRWxlbWVudCBwcm9wZXJ0eUVsID0gZG9jLmNyZWF0ZUVsZW1lbnQoIlByb3BlcnR5Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXByb3BlcnR5RWwuc2V0QXR0cmlidXRlKCJuYW1lIiwgbmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCXByb3BlcnR5RWwuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIHZhbHVlKTsgLy8kTk9OLU5MUy0xJAotCQkJcHJvcGVydHlzRWwuYXBwZW5kQ2hpbGQocHJvcGVydHlFbCk7Ci0JCX0KLQotCQlyZXR1cm4gUHJlZmVyZW5jZVV0aWwuc2VyaWFsaXplRG9jdW1lbnQoZG9jKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExhdW5jaFByb3BlcnRpZXMgZnJvbVhNTChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCURvY3VtZW50IGRvYyA9IFByZWZlcmVuY2VVdGlsLmdldERvY3VtZW50KGlucHV0U3RyZWFtKTsKLQotCQlMYXVuY2hQcm9wZXJ0aWVzIHBkZWYgPSBuZXcgTGF1bmNoUHJvcGVydGllcygpOwotCi0JCUVsZW1lbnQgcHJvcGVydHlzRWwgPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0KLQkJTm9kZUxpc3QgcHJvcGVydHlFbHMgPSBwcm9wZXJ0eXNFbC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiUHJvcGVydHkiKTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnR5RWxzLmdldExlbmd0aCgpOyBpKyspCi0JCXsKLQkJCUVsZW1lbnQgcHJvcGVydHlFbCA9IChFbGVtZW50KSBwcm9wZXJ0eUVscy5pdGVtKGkpOwotCQkJU3RyaW5nIG5hbWUgPSBwcm9wZXJ0eUVsLmdldEF0dHJpYnV0ZSgibmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgdmFsdWUgPSBwcm9wZXJ0eUVsLmdldEF0dHJpYnV0ZSgidmFsdWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJcGRlZi5zZXRQcm9wZXJ0eShuYW1lLCB2YWx1ZSk7Ci0JCX0KLQotCQlyZXR1cm4gcGRlZjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTI2MjdlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhTTFRSdW50aW1lXzEwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhTTFRSdW50aW1lXzU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWFNMVFJ1bnRpbWVfNjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYU0xUUnVudGltZV83OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhTTFRSdW50aW1lXzg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWFNMVFJ1bnRpbWVfOTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdHRyaWJ1dGVfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdHRyaWJ1dGVfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdHRyaWJ1dGVfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdHRyaWJ1dGVfNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQbHVnaW5Qcm9jZXNzb3JKYXJfMDsgCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc29yVHlwZV8yOyAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzb3JUeXBlXzM7IAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NvclR5cGVfNDsgCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc29yVHlwZV81OyAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVdGlsc18wOyAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVdGlsc18xOyAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYU0xUTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWFNMVExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZV8xOyAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYU0xUTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWFNMVExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZV8yMzsgCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWFNMVExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZV8zOyAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYU0xUTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlXzMxOyAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYU0xUTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlXzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWFNMVExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZV81OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhTTFRMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGVfNjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYU0xUTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlXzc7IAotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0UmVnaXN0cnlSZWFkZXJfMzsgCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3RSZWdpc3RyeVJlYWRlcl81OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0UmVnaXN0cnlSZWFkZXJfNjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdFJlZ2lzdHJ5UmVhZGVyXzc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3RSZWdpc3RyeVJlYWRlcl84OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0UmVnaXN0cnlSZWFkZXJfOTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBMYXVuY2hIZWxwZXJfMDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBMYXVuY2hIZWxwZXJfMTsKLQkKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBYU0xEZWJ1Z1RhcmdldF8wOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFhTTERlYnVnVGFyZ2V0XzE7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgWFNMRGVidWdUYXJnZXRfMTk7IAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFhTTERlYnVnVGFyZ2V0XzI7IAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFhTTERlYnVnVGFyZ2V0XzIwOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFhTTERlYnVnVGFyZ2V0XzM7IAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFhTTERlYnVnVGFyZ2V0XzQ7Ci0gICAgCi0JcHJpdmF0ZSBNZXNzYWdlcygpIHsKLQl9Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvUHJvY2Vzc29ySW5zdGFsbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL1Byb2Nlc3Nvckluc3RhbGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVlODcxNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvUHJvY2Vzc29ySW5zdGFsbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmc7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuaW50ZXJuYWwuSkFYUExhdW5jaGluZ1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLmludGVybmFsLlBsdWdpblByb2Nlc3NvckphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLmludGVybmFsLlV0aWxzOwotCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc29ySW5zdGFsbCBpbXBsZW1lbnRzIElQcm9jZXNzb3JJbnN0YWxsCi17Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaWQ7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQlwcml2YXRlIFN0cmluZyB0eXBlOwotCXByaXZhdGUgSVByb2Nlc3NvckphcltdIGphcnM7Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIGNvbnRyaWJ1dGVkOwotCXByaXZhdGUgU3RyaW5nIGRlYnVnZ2VySWQ7Ci0JcHJpdmF0ZSBTdHJpbmcgc3VwcG9ydHM7Ci0KLQlwdWJsaWMgUHJvY2Vzc29ySW5zdGFsbChTdHJpbmcgaWQsIFN0cmluZyBsYWJlbCwgU3RyaW5nIHR5cGVJZCwgSVByb2Nlc3NvckphcltdIGphcnMsIFN0cmluZyBkZWJ1Z2dlcklkLCBTdHJpbmcgc3VwcG9ydHMsIGJvb2xlYW4gY29udHJpYnV0ZWQpCi0JewotCQl0aGlzLmlkID0gaWQ7Ci0JCW5hbWUgPSBsYWJlbDsKLQkJdHlwZSA9IHR5cGVJZDsKLQkJdGhpcy5kZWJ1Z2dlcklkID0gZGVidWdnZXJJZDsKLQkJdGhpcy5jb250cmlidXRlZCA9IGNvbnRyaWJ1dGVkOwotCQl0aGlzLmphcnMgPSBqYXJzOwotCQl0aGlzLnN1cHBvcnRzID0gc3VwcG9ydHM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJZCgpCi0JewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpCi0JewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQotCXB1YmxpYyBJUHJvY2Vzc29ySmFyW10gZ2V0UHJvY2Vzc29ySmFycygpCi0JewotCQlyZXR1cm4gamFyczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9jZXNzb3JKYXJzKElQcm9jZXNzb3JKYXJbXSBqYXJzKQotCXsKLQkJdGhpcy5qYXJzID0gamFyczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFByb2Nlc3NvclR5cGVJZCgpCi0JewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgSVByb2Nlc3NvclR5cGUgZ2V0UHJvY2Vzc29yVHlwZSgpCi0JewotCQlyZXR1cm4gSkFYUFJ1bnRpbWUuZ2V0UHJvY2Vzc29yVHlwZSh0eXBlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9jZXNzb3JUeXBlSWQoU3RyaW5nIGlkKQotCXsKLQkJdHlwZSA9IGlkOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ29udHJpYnV0ZWQoKQotCXsKLQkJcmV0dXJuIGNvbnRyaWJ1dGVkOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVByb2Nlc3NvckphcltdIGNyZWF0ZUphcnMoU3RyaW5nIGJ1bmRsZUlkLCBTdHJpbmcgY2xhc3NwYXRoKQotCXsKLQkJSVByb2Nlc3NvckphcltdIGphcnM7Ci0JCWlmIChjbGFzc3BhdGggPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgSVByb2Nlc3NvckphclswXTsKLQkJU3RyaW5nW10gamFyc3RyaW5nID0gY2xhc3NwYXRoLnNwbGl0KCI7Iik7IC8vJE5PTi1OTFMtMSQKLQkJamFycyA9IG5ldyBJUHJvY2Vzc29ySmFyW2phcnN0cmluZy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGphcnN0cmluZy5sZW5ndGg7IGkrKykKLQkJewotCQkJU3RyaW5nIGphciA9IGphcnN0cmluZ1tpXTsKLQkJCXRyeQotCQkJewotCQkJCWlmIChqYXIuc3RhcnRzV2l0aCgiJHtlY2xpcHNlX29yYml0OiIpICYmIGphci5lbmRzV2l0aCgifSIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl7Ci0JCQkJCWphciA9IGphci5zdWJzdHJpbmcoIiR7ZWNsaXBzZV9vcmJpdDoiLmxlbmd0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlqYXIgPSBqYXIuc3Vic3RyaW5nKDAsamFyLmxlbmd0aCgpLTEpOwotCQkJCQkvL2phciA9IFV0aWxzLmdldEZpbGVMb2NhdGlvbihqYXIsIiIpOwotCQkJCQlqYXJzW2ldID0gbmV3IFBsdWdpblByb2Nlc3NvckphcihqYXIsIG51bGwpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlqYXIgPSBVdGlscy5nZXRGaWxlTG9jYXRpb24oYnVuZGxlSWQsamFyKTsKLQkJCQkJamFyc1tpXSA9IG5ldyBQbHVnaW5Qcm9jZXNzb3JKYXIoYnVuZGxlSWQsIG5ldyBQYXRoKGphcikpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JCQl7Ci0JCQkJSkFYUExhdW5jaGluZ1BsdWdpbi5sb2coZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGphcnM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzRGVidWdnZXIoKQotCXsKLQkJcmV0dXJuIGRlYnVnZ2VySWQgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgeHNsdFZlcnNpb24pCi0JewotCQlyZXR1cm4gc3VwcG9ydHMuaW5kZXhPZih4c2x0VmVyc2lvbikgPj0gMDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFN1cHBvcnRzKCkKLQl7Ci0JCXJldHVybiBzdXBwb3J0czsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdXBwb3J0cyhTdHJpbmcgc3VwcG9ydHMpCi0JewotCQl0aGlzLnN1cHBvcnRzID0gc3VwcG9ydHM7Ci0JfQotCi0JcHVibGljIElEZWJ1Z2dlciBnZXREZWJ1Z2dlcigpCi0JewotCQlyZXR1cm4gSkFYUFJ1bnRpbWUuZ2V0RGVidWdnZXIoZGVidWdnZXJJZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVidWdnZXJJZChTdHJpbmcgZGVidWdnZXJJZCkKLQl7Ci0JCXRoaXMuZGVidWdnZXJJZCA9IGRlYnVnZ2VySWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL2ludGVybmFsL0F0dHJpYnV0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL2ludGVybmFsL0F0dHJpYnV0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTFjOGFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9BdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLklBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5NZXNzYWdlczsKLQotcHVibGljIGNsYXNzIEF0dHJpYnV0ZSBpbXBsZW1lbnRzIElBdHRyaWJ1dGUsIENvbXBhcmFibGU8T2JqZWN0PgotewotCXByaXZhdGUgZmluYWwgU3RyaW5nIHVyaTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbjsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyB0eXBlOwotCi0JcHVibGljIEF0dHJpYnV0ZShTdHJpbmcgdXJpLCBTdHJpbmcgdHlwZSwgU3RyaW5nIGRlc2NyaXB0aW9uKQotCXsKLQkJdGhpcy51cmkgPSB1cmk7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkKLQl7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKQotCXsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRVUkkoKQotCXsKLQkJcmV0dXJuIHVyaTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZVZhbHVlKFN0cmluZyB2YWx1ZSkKLQl7Ci0JCUlTdGF0dXMgc3RhdHVzID0gbnVsbDsKLQkJaWYgKFRZUEVfQk9PTEVBTi5lcXVhbHModHlwZSkpCi0JCXsKLQkJCWJvb2xlYW4gdmFsaWQgPSAidHJ1ZSIuZXF1YWxzKHZhbHVlKSB8fCAiZmFsc2UiLmVxdWFscyh2YWx1ZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJaWYgKCF2YWxpZCkKLQkJCQlzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpBWFBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5BdHRyaWJ1dGVfMiwgbnVsbCk7IAotCQl9Ci0JCWVsc2UgaWYgKFRZUEVfSU5ULmVxdWFscyh0eXBlKSkKLQkJewotCQkJdHJ5Ci0JCQl7Ci0JCQkJSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7Ci0JCQl9Ci0JCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpCi0JCQl7Ci0JCQkJc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKQVhQTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuQXR0cmlidXRlXzEsIG51bGwpOyAKLQkJCX0KLQkJfQotCQllbHNlIGlmIChUWVBFX0RPVUJMRS5lcXVhbHModHlwZSkpCi0JCXsKLQkJCXRyeQotCQkJewotCQkJCURvdWJsZS5wYXJzZURvdWJsZSh2YWx1ZSk7Ci0JCQl9Ci0JCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpCi0JCQl7Ci0JCQkJc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKQVhQTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuQXR0cmlidXRlXzAsIG51bGwpOyAKLQkJCX0KLQkJfQotCQllbHNlIGlmIChUWVBFX0ZMT0FULmVxdWFscyh0eXBlKSkKLQkJewotCQkJdHJ5Ci0JCQl7Ci0JCQkJRmxvYXQucGFyc2VGbG9hdCh2YWx1ZSk7Ci0JCQl9Ci0JCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpCi0JCQl7Ci0JCQkJc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKQVhQTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuQXR0cmlidXRlXzUsIG51bGwpOyAKLQkJCX0KLQkJfQotCQllbHNlIGlmIChUWVBFX0NMQVNTLmVxdWFscyh0eXBlKSB8fCBUWVBFX09CSkVDVC5lcXVhbHModHlwZSkpCi0JCXsKLQkJCS8vc3RhdHVzID0gSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlSmF2YVR5cGVOYW1lKHZhbHVlKTsKLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCXB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBvKQotCXsKLQkJaWYgKG8gaW5zdGFuY2VvZiBJQXR0cmlidXRlKQotCQl7Ci0JCQlJQXR0cmlidXRlIGYgPSAoSUF0dHJpYnV0ZSkgbzsKLQkJCXJldHVybiBmLmdldFVSSSgpLmNvbXBhcmVUbyhnZXRVUkkoKSk7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL2ludGVybmFsL0RlYnVnZ2VyRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL2ludGVybmFsL0RlYnVnZ2VyRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjFkYzcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9EZWJ1Z2dlckRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLklEZWJ1Z2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLklQcm9jZXNzb3JUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuSkFYUFJ1bnRpbWU7Ci0KLXB1YmxpYyBjbGFzcyBEZWJ1Z2dlckRlc2NyaXB0b3IgaW1wbGVtZW50cyBJRGVidWdnZXIKLXsKLQlwcml2YXRlIGZpbmFsIFN0cmluZ1tdIGNsYXNzcGF0aDsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBpZDsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBidW5kbGVJZDsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIHByb2Nlc3NvclR5cGVJZDsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBjbGFzc05hbWU7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdHJhbnNmb3JtZXJGYWN0b3J5OwotCi0JcHVibGljIERlYnVnZ2VyRGVzY3JpcHRvcihTdHJpbmcgaWQsIFN0cmluZyBidW5kbGVJZCwgU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nW10gY2xhc3NwYXRoLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHByb2Nlc3NvclR5cGVJZCwgU3RyaW5nIHRyYW5zZm9ybWVyRmFjdG9yeSkKLQl7Ci0JCXRoaXMuaWQgPSBpZDsKLQkJdGhpcy5jbGFzc3BhdGggPSBjbGFzc3BhdGg7Ci0JCXRoaXMuYnVuZGxlSWQgPSBidW5kbGVJZDsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5wcm9jZXNzb3JUeXBlSWQgPSBwcm9jZXNzb3JUeXBlSWQ7Ci0JCXRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwotCQl0aGlzLnRyYW5zZm9ybWVyRmFjdG9yeSA9IHRyYW5zZm9ybWVyRmFjdG9yeTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpCi0JewotCQlyZXR1cm4gY2xhc3NOYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRDbGFzc1BhdGgoKQotCXsKLQkJcmV0dXJuIFByb2Nlc3Nvckludm9rZXJEZXNjcmlwdG9yLmNyZWF0ZUVudHJpZXMoYnVuZGxlSWQsIGNsYXNzcGF0aCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJZCgpCi0JewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCXB1YmxpYyBJUHJvY2Vzc29yVHlwZSBnZXRQcm9jZXNzb3JUeXBlKCkKLQl7Ci0JCXJldHVybiBKQVhQUnVudGltZS5nZXRQcm9jZXNzb3JUeXBlKHByb2Nlc3NvclR5cGVJZCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUcmFuc2Zvcm1lckZhY3RvcnkoKQotCXsKLQkJcmV0dXJuIHRyYW5zZm9ybWVyRmFjdG9yeTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvaW50ZXJuYWwvRmVhdHVyZVByZWZlcmVuY2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvaW50ZXJuYWwvRmVhdHVyZVByZWZlcmVuY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyZGM1ZjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL2ludGVybmFsL0ZlYXR1cmVQcmVmZXJlbmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmNvbmZpZy5QcmVmZXJlbmNlVXRpbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgRmVhdHVyZVByZWZlcmVuY2VzCi17Ci0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBTdHJpbmc+PiB0eXBlRmVhdHVyZXM7Ci0KLQlwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRGZWF0dXJlc1ZhbHVlcyhTdHJpbmcgdHlwZUlkKQotCXsKLQkJcmV0dXJuIHR5cGVGZWF0dXJlcy5nZXQodHlwZUlkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUeXBlRmVhdHVyZXMoTWFwPFN0cmluZywgTWFwPFN0cmluZywgU3RyaW5nPj4gdHlwZUZlYXR1cmVzKQotCXsKLQkJdGhpcy50eXBlRmVhdHVyZXMgPSB0eXBlRmVhdHVyZXM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBc1hNTCgpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgVHJhbnNmb3JtZXJFeGNlcHRpb24KLQl7Ci0JCURvY3VtZW50IGRvYyA9IFByZWZlcmVuY2VVdGlsLmdldERvY3VtZW50KCk7Ci0JCUVsZW1lbnQgY29uZmlnID0gZG9jLmNyZWF0ZUVsZW1lbnQoImZlYXR1cmVQcmVmZXJlbmNlcyIpOyAgLy8kTk9OLU5MUy0xJAotCQlkb2MuYXBwZW5kQ2hpbGQoY29uZmlnKTsKLQkJCi0JCWZvciAoU3RyaW5nIHR5cGVJZCA6IHR5cGVGZWF0dXJlcy5rZXlTZXQoKSkKLQkJewotCQkJRWxlbWVudCBwcm9jZXNzb3JUeXBlRWxlbWVudCA9IHR5cGVBc0VsZW1lbnQoZG9jLCB0eXBlSWQpOwotCQkJTWFwPFN0cmluZywgU3RyaW5nPiBmZWF0dXJlVmFsdWVzID0gdHlwZUZlYXR1cmVzLmdldCh0eXBlSWQpOwotCQkJZmVhdHVyZVZhbHVlc0FzRWxlbWVudChkb2MsIHByb2Nlc3NvclR5cGVFbGVtZW50LCBmZWF0dXJlVmFsdWVzKTsKLQkJCWNvbmZpZy5hcHBlbmRDaGlsZChwcm9jZXNzb3JUeXBlRWxlbWVudCk7Ci0JCX0KLQotCQkvLyBTZXJpYWxpemUgdGhlIERvY3VtZW50IGFuZCByZXR1cm4gdGhlIHJlc3VsdGluZyBTdHJpbmcKLQkJcmV0dXJuIFByZWZlcmVuY2VVdGlsLnNlcmlhbGl6ZURvY3VtZW50KGRvYyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBGZWF0dXJlUHJlZmVyZW5jZXMgZnJvbVhNTChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCUZlYXR1cmVQcmVmZXJlbmNlcyBwcmVmcyA9IG5ldyBGZWF0dXJlUHJlZmVyZW5jZXMoKTsKLQotCQkvLyBEbyB0aGUgcGFyc2luZyBhbmQgb2J0YWluIHRoZSB0b3AtbGV2ZWwgbm9kZQotCQlEb2N1bWVudCBkb2MgPSBQcmVmZXJlbmNlVXRpbC5nZXREb2N1bWVudChpbnB1dFN0cmVhbSk7Ci0JCUVsZW1lbnQgY29uZmlnID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOwotCi0JCU1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFN0cmluZz4+IHR5cGVGZWF0dXJlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWFwPFN0cmluZywgU3RyaW5nPj4oKTsKLQkJRWxlbWVudFtdIHByb2Nlc3NvclR5cGVFbHMgPSBQcmVmZXJlbmNlVXRpbC5nZXRDaGlsZEVsZW1lbnRzKGNvbmZpZywgInByb2Nlc3NvclR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2Nlc3NvclR5cGVFbHMubGVuZ3RoOyArK2kpCi0JCXsKLQkJCUVsZW1lbnQgcHJvY2Vzc29yVHlwZUVsID0gcHJvY2Vzc29yVHlwZUVsc1tpXTsKLQkJCVN0cmluZyB0eXBlID0gZWxlbWVudEFzVHlwZShwcm9jZXNzb3JUeXBlRWwpOwotCQkJTWFwPFN0cmluZywgU3RyaW5nPiBmZWF0dXJlVmFsdWVzID0gZWxlbWVudEFzRmVhdHVyZVZhbHVlcyhwcm9jZXNzb3JUeXBlRWwpOwotCQkJdHlwZUZlYXR1cmVzLnB1dCh0eXBlLCBmZWF0dXJlVmFsdWVzKTsKLQkJfQotCi0JCXByZWZzLnNldFR5cGVGZWF0dXJlcyh0eXBlRmVhdHVyZXMpOwotCi0JCXJldHVybiBwcmVmczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZWxlbWVudEFzVHlwZShFbGVtZW50IHBhcmVudCkKLQl7Ci0JCVN0cmluZyBpZCA9IHBhcmVudC5nZXRBdHRyaWJ1dGUoImlkIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGlkOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEVsZW1lbnQgdHlwZUFzRWxlbWVudChEb2N1bWVudCBkb2MsIFN0cmluZyB0eXBlKQotCXsKLQkJRWxlbWVudCBlbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoInByb2Nlc3NvclR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQllbGVtZW50LnNldEF0dHJpYnV0ZSgiaWQiLCB0eXBlKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGVsZW1lbnRBc0ZlYXR1cmVWYWx1ZXMoRWxlbWVudCBlbGVtZW50KQotCXsKLQkJRWxlbWVudFtdIGZlYXR1cmVFbHMgPSBQcmVmZXJlbmNlVXRpbC5nZXRDaGlsZEVsZW1lbnRzKGVsZW1lbnQsICJmZWF0dXJlIik7IC8vJE5PTi1OTFMtMSQKLQkJTWFwPFN0cmluZywgU3RyaW5nPiBmZWF0dXJlVmFsdWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KGZlYXR1cmVFbHMubGVuZ3RoKTsKLQkJZm9yIChFbGVtZW50IGZlYXR1cmVFbCA6IGZlYXR1cmVFbHMpCi0JCXsKLQkJCVN0cmluZyB1cmkgPSBmZWF0dXJlRWwuZ2V0QXR0cmlidXRlKCJ1cmkiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHZhbHVlID0gZmVhdHVyZUVsLmdldEF0dHJpYnV0ZSgidmFsdWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJZmVhdHVyZVZhbHVlcy5wdXQodXJpLCB2YWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIGZlYXR1cmVWYWx1ZXM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBmZWF0dXJlVmFsdWVzQXNFbGVtZW50KERvY3VtZW50IGRvYywgRWxlbWVudCBmZWF0dXJlc0VsLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGZlYXR1cmVWYWx1ZXMpCi0JewotCQlpZiAoZmVhdHVyZVZhbHVlcyAhPSBudWxsKQotCQl7Ci0JCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsU3RyaW5nPiBlbnRyeTIgOiBmZWF0dXJlVmFsdWVzLmVudHJ5U2V0KCkpCi0JCQl7Ci0JCQkJU3RyaW5nIHVyaSA9IGVudHJ5Mi5nZXRLZXkoKTsKLQkJCQlTdHJpbmcgdmFsdWUgPSBlbnRyeTIuZ2V0VmFsdWUoKTsKLQkJCQlFbGVtZW50IGVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgiZmVhdHVyZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoInVyaSIsIHVyaSk7IC8vJE5PTi1OTFMtMSQKLQkJCQllbGVtZW50LnNldEF0dHJpYnV0ZSgidmFsdWUiLCB2YWx1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlmZWF0dXJlc0VsLmFwcGVuZENoaWxkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL2ludGVybmFsL0pBWFBKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvaW50ZXJuYWwvSkFYUEphdmFMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY1NWYyNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvaW50ZXJuYWwvSkFYUEphdmFMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JQnJlYWtwb2ludE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JRGVidWdFdmVudFNldExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JQnJlYWtwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklEZWJ1Z1RhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN0YWNrRnJhbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1SdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhTGF1bmNoRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5JRGVidWdnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5JUHJvY2Vzc29ySW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLklQcm9jZXNzb3JJbnZva2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuSVByb2Nlc3NvckphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLklUcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5KQVhQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLkpBWFBSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5tb2RlbC5KQVhQRGVidWdUYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcubW9kZWwuSVhTTENvbnN0YW50czsKLQotcHVibGljIGNsYXNzIEpBWFBKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlIGV4dGVuZHMgSmF2YUxhdW5jaERlbGVnYXRlIGltcGxlbWVudHMgSURlYnVnRXZlbnRTZXRMaXN0ZW5lcgotewotCXByaXZhdGUgU3RyaW5nIG1vZGU7Ci0JTGF1bmNoSGVscGVyIGxhdW5jaEhlbHBlcjsKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgbGF1bmNoKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sIGZpbmFsIFN0cmluZyBtb2RlLCBmaW5hbCBJTGF1bmNoIGxhdW5jaCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJdGhpcy5tb2RlID0gbW9kZTsKLQkJbGF1bmNoSGVscGVyLnNhdmUoZ2V0TGF1bmNoQ29uZmlnRmlsZSgpKTsKLQkJCi0JCS8vIHNldCB0aGUgbGF1bmNoIG5hbWUKLQkJSVByb2Nlc3Nvckluc3RhbGwgaW5zdGFsbCA9IGdldFByb2Nlc3Nvckluc3RhbGwoY29uZmlndXJhdGlvbiwgbW9kZSk7Ci0JCVN0cmluZyB0ZmFjdG9yeSA9IGdldFRyYW5zZm9ybWVyRmFjdG9yeShpbnN0YWxsKTsKLQkJU3RyaW5nIG5hbWUgPSBpbnN0YWxsLmdldE5hbWUoKTsKLQkJaWYgKHRmYWN0b3J5ICE9IG51bGwpCi0JCQluYW1lICs9ICJbIiArIHRmYWN0b3J5ICsgIl0iOwotCQlsYXVuY2guc2V0QXR0cmlidXRlKCJsYXVuY2hOYW1lIiwgbmFtZSk7Ci0KLQkJLy8gdGhlIHN1cGVyLmxhdW5jaCB3aWxsIGFkZCBhIEphdmEgc291cmNlIGRpcmVjdG9yIGlmIHdlIHNldCBpdCB0byBudWxsIGhlcmUKLQkJZmluYWwgSVNvdXJjZUxvY2F0b3IgY29uZmlndXJlZExvY2F0b3IgPSBsYXVuY2guZ2V0U291cmNlTG9jYXRvcigpOwotCQlsYXVuY2guc2V0U291cmNlTG9jYXRvcihudWxsKTsKLQotCQlzdXBlci5sYXVuY2goY29uZmlndXJhdGlvbiwgbW9kZSwgbGF1bmNoLCBtb25pdG9yKTsKLQkJCi0JCS8vIG5vdyBnZXQgdGhlIGphdmEgc291cmNlIGxvY2F0b3IKLQkJZmluYWwgSVNvdXJjZUxvY2F0b3IgamF2YVNvdXJjZUxvb2t1cERpcmVjdG9yID0gbGF1bmNoLmdldFNvdXJjZUxvY2F0b3IoKTsKLQkJLy8gbm93IGFkZCBvdXIgb3duIHBhcnRpY2lwYW50IHRvIHRoZSBqYXZhIGRpcmVjdG9yCi0JCWxhdW5jaC5zZXRTb3VyY2VMb2NhdG9yKG5ldyBJU291cmNlTG9jYXRvcigpewotCi0JCQlwdWJsaWMgT2JqZWN0IGdldFNvdXJjZUVsZW1lbnQoSVN0YWNrRnJhbWUgc3RhY2tGcmFtZSkgCi0JCQl7Ci0JCQkJLy8gc2ltcGx5IGxvb2sgYXQgb25lIGFuZCB0aGVuIHRoZSBvdGhlcgotCQkJCU9iamVjdCBzb3VyY2VFbGVtZW50ID0gamF2YVNvdXJjZUxvb2t1cERpcmVjdG9yLmdldFNvdXJjZUVsZW1lbnQoc3RhY2tGcmFtZSk7Ci0JCQkJaWYgKHNvdXJjZUVsZW1lbnQgPT0gbnVsbCkKLQkJCQkJc291cmNlRWxlbWVudCA9IGNvbmZpZ3VyZWRMb2NhdG9yLmdldFNvdXJjZUVsZW1lbnQoc3RhY2tGcmFtZSk7Ci0JCQkJcmV0dXJuIHNvdXJjZUVsZW1lbnQ7Ci0JCQl9fSk7Ci0JCQotLy8JCUlKYXZhRGVidWdUYXJnZXQgamF2YVRhcmdldCA9IChJSmF2YURlYnVnVGFyZ2V0KWxhdW5jaC5nZXREZWJ1Z1RhcmdldCgpOwotLy8JCWxhdW5jaC5yZW1vdmVEZWJ1Z1RhcmdldChqYXZhVGFyZ2V0KTsKLQkJCi0JCUlEZWJ1Z1RhcmdldCBqYXZhVGFyZ2V0ID0gbGF1bmNoLmdldERlYnVnVGFyZ2V0KCk7Ci0JCUlEZWJ1Z1RhcmdldCB4c2xUYXJnZXQgPSBuZXcgSkFYUERlYnVnVGFyZ2V0KGxhdW5jaCwgbGF1bmNoLmdldFByb2Nlc3NlcygpWzBdLCBsYXVuY2hIZWxwZXIpOwotCQkKLQkJLy8gcmVtb3ZlIGphdmEgYXMgdGhlIHByaW1hcnkgdGFyZ2V0IGFuZCBtYWtlIHhzbCB0aGUgcHJpbWFyeSB0YXJnZXQKLQkJbGF1bmNoLnJlbW92ZURlYnVnVGFyZ2V0KGphdmFUYXJnZXQpOwotCQlsYXVuY2guYWRkRGVidWdUYXJnZXQoeHNsVGFyZ2V0KTsKLQkJLy8gYWRkIHRoaXMgaGVyZSB0byBtYWtlIGphdmEgdGhlIG5vbi1wcmltYXJ5IHRhcmdldAotCS8vCWxhdW5jaC5hZGREZWJ1Z1RhcmdldChqYXZhVGFyZ2V0KTsKLQkJCi0JLy8JbGF1bmNoLmFkZERlYnVnVGFyZ2V0KG5ldyBKYXZhWFNMRGVidWdUYXJnZXQobGF1bmNoLCBsYXVuY2guZ2V0UHJvY2Vzc2VzKClbMF0sIGxhdW5jaEhlbHBlciwgamF2YVRhcmdldCkpOwotCQkKLQotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgSmF2YSBicmVha3BvaW50IGFuZCB0aGUgWFNMIGJyZWFrcG9pbnRzCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElCcmVha3BvaW50W10gZ2V0QnJlYWtwb2ludHMoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikKLQl7Ci0JCUlCcmVha3BvaW50TWFuYWdlciBicmVha3BvaW50TWFuYWdlciA9IERlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCcmVha3BvaW50TWFuYWdlcigpOwotCQlpZiAoIWJyZWFrcG9pbnRNYW5hZ2VyLmlzRW5hYmxlZCgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlJQnJlYWtwb2ludFtdIGphdmFCcmVha3BvaW50cyA9IHN1cGVyLmdldEJyZWFrcG9pbnRzKGNvbmZpZ3VyYXRpb24pOwotCQlJQnJlYWtwb2ludFtdIHhzbEJyZWFrcG9pbnRzID0gYnJlYWtwb2ludE1hbmFnZXIuZ2V0QnJlYWtwb2ludHMoSVhTTENvbnN0YW50cy5JRF9YU0xfREVCVUdfTU9ERUwpOwotCQlJQnJlYWtwb2ludFtdIGJyZWFrcG9pbnRzID0gbmV3IElCcmVha3BvaW50W2phdmFCcmVha3BvaW50cy5sZW5ndGgreHNsQnJlYWtwb2ludHMubGVuZ3RoXTsKLQkJU3lzdGVtLmFycmF5Y29weShqYXZhQnJlYWtwb2ludHMsIDAsIGJyZWFrcG9pbnRzLCAwLCBqYXZhQnJlYWtwb2ludHMubGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weSh4c2xCcmVha3BvaW50cywgMCwgYnJlYWtwb2ludHMsIGphdmFCcmVha3BvaW50cy5sZW5ndGgsIHhzbEJyZWFrcG9pbnRzLmxlbmd0aCk7Ci0JCQotCQlyZXR1cm4gYnJlYWtwb2ludHM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcHJlTGF1bmNoQ2hlY2soSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgU3RyaW5nIG1vZGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCXRoaXMubGF1bmNoSGVscGVyID0gbmV3IExhdW5jaEhlbHBlcihjb25maWd1cmF0aW9uKTsKLQkJaWYgKG1vZGUuZXF1YWxzKElMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUpKQotCQl7Ci0JCQkvLyBUT0RPIGRvbid0IGxpa2UgaGF2aW5nIFVJIGNvZGUgaW4gdGhlIGxhdW5jaGluZyBwbHVnaW4uLi53aGVyZSBlbHNlIGNhbiBpdCBnbz8KLQkJCWZpbmFsIElQcm9jZXNzb3JJbnN0YWxsIGluc3RhbGwgPSBnZXRQcm9jZXNzb3JJbnN0YWxsKGNvbmZpZ3VyYXRpb24sIElMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFKTsKLQkJCWlmIChpbnN0YWxsLmdldERlYnVnZ2VyKCkgPT0gbnVsbCkKLQkJCXsKLQkJCQlmaW5hbCBib29sZWFuW10gcmVzdWx0ID0gbmV3IGJvb2xlYW5bXQotCQkJCXsgZmFsc2UgfTsKLQkJCQkvLyBvcGVuIGEgZGlhbG9nIGZvciBjaG9vc2luZyBhIGRpZmZlcmVudCBpbnN0YWxsIHRoYXQgZG9lcyBoYXZlCi0JCQkJLy8gYW4gYXNzb2NpYXRlZCBkZWJ1Z2dlcgotCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpCi0JCQkJewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKQotCQkJCQl7Ci0JCQkJCQlTdHJpbmcgZGVidWdnaW5nSW5zdGFsbElkID0gSkFYUExhdW5jaGluZ1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoSkFYUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9ERUZBVUxUX0RFQlVHR0lOR19JTlNUQUxMX0lEKTsKLQkJCQkJCUlQcm9jZXNzb3JJbnN0YWxsIHByb2Nlc3NvciA9IEpBWFBSdW50aW1lLmdldFByb2Nlc3NvcihkZWJ1Z2dpbmdJbnN0YWxsSWQpOwotCi0JCQkJCQlJV29ya2JlbmNoV2luZG93IGR3ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCQkJCQotCQkJCQkJU3RyaW5nIHRpdGxlID0gTWVzc2FnZXMuWFNMVExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZV8wOyAKLQkJCQkJCVN0cmluZyBtZXNzYWdlID0gTWVzc2FnZXMuWFNMVExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZV8xICsgaW5zdGFsbC5nZXROYW1lKCkgKyBNZXNzYWdlcy5YU0xUTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlXzIKLQkJCQkJCQkJKyBNZXNzYWdlcy5YU0xUTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlXzMgKyBwcm9jZXNzb3IuZ2V0TmFtZSgpICsgTWVzc2FnZXMuWFNMVExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZV80OwotCQkJCQkJCi0JCQkJCQlNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBNZXNzYWdlRGlhbG9nKGR3LmdldFNoZWxsKCksIHRpdGxlLCBudWxsLCBtZXNzYWdlLCBNZXNzYWdlRGlhbG9nLlFVRVNUSU9OLAotCQkJCQkJCQluZXcgU3RyaW5nW10geyBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCB9LCAwKTsgLy8geWVzIGlzIHRoZSBkZWZhdWx0Ci0JCQkJCQkKLQkJCQkgICAgICAgIHJlc3VsdFswXSA9IGRpYWxvZy5vcGVuKCkgPT0gMDsKLQkJCQkJfQotCQkJCX0pOwotCQkJCXJldHVybiByZXN1bHRbMF07Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJU3RyaW5nIGRlYnVnZ2VyVEYgPSBpbnN0YWxsLmdldERlYnVnZ2VyKCkuZ2V0VHJhbnNmb3JtZXJGYWN0b3J5KCk7Ci0JCQkJU3RyaW5nIGluc3RhbGxURiA9IGxhdW5jaEhlbHBlci5nZXRUcmFuc2Zvcm1lckZhY3RvcnkoKSA9PSBudWxsID8gbnVsbCA6IGxhdW5jaEhlbHBlci5nZXRUcmFuc2Zvcm1lckZhY3RvcnkoKS5nZXRGYWN0b3J5Q2xhc3MoKTsKLQkJCQlpZiAoIWRlYnVnZ2VyVEYuZXF1YWxzKGluc3RhbGxURikpCi0JCQkJewotCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKQotCQkJCQl7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKQotCQkJCQkJewotCQkJCQkJCUlXb3JrYmVuY2hXaW5kb3cgZHcgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQkJCQkJCQotCQkJCQkJCVN0cmluZyB0aXRsZSA9ICJDaGFuZ2UgVHJhbnNmb3JtZXIgRmFjdG9yeSI7Ci0JCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBpbnN0YWxsLmdldE5hbWUoKSArICIgbXVzdCB1c2UgdGhlICIgKyBsYXVuY2hIZWxwZXIuZ2V0VHJhbnNmb3JtZXJGYWN0b3J5KCkuZ2V0TmFtZSgpICsgIiB0cmFuc2Zvcm1lciBmYWN0b3J5IHdoZW4gZGVidWdnaW5nLlxuIgotCQkJCQkJCQkJKyAiQmUgYXdhcmUgdGhhdCB0aGlzIG1heSBnaXZlIGRpZmZlcmVudCByZXN1bHRzIHRvIHRoZSAiICsgbGF1bmNoSGVscGVyLmdldFRyYW5zZm9ybWVyRmFjdG9yeSgpLmdldE5hbWUoKSArICIgdHJhbnNmb3JtZXIgZmFjdG9yeSBjb25maWd1cmVkIGZvciB0aGlzIGxhdW5jaCBjb25maWd1cmF0aW9uLiI7Ci0JCQkJCQkJCi0JCQkJCQkJTWVzc2FnZURpYWxvZyBkaWFsb2cgPSBuZXcgTWVzc2FnZURpYWxvZyhkdy5nZXRTaGVsbCgpLCB0aXRsZSwgbnVsbCwgbWVzc2FnZSwgTWVzc2FnZURpYWxvZy5XQVJOSU5HLAotCQkJCQkJCQkJbmV3IFN0cmluZ1tdIHsgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwgfSwgMCk7IC8vIHllcyBpcyB0aGUgZGVmYXVsdAotCQkJCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIucHJlTGF1bmNoQ2hlY2soY29uZmlndXJhdGlvbiwgbW9kZSwgbW9uaXRvcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIElWTVJ1bm5lciBnZXRWTVJ1bm5lcihJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBTdHJpbmcgbW9kZSkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCS8vIGNvbW1lbnQgdGhpcyBvdXQgaW4gb3JkZXIgdG8gZ2V0IGphdmEgZGVidWdnaW5nIGFzIHdlbGwgYXMgWFNMIGRlYnVnZ2luZwotLy8JCWlmIChJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFLmVxdWFscyhtb2RlKSkKLS8vCQkJcmV0dXJuIHN1cGVyLmdldFZNUnVubmVyKGNvbmZpZ3VyYXRpb24sIElMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFKTsKLQkJcmV0dXJuIHN1cGVyLmdldFZNUnVubmVyKGNvbmZpZ3VyYXRpb24sIG1vZGUpOwotCX0KLQotCXByaXZhdGUgRmlsZSBnZXRMYXVuY2hDb25maWdGaWxlKCkKLQl7Ci0JCUlQYXRoIGxhdW5jaFBhdGggPSBQbGF0Zm9ybS5nZXRTdGF0ZUxvY2F0aW9uKEpBWFBMYXVuY2hpbmdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpKS5hcHBlbmQoImxhdW5jaCIpOyAvLyROT04tTkxTLTEkCi0JCUZpbGUgbGF1bmNoRGlyID0gbGF1bmNoUGF0aC50b0ZpbGUoKTsKLQkJaWYgKCFsYXVuY2hEaXIuZXhpc3RzKCkpCi0JCQlsYXVuY2hEaXIubWtkaXIoKTsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUobGF1bmNoRGlyLCAibGF1bmNoLnhtbCIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBmaWxlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJUGF0aCBnZXRXb3JraW5nRGlyZWN0b3J5UGF0aChJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJLy8gVE9ETyBjaGFuZ2VzIGFyZSBhZm9vdCBzbyB0aGF0IHdvcmtpbmcgZGlyZWN0b3J5IGNhbiBiZSBnb3R0ZW4gZnJvbSB0aGUgQ29tbW9uIGxhdW5jaCB0YWIKLQkJCi0vLwkJU3RyaW5nIHBhdGggPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShKQVhQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BST0NFU1NPUl9XT1JLSU5HX0RJUiwgKFN0cmluZykgbnVsbCk7Ci0vLwkJaWYgKHBhdGggIT0gbnVsbCkKLS8vCQl7Ci0vLwkJCXBhdGggPSBWYXJpYWJsZXNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0cmluZ1ZhcmlhYmxlTWFuYWdlcigpLnBlcmZvcm1TdHJpbmdTdWJzdGl0dXRpb24ocGF0aCk7Ci0vLwkJCXJldHVybiBuZXcgUGF0aChwYXRoKTsKLS8vCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgSVByb2Nlc3Nvckludm9rZXIgZ2V0UHJvY2Vzc29ySW52b2tlckRlc2NyaXB0b3IoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCVN0cmluZyBpbnZva2VySWQgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShKQVhQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5JTlZPS0VSX0RFU0NSSVBUT1IsICJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5qYXhwLmludm9rZSIpOwotCQlyZXR1cm4gSkFYUFJ1bnRpbWUuZ2V0UHJvY2Vzc29ySW52b2tlcihpbnZva2VySWQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVByb2Nlc3Nvckluc3RhbGwgZ2V0UHJvY2Vzc29ySW5zdGFsbChJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBTdHJpbmcgbW9kZSkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCUlQcm9jZXNzb3JJbnN0YWxsIGluc3RhbGwgPSBMYXVuY2hIZWxwZXIuZ2V0UHJvY2Vzc29ySW5zdGFsbChjb25maWd1cmF0aW9uKTsKLQkJaWYgKG1vZGUuZXF1YWxzKElMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUpICYmIGluc3RhbGwuZ2V0RGVidWdnZXIoKSA9PSBudWxsKQotCQl7Ci0JCQlTdHJpbmcgZGVidWdnaW5nSW5zdGFsbElkID0gSkFYUExhdW5jaGluZ1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoSkFYUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9ERUZBVUxUX0RFQlVHR0lOR19JTlNUQUxMX0lEKTsKLQkJCWluc3RhbGwgPSBKQVhQUnVudGltZS5nZXRQcm9jZXNzb3IoZGVidWdnaW5nSW5zdGFsbElkKTsKLQkJfQotCQlyZXR1cm4gaW5zdGFsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE1haW5UeXBlTmFtZShJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJaWYgKElMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUuZXF1YWxzKG1vZGUpKQotCQkJcmV0dXJuICJvcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcuZGVidWdnZXIuRGVidWdSdW5uZXIiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiAib3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLmludm9rZXIuaW50ZXJuYWwuTWFpbiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFByb2dyYW1Bcmd1bWVudHMoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCS8vIGNsYXNzbmFtZSwgc291cmNldXJsLCBvdXRwdXQgZmlsZQotCQlJUHJvY2Vzc29ySW52b2tlciBpbnZva2VyID0gZ2V0UHJvY2Vzc29ySW52b2tlckRlc2NyaXB0b3IoY29uZmlndXJhdGlvbik7Ci0JCVN0cmluZyBjbGF6eiA9IGludm9rZXIuZ2V0SW52b2tlckNsYXNzTmFtZSgpOwotCi0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJc2IuYXBwZW5kKGNsYXp6KTsKLQkJc2IuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJc2IuYXBwZW5kKCJcIiIgKyBnZXRMYXVuY2hDb25maWdGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXNiLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0JCXNiLmFwcGVuZCgiXCIiICsgbGF1bmNoSGVscGVyLmdldFNvdXJjZSgpICsgIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlzYi5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQlzYi5hcHBlbmQoIlwiIiArIGxhdW5jaEhlbHBlci5nZXRUYXJnZXQoKS5nZXRBYnNvbHV0ZVBhdGgoKSArICJcIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaWYgKElMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUuZXF1YWxzKG1vZGUpKQotCQl7Ci0JCQlJUHJvY2Vzc29ySW5zdGFsbCBpbnN0YWxsID0gZ2V0UHJvY2Vzc29ySW5zdGFsbChjb25maWd1cmF0aW9uLCBtb2RlKTsKLQkJCWlmIChpbnN0YWxsLmdldERlYnVnZ2VyKCkgIT0gbnVsbCkKLQkJCXsKLQkJCQlJRGVidWdnZXIgZGVidWdnZXIgPSBpbnN0YWxsLmdldERlYnVnZ2VyKCk7Ci0JCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGRlYnVnZ2VyLmdldENsYXNzTmFtZSgpOwotCQkJCXNiLmFwcGVuZCgiIC1kZWJ1ZyAiKS5hcHBlbmQoY2xhc3NOYW1lKS5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJc2IuYXBwZW5kKGxhdW5jaEhlbHBlci5nZXRSZXF1ZXN0UG9ydCgpKTsKLQkJCQlzYi5hcHBlbmQoIiAiKS5hcHBlbmQobGF1bmNoSGVscGVyLmdldEV2ZW50UG9ydCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCXNiLmFwcGVuZCgiICIpLmFwcGVuZChsYXVuY2hIZWxwZXIuZ2V0R2VuZXJhdGVQb3J0KCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nW10gZ2V0Q2xhc3NwYXRoKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQkvLyBnZXQgdGhlIGNsYXNzcGF0aCBkZWZpbmVkIGJ5IHRoZSB1c2VyCi0JCVN0cmluZ1tdIHVzZXJDbGFzc3BhdGggPSBzdXBlci5nZXRDbGFzc3BhdGgoY29uZmlndXJhdGlvbik7Ci0KLQkJLy8gZ2V0IHRoZSBjbGFzc3BhdGggcmVxdWlyZWQgZm9yIHRoZSB0cmFuc2Zvcm1hdGlvbgotCQlJUHJvY2Vzc29ySW52b2tlciBpbnZva2VyID0gZ2V0UHJvY2Vzc29ySW52b2tlckRlc2NyaXB0b3IoY29uZmlndXJhdGlvbik7Ci0JCUxpc3Q8U3RyaW5nPiBpbnZva2VyQ1AgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJZm9yIChTdHJpbmcgZW50cnkgOiBpbnZva2VyLmdldENsYXNzcGF0aEVudHJpZXMoKSkKLQkJewotCQkJaW52b2tlckNQLmFkZChlbnRyeSk7Ci0JCX0KLQotCQkvLyBhZGQgdGhlIGRlYnVnZ2VyLi4uCi0JCUlQcm9jZXNzb3JJbnN0YWxsIGluc3RhbGwgPSBnZXRQcm9jZXNzb3JJbnN0YWxsKGNvbmZpZ3VyYXRpb24sIG1vZGUpOwotCQlpZiAoSUxhdW5jaE1hbmFnZXIuREVCVUdfTU9ERS5lcXVhbHMobW9kZSkgJiYgaW5zdGFsbC5nZXREZWJ1Z2dlcigpICE9IG51bGwpCi0JCXsKLQkJCVN0cmluZ1tdIGphcnMgPSBpbnN0YWxsLmdldERlYnVnZ2VyKCkuZ2V0Q2xhc3NQYXRoKCk7Ci0JCQlmb3IgKFN0cmluZyBqYXIgOiBqYXJzKQotCQkJewotCQkJCWludm9rZXJDUC5hZGQoamFyKTsKLQkJCX0KLQkJfQotCi0JCVN0cmluZ1tdIGludm9rZXJDbGFzc3BhdGggPSBpbnZva2VyQ1AudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLQotCQkvLyBhZGQgdGhlbSB0b2dldGhlcgotCQlTdHJpbmdbXSBjbGFzc3BhdGggPSBuZXcgU3RyaW5nW3VzZXJDbGFzc3BhdGgubGVuZ3RoICsgaW52b2tlckNsYXNzcGF0aC5sZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGludm9rZXJDbGFzc3BhdGgsIDAsIGNsYXNzcGF0aCwgMCwgaW52b2tlckNsYXNzcGF0aC5sZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KHVzZXJDbGFzc3BhdGgsIDAsIGNsYXNzcGF0aCwgaW52b2tlckNsYXNzcGF0aC5sZW5ndGgsIHVzZXJDbGFzc3BhdGgubGVuZ3RoKTsKLQotCQlyZXR1cm4gY2xhc3NwYXRoOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0Vk1Bcmd1bWVudHMoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCVN0cmluZyB2bWFyZ3MgPSBzdXBlci5nZXRWTUFyZ3VtZW50cyhjb25maWd1cmF0aW9uKTsKLQotCQlJUHJvY2Vzc29ySW5zdGFsbCBpbnN0YWxsID0gZ2V0UHJvY2Vzc29ySW5zdGFsbChjb25maWd1cmF0aW9uLCBtb2RlKTsKLQkJaWYgKGluc3RhbGwgIT0gbnVsbCAmJiAhaW5zdGFsbC5nZXRQcm9jZXNzb3JUeXBlKCkuaXNKUkVEZWZhdWx0KCkpCi0JCXsKLQkJCS8vIGNsZWFyIHRoZSBlbmRvcnNlZCBkaXIKLQkJCUZpbGUgdGVtcERpciA9IGdldEVuZG9yc2VkRGlyKCk7Ci0JCQlpZiAodGVtcERpci5leGlzdHMoKSkKLQkJCXsKLQkJCQlGaWxlW10gY2hpbGRyZW4gPSB0ZW1wRGlyLmxpc3RGaWxlcygpOwotCQkJCWZvciAoRmlsZSBjaGlsZCA6IGNoaWxkcmVuKQotCQkJCXsKLQkJCQkJY2hpbGQuZGVsZXRlKCk7Ci0JCQkJfQotCQkJCXRlbXBEaXIuZGVsZXRlKCk7Ci0JCQl9Ci0JCQl0ZW1wRGlyLm1rZGlyKCk7Ci0KLQkJCS8vIG1vdmUgdGhlIHJlcXVpcmVkIGphcnMgdG8gdGhlIGVuZG9yc2VkIGRpcgotCQkJSVByb2Nlc3NvckphcltdIGphcnMgPSBpbnN0YWxsLmdldFByb2Nlc3NvckphcnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgamFycy5sZW5ndGg7IGkrKykKLQkJCXsKLQkJCQlVUkwgZW50cnkgPSBqYXJzW2ldLmFzVVJMKCk7Ci0JCQkJaWYgKGVudHJ5ID09IG51bGwpCi0JCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkFYUExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQsIElTdGF0dXMuRVJST1IsIE1lc3NhZ2VzLlhTTFRMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGVfMjMgKyBqYXJzW2ldLCBudWxsKSk7IAotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHRlbXBEaXIsICJFTkRfIiArIGkgKyAiLmphciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQltb3ZlRmlsZShlbnRyeSwgZmlsZSk7Ci0JCQl9Ci0JCQkvLyBhZGQgdGhlIGVuZG9yc2VkIGRpcgotCQkJdm1hcmdzICs9ICIgLURqYXZhLmVuZG9yc2VkLmRpcnM9XCIiICsgdGVtcERpci5nZXRBYnNvbHV0ZVBhdGgoKSArICJcIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCi0JCQlTdHJpbmcgdGZhY3RvcnkgPSBnZXRUcmFuc2Zvcm1lckZhY3RvcnkoaW5zdGFsbCk7Ci0JCQlpZiAodGZhY3RvcnkgIT0gbnVsbCkKLQkJCQl2bWFyZ3MgKz0gIiAtRGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5PSIgKyB0ZmFjdG9yeTsgLy8kTk9OLU5MUy0xJAotCQkJCi0vLwkJCWlmIChJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFLmVxdWFscyhtb2RlKSkKLS8vCQkJewotLy8JCQkJLy8gaW4gZGVidWcgbW9kZSwgc2V0IHRoZSBsb2dnaW5nIHRvIEVSUk9SLiBUaGlzIHByZXZlbnRzIHRoZSBjb25zb2xlIGZyb20gcG9wcGluZyB1cCBvbiB0b3Agb2YgdGhlIHJlc3VsdCB2aWV3IQotLy8JCQkJdHJ5Ci0vLwkJCQl7Ci0vLwkJCQkJVVJMIHVybCA9IEZpbGVMb2NhdG9yLnJlc29sdmUoRmlsZUxvY2F0b3IuZmluZChQbGF0Zm9ybS5nZXRCdW5kbGUoSkFYUExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQpLCBuZXcgUGF0aCgiL2xvZzRqLmRlYnVnLnByb3BlcnRpZXMiKSwgbnVsbCkpOwotLy8JCQkJCXZtYXJncyArPSAiIC1EbG9nNGouY29uZmlndXJhdGlvbj1cIiIrdXJsLnRvRXh0ZXJuYWxGb3JtKCkrIlwiIjsgLy8kTk9OLU5MUy0xJAotLy8JCQkJfQotLy8JCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0vLwkJCQl7Ci0vLwkJCQkJSkFYUExhdW5jaGluZ1BsdWdpbi5sb2coZSk7Ci0vLwkJCQl9Ci0vLwkJCX0KLQkJfQotCQlyZXR1cm4gdm1hcmdzOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRUcmFuc2Zvcm1lckZhY3RvcnkoSVByb2Nlc3Nvckluc3RhbGwgaW5zdGFsbCkKLQl7Ci0JCVN0cmluZyB0ZmFjdG9yeSA9IG51bGw7Ci0JCWlmIChJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFLmVxdWFscyhtb2RlKSkKLQkJCXRmYWN0b3J5ID0gaW5zdGFsbC5nZXREZWJ1Z2dlcigpLmdldFRyYW5zZm9ybWVyRmFjdG9yeSgpOwotCQllbHNlCi0JCXsKLQkJCUlUcmFuc2Zvcm1lckZhY3RvcnkgdCA9IGxhdW5jaEhlbHBlci5nZXRUcmFuc2Zvcm1lckZhY3RvcnkoKTsKLQkJCWlmICh0ICE9IG51bGwpCi0JCQkJdGZhY3RvcnkgPSB0LmdldEZhY3RvcnlDbGFzcygpOwotCQl9Ci0JCXJldHVybiB0ZmFjdG9yeTsKLQl9Ci0KLQlwcml2YXRlIEZpbGUgZ2V0RW5kb3JzZWREaXIoKQotCXsKLQkJSVBhdGggdGVtcExvY2F0aW9uID0gUGxhdGZvcm0uZ2V0U3RhdGVMb2NhdGlvbihKQVhQTGF1bmNoaW5nUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKSkuYXBwZW5kKCJlbmRvcnNlZCIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiB0ZW1wTG9jYXRpb24udG9GaWxlKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBtb3ZlRmlsZShVUkwgc3JjLCBGaWxlIHRhcmdldCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCUJ1ZmZlcmVkT3V0cHV0U3RyZWFtIGJvcyA9IG51bGw7Ci0JCUJ1ZmZlcmVkSW5wdXRTdHJlYW0gYmlzID0gbnVsbDsKLQkJdHJ5Ci0JCXsKLQkJCWJvcyA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSh0YXJnZXQpKTsKLQkJCWJpcyA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHNyYy5vcGVuU3RyZWFtKCkpOwotCQkJd2hpbGUgKGJpcy5hdmFpbGFibGUoKSA+IDApCi0JCQl7Ci0JCQkJaW50IHNpemUgPSBiaXMuYXZhaWxhYmxlKCk7Ci0JCQkJaWYgKHNpemUgPiAxMDI0KQotCQkJCQlzaXplID0gMTAyNDsKLQkJCQlieXRlW10gYiA9IG5ldyBieXRlW3NpemVdOwotCQkJCWJpcy5yZWFkKGIsIDAsIGIubGVuZ3RoKTsKLQkJCQlib3Mud3JpdGUoYik7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0JCXsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkFYUExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQsIElTdGF0dXMuRVJST1IsIE1lc3NhZ2VzLlhTTFRMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGVfNyArIHNyYyArIE1lc3NhZ2VzLlhTTFRMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGVfMzEgKyB0YXJnZXQsIGUpKTsgCi0JCX0KLQkJZmluYWxseQotCQl7Ci0JCQlpZiAoYmlzICE9IG51bGwpCi0JCQl7Ci0JCQkJdHJ5Ci0JCQkJewotCQkJCQliaXMuY2xvc2UoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0JCQkJewotCQkJCQlKQVhQTGF1bmNoaW5nUGx1Z2luLmxvZyhlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoYm9zICE9IG51bGwpCi0JCQl7Ci0JCQkJdHJ5Ci0JCQkJewotCQkJCQlib3MuY2xvc2UoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0JCQkJewotCQkJCQlKQVhQTGF1bmNoaW5nUGx1Z2luLmxvZyhlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvaW50ZXJuYWwvSkFYUExhdW5jaGluZ1BsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL2ludGVybmFsL0pBWFBMYXVuY2hpbmdQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVhYWMzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvaW50ZXJuYWwvSkFYUExhdW5jaGluZ1BsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICovCi1wdWJsaWMgY2xhc3MgSkFYUExhdW5jaGluZ1BsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nIjsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBKQVhQTGF1bmNoaW5nUGx1Z2luIHBsdWdpbjsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgSkFYUExhdW5jaGluZ1BsdWdpbigpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpBWFBMYXVuY2hpbmdQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKEV4Y2VwdGlvbiBlKQotCXsKLQkJZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgMCwgIiIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coQ29yZUV4Y2VwdGlvbiBlKQotCXsKLQkJZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhlLmdldFN0YXR1cygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvaW50ZXJuYWwvTGF1bmNoSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvaW50ZXJuYWwvTGF1bmNoSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhZjcyMzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL2ludGVybmFsL0xhdW5jaEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcuaW52b2tlci5QaXBlbGluZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLmludm9rZXIuVHJhbnNmb3JtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcuaW52b2tlci5UeXBlZFZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuSUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLklQcm9jZXNzb3JJbnN0YWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuSVByb2Nlc3NvclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5JVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuSkFYUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5KQVhQUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLkxhdW5jaEF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5MYXVuY2hQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuY29uZmlnLkJhc2VMYXVuY2hIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuY29uZmlnLkxhdW5jaEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5jb25maWcuTGF1bmNoVHJhbnNmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmNvbmZpZy5QcmVmZXJlbmNlVXRpbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotcHVibGljIGNsYXNzIExhdW5jaEhlbHBlciBleHRlbmRzIEJhc2VMYXVuY2hIZWxwZXIKLXsKLQlwcml2YXRlIGZpbmFsIExhdW5jaEF0dHJpYnV0ZXMgYXR0cmlidXRlczsKLQlwcml2YXRlIGZpbmFsIExhdW5jaFByb3BlcnRpZXMgb3V0cHV0UHJvcGVydGllczsKLQlwcml2YXRlIGZpbmFsIElUcmFuc2Zvcm1lckZhY3RvcnkgdHJhbnNmb3JtZXJGYWN0b3J5OwotCi0JcHVibGljIExhdW5jaEhlbHBlcihJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJc3VwZXIoY29uZmlndXJhdGlvbik7Ci0JCWF0dHJpYnV0ZXMgPSBoeWRyYXRlQXR0cmlidXRlcyhjb25maWd1cmF0aW9uKTsKLQkJb3V0cHV0UHJvcGVydGllcyA9IGh5ZHJhdGVPdXRwdXRQcm9wZXJ0aWVzKGNvbmZpZ3VyYXRpb24pOwotCQl0cmFuc2Zvcm1lckZhY3RvcnkgPSBoeWRyYXRlVHJhbnNmb3JtZXJGYWN0b3J5KGNvbmZpZ3VyYXRpb24pOwotCX0KLQotCXB1YmxpYyBMYXVuY2hQcm9wZXJ0aWVzIGdldFByb3BlcnRpZXMoKQotCXsKLQkJcmV0dXJuIG91dHB1dFByb3BlcnRpZXM7Ci0JfQotCi0JcHVibGljIExhdW5jaEF0dHJpYnV0ZXMgZ2V0QXR0cmlidXRlcygpCi0JewotCQlyZXR1cm4gYXR0cmlidXRlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlKEZpbGUgZmlsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCUJ1ZmZlcmVkV3JpdGVyIHdyaXRlciA9IG51bGw7Ci0JCXRyeQotCQl7Ci0JCQkvLyBlbnN1cmUgaXQgZXhpc3RzCi0JCQlmaWxlLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJCXdyaXRlciA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcihmaWxlKSk7Ci0JCQlQaXBlbGluZURlZmluaXRpb24gcGRlZiA9IG5ldyBQaXBlbGluZURlZmluaXRpb24oKTsKLQkJCWZvciAoSXRlcmF0b3I8Pz4gaXRlciA9IGF0dHJpYnV0ZXMuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLQkJCXsKLQkJCQlMYXVuY2hBdHRyaWJ1dGUgYXR0ID0gKExhdW5jaEF0dHJpYnV0ZSkgaXRlci5uZXh0KCk7Ci0JCQkJcGRlZi5hZGRBdHRyaWJ1dGUobmV3IFR5cGVkVmFsdWUoYXR0LnVyaSwgVHlwZWRWYWx1ZS5UWVBFX1NUUklORywgYXR0LnZhbHVlKSk7Ci0JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ZXIgPSBwaXBlbGluZS5nZXRUcmFuc2Zvcm1EZWZzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotCQkJewotCQkJCUxhdW5jaFRyYW5zZm9ybSBsdCA9IChMYXVuY2hUcmFuc2Zvcm0pIGl0ZXIubmV4dCgpOwotCQkJCVRyYW5zZm9ybURlZmluaXRpb24gdGRlZiA9IG5ldyBUcmFuc2Zvcm1EZWZpbml0aW9uKCk7Ci0JCQkJVVJMIHVybCA9IHBhdGhUb1VSTChsdC5nZXRMb2NhdGlvbigpKTsKLQkJCQl0ZGVmLnNldFN0eWxlc2hlZXRVUkwodXJsLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQkJCXRkZWYuc2V0UmVzb2x2ZXJDbGFzcyhsdC5nZXRSZXNvbHZlcigpKTsKLQkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ZXJhdG9yID0gbHQuZ2V0UGFyYW1ldGVycygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0JCQkJewotCQkJCQlMYXVuY2hBdHRyaWJ1dGUgYXR0ID0gKExhdW5jaEF0dHJpYnV0ZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQl0ZGVmLmFkZFBhcmFtZXRlcihuZXcgVHlwZWRWYWx1ZShhdHQudXJpLCBUeXBlZFZhbHVlLlRZUEVfU1RSSU5HLCBhdHQuZ2V0UmVzb2x2ZWRWYWx1ZSgpKSk7Ci0JCQkJfQotCQkJCS8vIHNldCB0aGUgb3V0cHV0IHByb3BzIGZvciB0aGUgTEFTVCB0cmFuc2Zvcm0gb25seQotCQkJCWlmICghaXRlci5oYXNOZXh0KCkpCi0JCQkJewotCQkJCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgOiBvdXRwdXRQcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKS5lbnRyeVNldCgpKQotCQkJCQl7Ci0JCQkJCQlTdHJpbmcgbmFtZSA9IGVudHJ5LmdldEtleSgpOwotCQkJCQkJU3RyaW5nIHZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQkJCWlmIChuYW1lICE9IG51bGwgJiYgdmFsdWUgIT0gbnVsbCkKLQkJCQkJCQl0ZGVmLnNldE91dHB1dFByb3BlcnR5KG5hbWUsIHZhbHVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlwZGVmLmFkZFRyYW5zZm9ybURlZih0ZGVmKTsKLQkJCX0KLQotCQkJRG9jdW1lbnQgZG9jID0gcGRlZi50b1hNTCgpOwotCQkJU3RyaW5nIHMgPSBQcmVmZXJlbmNlVXRpbC5zZXJpYWxpemVEb2N1bWVudChkb2MpOwotCQkJd3JpdGVyLndyaXRlKHMpOwotCQl9Ci0JCWNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkKLQkJewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKQVhQTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCwgSVN0YXR1cy5FUlJPUiwgTWVzc2FnZXMuTGF1bmNoSGVscGVyXzAsIGUpKTsgCi0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0JCXsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkFYUExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQsIElTdGF0dXMuRVJST1IsIE1lc3NhZ2VzLkxhdW5jaEhlbHBlcl8xLCBlKSk7IAotCQl9Ci0JCWNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpCi0JCXsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkFYUExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQsIElTdGF0dXMuRVJST1IsICJQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGUpCi0JCXsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkFYUExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQsIElTdGF0dXMuRVJST1IsICJUcmFuc2Zvcm1lckV4Y2VwdGlvbiIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWZpbmFsbHkKLQkJewotCQkJaWYgKHdyaXRlciAhPSBudWxsKQotCQkJewotCQkJCXRyeQotCQkJCXsKLQkJCQkJd3JpdGVyLmNsb3NlKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKQotCQkJCXsKLQkJCQkJSkFYUExhdW5jaGluZ1BsdWdpbi5sb2coZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBMYXVuY2hQcm9wZXJ0aWVzIGh5ZHJhdGVPdXRwdXRQcm9wZXJ0aWVzKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlMYXVuY2hQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgTGF1bmNoUHJvcGVydGllcygpOwotCQlib29sZWFuIHVzZVByZWZlcmVuY2VQcm9wZXJ0aWVzID0gZmFsc2U7IC8vY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoSkFYUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9VU0VfUFJPUEVSVElFU19GUk9NX1BSRUZFUkVOQ0VTLCB0cnVlKTsKLQkJSVByb2Nlc3NvclR5cGUgcHQgPSBnZXRQcm9jZXNzb3JJbnN0YWxsKGNvbmZpZ3VyYXRpb24pLmdldFByb2Nlc3NvclR5cGUoKTsKLQkJaWYgKHVzZVByZWZlcmVuY2VQcm9wZXJ0aWVzKQotCQl7Ci0JCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgOiBwdC5nZXRPdXRwdXRQcm9wZXJ0eVZhbHVlcygpLmVudHJ5U2V0KCkpCi0JCQl7Ci0JCQkJU3RyaW5nIG5hbWUgPSBlbnRyeS5nZXRLZXkoKTsKLQkJCQlTdHJpbmcgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCXByb3BlcnRpZXMuc2V0UHJvcGVydHkobmFtZSwgdmFsdWUpOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJU3RyaW5nIHMgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShKQVhQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX09VVFBVVF9QUk9QRVJUSUVTLCAoU3RyaW5nKSBudWxsKTsKLQkJCWlmIChzICE9IG51bGwgJiYgcy5sZW5ndGgoKSA+IDApCi0JCQl7Ci0JCQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocy5nZXRCeXRlcygpKTsKLQkJCQlwcm9wZXJ0aWVzID0gTGF1bmNoUHJvcGVydGllcy5mcm9tWE1MKGlucHV0U3RyZWFtKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJvcGVydGllczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBMYXVuY2hBdHRyaWJ1dGVzIGh5ZHJhdGVBdHRyaWJ1dGVzKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlMYXVuY2hBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMgID0gbmV3IExhdW5jaEF0dHJpYnV0ZXMoKTsKLQkJYm9vbGVhbiB1c2VEZWZhdWx0QXR0cmlidXRlcyA9IGZhbHNlOyAvL2NvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKEpBWFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfVVNFX0ZFQVRVUkVTX0ZST01fUFJFRkVSRU5DRVMsIHRydWUpOwotCQlpZiAodXNlRGVmYXVsdEF0dHJpYnV0ZXMpCi0JCXsKLQkJCUlQcm9jZXNzb3JUeXBlIHB0ID0gZ2V0UHJvY2Vzc29ySW5zdGFsbChjb25maWd1cmF0aW9uKS5nZXRQcm9jZXNzb3JUeXBlKCk7Ci0JCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGZ2YWxzID0gcHQuZ2V0QXR0cmlidXRlVmFsdWVzKCk7Ci0JCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgOiBmdmFscy5lbnRyeVNldCgpKQotCQkJewotCQkJCVN0cmluZyB1cmkgPSBlbnRyeS5nZXRLZXkoKTsKLQkJCQlJQXR0cmlidXRlIGF0dHJpYnV0ZSA9IGdldEF0dHJpYnV0ZShwdC5nZXRBdHRyaWJ1dGVzKCksIHVyaSk7Ci0JCQkJYXR0cmlidXRlcy5hZGRBdHRyaWJ1dGUobmV3IExhdW5jaEF0dHJpYnV0ZSh1cmksICJzdHJpbmciLCBlbnRyeS5nZXRWYWx1ZSgpKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlTdHJpbmcgcyA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKEpBWFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfQVRUUklCVVRFUywgKFN0cmluZykgbnVsbCk7Ci0JCQlpZiAocyAhPSBudWxsICYmIHMubGVuZ3RoKCkgPiAwKQotCQkJewotCQkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHMuZ2V0Qnl0ZXMoKSk7Ci0JCQkJYXR0cmlidXRlcyA9IExhdW5jaEF0dHJpYnV0ZXMuZnJvbVhNTChpbnB1dFN0cmVhbSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGF0dHJpYnV0ZXM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSUF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGUoSUF0dHJpYnV0ZVtdIGF0dHJpYnV0ZXMsIFN0cmluZyB1cmkpCi0JewotCQlmb3IgKElBdHRyaWJ1dGUgYXR0cmlidXRlIDogYXR0cmlidXRlcykKLQkJewotCQkJaWYgKGF0dHJpYnV0ZS5nZXRVUkkoKS5lcXVhbHModXJpKSkKLQkJCQlyZXR1cm4gYXR0cmlidXRlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyBJUHJvY2Vzc29ySW5zdGFsbCBnZXRQcm9jZXNzb3JJbnN0YWxsKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlib29sZWFuIHVzZURlZmF1bHRQcm9jZXNzb3IgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShKQVhQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1VTRV9ERUZBVUxUX1BST0NFU1NPUiwgdHJ1ZSk7Ci0JCWlmICh1c2VEZWZhdWx0UHJvY2Vzc29yKQotCQkJcmV0dXJuIEpBWFBSdW50aW1lLmdldERlZmF1bHRQcm9jZXNzb3IoKTsKLQkJU3RyaW5nIHByb2Nlc3NvcklkID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoSkFYUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QUk9DRVNTT1IsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlJUHJvY2Vzc29ySW5zdGFsbCBwcm9jZXNzb3IgPSBKQVhQUnVudGltZS5nZXRQcm9jZXNzb3IocHJvY2Vzc29ySWQpOwotCQlyZXR1cm4gcHJvY2Vzc29yOwotCX0KLQotCXByaXZhdGUgc3RhdGljIElUcmFuc2Zvcm1lckZhY3RvcnkgaHlkcmF0ZVRyYW5zZm9ybWVyRmFjdG9yeShJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJSVByb2Nlc3NvclR5cGUgdHlwZSA9IGdldFByb2Nlc3Nvckluc3RhbGwoY29uZmlndXJhdGlvbikuZ2V0UHJvY2Vzc29yVHlwZSgpOwotCQlib29sZWFuIHVzZURlZmF1bHRGYWN0b3J5ID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoSkFYUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9VU0VfREVGQVVMVF9QUk9DRVNTT1IsIHRydWUpOwotCQlpZiAodXNlRGVmYXVsdEZhY3RvcnkpCi0JCQlyZXR1cm4gdHlwZS5nZXREZWZhdWx0VHJhbnNmb3JtZXJGYWN0b3J5KCk7Ci0JCQotCQlTdHJpbmcgZmFjdG9yeUlkID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoSkFYUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9UUkFOU0ZPUk1FUl9GQUNUT1JZLCAoU3RyaW5nKW51bGwpOwotCQlpZiAoZmFjdG9yeUlkID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCWZvciAoSVRyYW5zZm9ybWVyRmFjdG9yeSBmYWN0b3J5IDogdHlwZS5nZXRUcmFuc2Zvcm1lckZhY3RvcmllcygpKQotCQl7Ci0JCQlpZiAoZmFjdG9yeS5nZXRGYWN0b3J5Q2xhc3MoKS5lcXVhbHMoZmFjdG9yeUlkKSkKLQkJCQlyZXR1cm4gZmFjdG9yeTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSVRyYW5zZm9ybWVyRmFjdG9yeSBnZXRUcmFuc2Zvcm1lckZhY3RvcnkoKQotCXsKLQkJcmV0dXJuIHRyYW5zZm9ybWVyRmFjdG9yeTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvaW50ZXJuYWwvT3V0cHV0UHJvcGVydHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9PdXRwdXRQcm9wZXJ0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDBjOTZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9PdXRwdXRQcm9wZXJ0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuSU91dHB1dFByb3BlcnR5OwotCi1wdWJsaWMgY2xhc3MgT3V0cHV0UHJvcGVydHkgaW1wbGVtZW50cyBJT3V0cHV0UHJvcGVydHkKLXsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGRlc2M7Ci0KLQlwdWJsaWMgT3V0cHV0UHJvcGVydHkoU3RyaW5nIGtleSwgU3RyaW5nIGRlc2MpCi0JewotCQl0aGlzLm5hbWUgPSBrZXk7Ci0JCXRoaXMuZGVzYyA9IGRlc2M7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpCi0JewotCQlyZXR1cm4gZGVzYzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFVSSSgpCi0JewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9PdXRwdXRQcm9wZXJ0eVByZWZlcmVuY2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvaW50ZXJuYWwvT3V0cHV0UHJvcGVydHlQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDczMTMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9PdXRwdXRQcm9wZXJ0eVByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuY29uZmlnLlByZWZlcmVuY2VVdGlsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBPdXRwdXRQcm9wZXJ0eVByZWZlcmVuY2VzCi17Ci0JcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLFN0cmluZz4+IHR5cGVQcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLFN0cmluZz4+KCk7Ci0KLQlwdWJsaWMgTWFwPFN0cmluZyxTdHJpbmc+IGdldE91dHB1dFByb3BlcnR5VmFsdWVzKFN0cmluZyB0eXBlSWQpCi0JewotCQlyZXR1cm4gdHlwZVByb3BlcnRpZXMuZ2V0KHR5cGVJZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T3V0cHV0UHJvcGVydHlWYWx1ZXMoU3RyaW5nIHR5cGVJZCwgTWFwPFN0cmluZyxTdHJpbmc+IHByb3BlcnRpZXMpCi0JewotCQl0eXBlUHJvcGVydGllcy5wdXQodHlwZUlkLCBwcm9wZXJ0aWVzKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFzWE1MKCkgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIElPRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckV4Y2VwdGlvbgotCXsKLQkJRG9jdW1lbnQgZG9jID0gUHJlZmVyZW5jZVV0aWwuZ2V0RG9jdW1lbnQoKTsKLQkJRWxlbWVudCBjb25maWcgPSBkb2MuY3JlYXRlRWxlbWVudCgib3V0cHV0UHJvcGVydHlQcmVmZXJlbmNlcyIpOyAvLyROT04tTkxTLTEkCi0JCWRvYy5hcHBlbmRDaGlsZChjb25maWcpOwotCi0JCWZvciAoU3RyaW5nIHR5cGUgOiB0eXBlUHJvcGVydGllcy5rZXlTZXQoKSkKLQkJewotCQkJRWxlbWVudCBwcm9jZXNzb3JUeXBlRWxlbWVudCA9IHR5cGVBc0VsZW1lbnQoZG9jLCB0eXBlKTsKLQkJCU1hcDxTdHJpbmcsU3RyaW5nPiBwcm9wZXJ0eVZhbHVlcyA9IHR5cGVQcm9wZXJ0aWVzLmdldCh0eXBlKTsKLQkJCWZlYXR1cmVWYWx1ZXNBc0VsZW1lbnQoZG9jLCBwcm9jZXNzb3JUeXBlRWxlbWVudCwgcHJvcGVydHlWYWx1ZXMpOwotCQkJY29uZmlnLmFwcGVuZENoaWxkKHByb2Nlc3NvclR5cGVFbGVtZW50KTsKLQkJfQotCi0JCS8vIFNlcmlhbGl6ZSB0aGUgRG9jdW1lbnQgYW5kIHJldHVybiB0aGUgcmVzdWx0aW5nIFN0cmluZwotCQlyZXR1cm4gUHJlZmVyZW5jZVV0aWwuc2VyaWFsaXplRG9jdW1lbnQoZG9jKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE91dHB1dFByb3BlcnR5UHJlZmVyZW5jZXMgZnJvbVhNTChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCU91dHB1dFByb3BlcnR5UHJlZmVyZW5jZXMgcHJlZnMgPSBuZXcgT3V0cHV0UHJvcGVydHlQcmVmZXJlbmNlcygpOwotCi0JCS8vIERvIHRoZSBwYXJzaW5nIGFuZCBvYnRhaW4gdGhlIHRvcC1sZXZlbCBub2RlCi0JCURvY3VtZW50IGRvYyA9IFByZWZlcmVuY2VVdGlsLmdldERvY3VtZW50KGlucHV0U3RyZWFtKTsKLQkJRWxlbWVudCBjb25maWcgPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0KLQkJRWxlbWVudFtdIHByb2Nlc3NvclR5cGVFbHMgPSBQcmVmZXJlbmNlVXRpbC5nZXRDaGlsZEVsZW1lbnRzKGNvbmZpZywgInByb2Nlc3NvclR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2Nlc3NvclR5cGVFbHMubGVuZ3RoOyArK2kpCi0JCXsKLQkJCUVsZW1lbnQgcHJvY2Vzc29yVHlwZUVsID0gcHJvY2Vzc29yVHlwZUVsc1tpXTsKLQkJCVN0cmluZyB0eXBlID0gZWxlbWVudEFzVHlwZShwcm9jZXNzb3JUeXBlRWwpOwotCQkJTWFwPFN0cmluZyxTdHJpbmc+IGZlYXR1cmVWYWx1ZXMgPSBlbGVtZW50QXNQcm9wZXJ0eVZhbHVlcyhwcm9jZXNzb3JUeXBlRWwpOwotCQkJcHJlZnMuc2V0T3V0cHV0UHJvcGVydHlWYWx1ZXModHlwZSwgZmVhdHVyZVZhbHVlcyk7Ci0JCX0KLQotCQlyZXR1cm4gcHJlZnM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGVsZW1lbnRBc1R5cGUoRWxlbWVudCBwYXJlbnQpCi0JewotCQlTdHJpbmcgaWQgPSBwYXJlbnQuZ2V0QXR0cmlidXRlKCJpZCIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBpZDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBFbGVtZW50IHR5cGVBc0VsZW1lbnQoRG9jdW1lbnQgZG9jLCBTdHJpbmcgdHlwZSkKLQl7Ci0JCUVsZW1lbnQgZWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJwcm9jZXNzb3JUeXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoImlkIiwgdHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBlbGVtZW50QXNQcm9wZXJ0eVZhbHVlcyhFbGVtZW50IGVsZW1lbnQpCi0JewotCQlFbGVtZW50W10gcHJvcGVydHlFbHMgPSBQcmVmZXJlbmNlVXRpbC5nZXRDaGlsZEVsZW1lbnRzKGVsZW1lbnQsICJwcm9wZXJ0eSIpOyAvLyROT04tTkxTLTEkCi0JCU1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydHlWYWx1ZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsU3RyaW5nPigpOwotCQlmb3IgKEVsZW1lbnQgZmVhdHVyZUVsIDogcHJvcGVydHlFbHMpCi0JCXsKLQkJCVN0cmluZyBuYW1lID0gZmVhdHVyZUVsLmdldEF0dHJpYnV0ZSgibmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgdmFsdWUgPSBmZWF0dXJlRWwuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpOyAvLyROT04tTkxTLTEkCi0JCQlwcm9wZXJ0eVZhbHVlcy5wdXQobmFtZSwgdmFsdWUpOwotCQl9Ci0JCXJldHVybiBwcm9wZXJ0eVZhbHVlczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZlYXR1cmVWYWx1ZXNBc0VsZW1lbnQoRG9jdW1lbnQgZG9jLCBFbGVtZW50IGZlYXR1cmVzRWwsIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydHlWYWx1ZXMpCi0JewotCQlpZiAocHJvcGVydHlWYWx1ZXMgIT0gbnVsbCkKLQkJewotCQkJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGVudHJ5IDogcHJvcGVydHlWYWx1ZXMuZW50cnlTZXQoKSkKLQkJCXsKLQkJCQlTdHJpbmcgbmFtZSA9IGVudHJ5LmdldEtleSgpOwotCQkJCVN0cmluZyB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJRWxlbWVudCBlbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoInByb3BlcnR5Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQllbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZSIsIG5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoInZhbHVlIiwgdmFsdWUpOyAvLyROT04tTkxTLTEkCi0JCQkJZmVhdHVyZXNFbC5hcHBlbmRDaGlsZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9QbHVnaW5Qcm9jZXNzb3JKYXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9QbHVnaW5Qcm9jZXNzb3JKYXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNjN2ZhMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvaW50ZXJuYWwvUGx1Z2luUHJvY2Vzc29ySmFyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLklQcm9jZXNzb3JKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5NZXNzYWdlczsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgUGx1Z2luUHJvY2Vzc29ySmFyIGltcGxlbWVudHMgSVByb2Nlc3NvckphcgotewotCXByaXZhdGUgZmluYWwgU3RyaW5nIHBsdWdpbklkOwotCXByaXZhdGUgZmluYWwgSVBhdGggcGF0aDsKLQotCXB1YmxpYyBQbHVnaW5Qcm9jZXNzb3JKYXIoU3RyaW5nIHBsdWdpbklkLCBJUGF0aCBwYXRoKQotCXsKLQkJdGhpcy5wbHVnaW5JZCA9IHBsdWdpbklkOwotCQl0aGlzLnBhdGggPSBwYXRoOwotCX0KLQotCXB1YmxpYyBVUkwgYXNVUkwoKQotCXsKLQkJVVJMIHVybCA9IG51bGw7Ci0JCXRyeQotCQl7Ci0JCQkvLyBGSVhNRSB2ZXJ5IGNsdW1zeSB3YXkgdG8gZ2V0IGxvY2F0aW9uIG9yYml0IGphciBmaWxlCi0JCQkvLyBUaGVyZSBpcyBzdXJlbHkgYSBiZXR0ZXIgd2F5LCBidXQgSSBjYW4nZCBmaW5kIGl0LgotCQkJaWYgKHBhdGggPT0gbnVsbCkKLQkJCXsKLQkJCQl1cmwgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpLmdldEVudHJ5KCIvIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl1cmwgPSBGaWxlTG9jYXRvci5yZXNvbHZlKHVybCk7Ci0JCQkJU3RyaW5nIHMgPSB1cmwuZ2V0UGF0aCgpOwotCQkJCWlmIChzLmVuZHNXaXRoKCIhLyIpKSAvLyROT04tTkxTLTEkCi0JCQkJewotCQkJCQlzID0gcy5zdWJzdHJpbmcoMCxzLmxlbmd0aCgpLTIpOwotCQkJCX0KLQkJCQl1cmwgPSBuZXcgVVJMKHMpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotCQkJCUlQYXRoIGphclBhdGggPSBuZXcgUGF0aCgiLyIgKyBwYXRoKTsgLy8kTk9OLU5MUy0xJAotCQkJCXVybCA9IEZpbGVMb2NhdG9yLmZpbmQoYnVuZGxlLCBqYXJQYXRoLCBudWxsKTsKLQkJCQlpZiAodXJsICE9IG51bGwpCi0JCQkJCXVybCA9IEZpbGVMb2NhdG9yLnJlc29sdmUodXJsKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkKLQkJewotCQkJSkFYUExhdW5jaGluZ1BsdWdpbi5sb2coZSk7Ci0JCX0KLQkJcmV0dXJuIHVybDsKLQl9Ci0KLQlwdWJsaWMgSVBhdGggZ2V0UGF0aCgpCi0JewotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCXJldHVybiAiUGx1Z2luICIgKyBwbHVnaW5JZCArIE1lc3NhZ2VzLlBsdWdpblByb2Nlc3Nvckphcl8wICsgcGF0aDsgLy8kTk9OLU5MUy0xJCAKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvaW50ZXJuYWwvUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvaW50ZXJuYWwvUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiZjFiY2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL2ludGVybmFsL1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkRlZmF1bHRTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLkpBWFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuSkFYUFJ1bnRpbWU7Ci0KLS8qKgotICogQ2xhc3MgdXNlZCB0byBpbml0aWFsaXplIGRlZmF1bHQgcHJlZmVyZW5jZSB2YWx1ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcgotewotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpCi0JewotCQlJRWNsaXBzZVByZWZlcmVuY2VzIG5vZGUgPSBuZXcgRGVmYXVsdFNjb3BlKCkuZ2V0Tm9kZShKQVhQTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCk7Ci0KLQkJUHJvY2Vzc29yUHJlZmVyZW5jZXMgcHJlZnMgPSBuZXcgUHJvY2Vzc29yUHJlZmVyZW5jZXMoKTsKLQkJcHJlZnMuc2V0RGVmYXVsdFByb2Nlc3NvcklkKEpBWFBSdW50aW1lLkpSRV9ERUZBVUxUX1BST0NFU1NPUl9JRCk7Ci0KLQkJT3V0cHV0UHJvcGVydHlQcmVmZXJlbmNlcyBvdXRwdXRQcmVmcyA9IG5ldyBPdXRwdXRQcm9wZXJ0eVByZWZlcmVuY2VzKCk7Ci0JCW91dHB1dFByZWZzLnNldE91dHB1dFByb3BlcnR5VmFsdWVzKEpBWFBSdW50aW1lLkpSRV9ERUZBVUxUX1BST0NFU1NPUl9UWVBFX0lELCBKQVhQUnVudGltZS5jcmVhdGVEZWZhdWx0T3V0cHV0UHJvcGVydGllcyhKQVhQUnVudGltZS5KUkVfREVGQVVMVF9QUk9DRVNTT1JfVFlQRV9JRCkpOwotCQlvdXRwdXRQcmVmcy5zZXRPdXRwdXRQcm9wZXJ0eVZhbHVlcyhKQVhQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5YQUxBTl9UWVBFX0lELCBKQVhQUnVudGltZS5jcmVhdGVEZWZhdWx0T3V0cHV0UHJvcGVydGllcyhKQVhQTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5YQUxBTl9UWVBFX0lEKSk7Ci0JCW91dHB1dFByZWZzLnNldE91dHB1dFByb3BlcnR5VmFsdWVzKEpBWFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLlNBWE9OX1RZUEVfSUQsIEpBWFBSdW50aW1lLmNyZWF0ZURlZmF1bHRPdXRwdXRQcm9wZXJ0aWVzKEpBWFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLlNBWE9OX1RZUEVfSUQpKTsKLQkJb3V0cHV0UHJlZnMuc2V0T3V0cHV0UHJvcGVydHlWYWx1ZXMoSkFYUExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuU0FYT05fMV8wX1RZUEVfSUQsIEpBWFBSdW50aW1lLmNyZWF0ZURlZmF1bHRPdXRwdXRQcm9wZXJ0aWVzKEpBWFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLlNBWE9OXzFfMF9UWVBFX0lEKSk7Ci0KLQkJdHJ5Ci0JCXsKLQkJCVN0cmluZyB4bWwgPSBwcmVmcy5nZXRBc1hNTCgpOwotCQkJbm9kZS5wdXQoSkFYUFJ1bnRpbWUuUFJFRl9QUk9DRVNTT1JfWE1MLCB4bWwpOwotCi0JCQl4bWwgPSBvdXRwdXRQcmVmcy5nZXRBc1hNTCgpOwotCQkJbm9kZS5wdXQoSkFYUFJ1bnRpbWUuUFJFRl9PVVRQVVRfUFJPUEVSVElFU19YTUwsIHhtbCk7Ci0KLQkJCW5vZGUucHV0KEpBWFBMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfREVGQVVMVF9ERUJVR0dJTkdfSU5TVEFMTF9JRCwgIm9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLnhhbGFuLnByb2Nlc3NvciIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkKLQkJewotCQkJSkFYUExhdW5jaGluZ1BsdWdpbi5sb2coZSk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0JCXsKLQkJCUpBWFBMYXVuY2hpbmdQbHVnaW4ubG9nKGUpOwotCQl9Ci0JCWNhdGNoIChUcmFuc2Zvcm1lckV4Y2VwdGlvbiBlKQotCQl7Ci0JCQlKQVhQTGF1bmNoaW5nUGx1Z2luLmxvZyhlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9Qcm9jZXNzb3JJbnZva2VyRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL2ludGVybmFsL1Byb2Nlc3Nvckludm9rZXJEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwYWM5MzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL2ludGVybmFsL1Byb2Nlc3Nvckludm9rZXJEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5JUHJvY2Vzc29ySW52b2tlcjsKLQotcHVibGljIGNsYXNzIFByb2Nlc3Nvckludm9rZXJEZXNjcmlwdG9yIGltcGxlbWVudHMgSVByb2Nlc3Nvckludm9rZXIKLXsKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIGludm9rZXJDbGFzczsKLQlwcml2YXRlIGZpbmFsIFN0cmluZ1tdIGNsYXNzcGF0aDsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBpZDsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBidW5kbGVJZDsKLQotCXB1YmxpYyBQcm9jZXNzb3JJbnZva2VyRGVzY3JpcHRvcihTdHJpbmcgaWQsIFN0cmluZyBidW5kbGVJZCwgU3RyaW5nIGludm9rZXJDbGFzcywgU3RyaW5nW10gY2xhc3NwYXRoKQotCXsKLQkJdGhpcy5pZCA9IGlkOwotCQl0aGlzLmJ1bmRsZUlkID0gYnVuZGxlSWQ7Ci0JCXRoaXMuaW52b2tlckNsYXNzID0gaW52b2tlckNsYXNzOwotCQl0aGlzLmNsYXNzcGF0aCA9IGNsYXNzcGF0aDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0Q2xhc3NwYXRoRW50cmllcygpCi0JewotCQlyZXR1cm4gY3JlYXRlRW50cmllcyhidW5kbGVJZCxjbGFzc3BhdGgpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGNyZWF0ZUVudHJpZXMoU3RyaW5nIGJ1bmRsZUlkLCBTdHJpbmdbXSBjbGFzc3BhdGgpCi0JewotCQlMaXN0PFN0cmluZz4gZW50cmllcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQl0cnkgewotCQkJLy8gaWYgaW4gZGV2IG1vZGUsIHVzZSB0aGUgYmluIGRpcgotCQkJaWYgKFBsYXRmb3JtLmluRGV2ZWxvcG1lbnRNb2RlKCkpCi0JCQkJZW50cmllcy5hZGQoVXRpbHMuZ2V0RmlsZUxvY2F0aW9uKGJ1bmRsZUlkLCAiL2JpbiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChTdHJpbmcgamFyIDogY2xhc3NwYXRoKQotCQkJewotCQkJCVN0cmluZyBlbnRyeSA9IG51bGw7Ci0JCQkJaWYgKGphci5zdGFydHNXaXRoKCIke2VjbGlwc2Vfb3JiaXQ6IikgJiYgamFyLmVuZHNXaXRoKCJ9IikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCXsKLQkJCQkJamFyID0gamFyLnN1YnN0cmluZygiJHtlY2xpcHNlX29yYml0OiIubGVuZ3RoKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCWphciA9IGphci5zdWJzdHJpbmcoMCxqYXIubGVuZ3RoKCktMSk7Ci0JCQkJCXRyeQotCQkJCQl7Ci0JCQkJCQlGaWxlIGJ1bmRsZUZpbGUgPSBGaWxlTG9jYXRvci5nZXRCdW5kbGVGaWxlKFBsYXRmb3JtLmdldEJ1bmRsZShqYXIpKTsKLQkJCQkJCWlmIChidW5kbGVGaWxlLmlzRGlyZWN0b3J5KCkpCi0JCQkJCQkJZW50cnkgPSBVdGlscy5nZXRQbHVnaW5Mb2NhdGlvbihqYXIpICsgIi9iaW4iOwotCQkJCQkJZWxzZQotCQkJCQkJCWVudHJ5ID0gVXRpbHMuZ2V0UGx1Z2luTG9jYXRpb24oamFyKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkKLQkJCQkJe30KLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJZW50cnkgPSBVdGlscy5nZXRGaWxlTG9jYXRpb24oYnVuZGxlSWQsamFyKTsKLQkJCQl9Ci0JCQkJaWYgKGVudHJ5IT1udWxsKQotCQkJCQllbnRyaWVzLmFkZChlbnRyeSk7Ci0JCQl9Ci0JCX0gCi0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIAotCQl7Ci0JCQlKQVhQTGF1bmNoaW5nUGx1Z2luLmxvZyhlKTsKLQkJfQotCQlyZXR1cm4gZW50cmllcy50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotCX0KLQotCS8qKgotCSAqIFRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgSVByb2Nlc3Nvckludm9rZXIKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEludm9rZXJDbGFzc05hbWUoKQotCXsKLQkJcmV0dXJuIGludm9rZXJDbGFzczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkKLQl7Ci0JCXJldHVybiBpZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvaW50ZXJuYWwvUHJvY2Vzc29ySmFyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvaW50ZXJuYWwvUHJvY2Vzc29ySmFyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMWM3NmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL2ludGVybmFsL1Byb2Nlc3Nvckphci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLklQcm9jZXNzb3JKYXI7Ci0KLXB1YmxpYyBjbGFzcyBQcm9jZXNzb3JKYXIgaW1wbGVtZW50cyBJUHJvY2Vzc29ySmFyCi17Ci0JcHJpdmF0ZSBmaW5hbCBJUGF0aCBwYXRoOwotCi0JcHVibGljIFByb2Nlc3NvckphcihJUGF0aCBwYXRoKQotCXsKLQkJdGhpcy5wYXRoID0gcGF0aDsKLQl9Ci0KLQlwdWJsaWMgVVJMIGFzVVJMKCkKLQl7Ci0JCVVSTCB1cmwgPSBudWxsOwotCQl0cnkKLQkJewotCQkJLy8gZmlyc3QgdHJ5IHRvIHJlc29sdmUgYXMgd29ya3NwYWNlLXJlbGF0aXZlIHBhdGgKLQkJCUlQYXRoIHJvb3RQYXRoID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRMb2NhdGlvbigpOwotCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUocm9vdFBhdGguYXBwZW5kKHBhdGgpLnRvT1NTdHJpbmcoKSk7Ci0JCQlpZiAoZmlsZS5leGlzdHMoKSkKLQkJCQl1cmwgPSBmaWxlLnRvVVJMKCk7Ci0JCQllbHNlCi0JCQl7Ci0JCQkJLy8gbm93IHRyeSB0byByZXNvbHZlIGFzIGFuIGFic29sdXRlIHBhdGgKLQkJCQlmaWxlID0gbmV3IEZpbGUocGF0aC50b09TU3RyaW5nKCkpOwotCQkJCXVybCA9IGZpbGUudG9VUkwoKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpCi0JCXsKLQkJCUpBWFBMYXVuY2hpbmdQbHVnaW4ubG9nKGUpOwotCQl9Ci0JCXJldHVybiB1cmw7Ci0JfQotCi0JcHVibGljIElQYXRoIGdldFBhdGgoKQotCXsKLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlyZXR1cm4gcGF0aC50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9Qcm9jZXNzb3JQcmVmZXJlbmNlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL2ludGVybmFsL1Byb2Nlc3NvclByZWZlcmVuY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYzEyYjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL2ludGVybmFsL1Byb2Nlc3NvclByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuSVByb2Nlc3Nvckluc3RhbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5JUHJvY2Vzc29ySmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuUHJvY2Vzc29ySW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5jb25maWcuUHJlZmVyZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBQcm9jZXNzb3JQcmVmZXJlbmNlcwotewotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRQcm9jZXNzb3JJZDsKLQlwcml2YXRlIExpc3Q8SVByb2Nlc3Nvckluc3RhbGw+IHByb2Nlc3NvcnMgPSBuZXcgQXJyYXlMaXN0PElQcm9jZXNzb3JJbnN0YWxsPigpOwotCi0JcHVibGljIHZvaWQgc2V0UHJvY2Vzc29ycyhMaXN0PElQcm9jZXNzb3JJbnN0YWxsPiBwcm9jZXNzb3JzKQotCXsKLQkJdGhpcy5wcm9jZXNzb3JzID0gcHJvY2Vzc29yczsKLQl9Ci0KLQlwdWJsaWMgTGlzdDxJUHJvY2Vzc29ySW5zdGFsbD4gZ2V0UHJvY2Vzc29ycygpCi0JewotCQlyZXR1cm4gcHJvY2Vzc29yczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRQcm9jZXNzb3JJZCgpCi0JewotCQlyZXR1cm4gZGVmYXVsdFByb2Nlc3NvcklkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRQcm9jZXNzb3JJZChTdHJpbmcgZGVmYXVsdFByb2Nlc3NvcklkKQotCXsKLQkJdGhpcy5kZWZhdWx0UHJvY2Vzc29ySWQgPSBkZWZhdWx0UHJvY2Vzc29ySWQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBc1hNTCgpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgVHJhbnNmb3JtZXJFeGNlcHRpb24KLQl7Ci0JCURvY3VtZW50IGRvYyA9IFByZWZlcmVuY2VVdGlsLmdldERvY3VtZW50KCk7Ci0JCUVsZW1lbnQgY29uZmlnID0gZG9jLmNyZWF0ZUVsZW1lbnQoInByb2Nlc3NvclNldHRpbmdzIik7ICAvLyROT04tTkxTLTEkCi0JCWRvYy5hcHBlbmRDaGlsZChjb25maWcpOwotCi0JCS8vIFNldCB0aGUgZGVmYXVsdFZNIGF0dHJpYnV0ZSBvbiB0aGUgdG9wLWxldmVsIG5vZGUKLQkJaWYgKGRlZmF1bHRQcm9jZXNzb3JJZCAhPSBudWxsKQotCQl7Ci0JCQljb25maWcuc2V0QXR0cmlidXRlKCJkZWZhdWx0UHJvY2Vzc29yIiwgZGVmYXVsdFByb2Nlc3NvcklkKTsgIC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWZvciAoSXRlcmF0b3I8SVByb2Nlc3Nvckluc3RhbGw+IGl0ZXIgPSBwcm9jZXNzb3JzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLQkJewotCQkJSVByb2Nlc3Nvckluc3RhbGwgaW5zdGFsbCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKCFpbnN0YWxsLmlzQ29udHJpYnV0ZWQoKSkKLQkJCXsKLQkJCQlFbGVtZW50IHZtVHlwZUVsZW1lbnQgPSBpbnN0YWxsQXNFbGVtZW50KGRvYywgaW5zdGFsbCk7Ci0JCQkJY29uZmlnLmFwcGVuZENoaWxkKHZtVHlwZUVsZW1lbnQpOwotCQkJfQotCQl9Ci0KLQkJLy8gU2VyaWFsaXplIHRoZSBEb2N1bWVudCBhbmQgcmV0dXJuIHRoZSByZXN1bHRpbmcgU3RyaW5nCi0JCXJldHVybiBQcmVmZXJlbmNlVXRpbC5zZXJpYWxpemVEb2N1bWVudChkb2MpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgUHJvY2Vzc29yUHJlZmVyZW5jZXMgZnJvbVhNTChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCVByb2Nlc3NvclByZWZlcmVuY2VzIHByZWZzID0gbmV3IFByb2Nlc3NvclByZWZlcmVuY2VzKCk7Ci0KLQkJRG9jdW1lbnQgZG9jID0gUHJlZmVyZW5jZVV0aWwuZ2V0RG9jdW1lbnQoaW5wdXRTdHJlYW0pOwotCQlFbGVtZW50IGNvbmZpZyA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQotCQkvLyBQb3B1bGF0ZSB0aGUgZGVmYXVsdCBWTS1yZWxhdGVkIGZpZWxkcwotCQlwcmVmcy5zZXREZWZhdWx0UHJvY2Vzc29ySWQoY29uZmlnLmdldEF0dHJpYnV0ZSgiZGVmYXVsdFByb2Nlc3NvciIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCUxpc3Q8SVByb2Nlc3Nvckluc3RhbGw+IHByb2Nlc3NvcnMgPSBuZXcgQXJyYXlMaXN0PElQcm9jZXNzb3JJbnN0YWxsPigpOwotCQkvLyBUcmF2ZXJzZSB0aGUgcGFyc2VkIHN0cnVjdHVyZSBhbmQgcG9wdWxhdGUgdGhlIFZNVHlwZSB0byBWTSBNYXAKLQkJRWxlbWVudFtdIHByb2Nlc3NvckVscyA9IFByZWZlcmVuY2VVdGlsLmdldENoaWxkRWxlbWVudHMoY29uZmlnLCAicHJvY2Vzc29yIik7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9jZXNzb3JFbHMubGVuZ3RoOyArK2kpCi0JCXsKLQkJCUlQcm9jZXNzb3JJbnN0YWxsIHByb2Nlc3NvciA9IGVsZW1lbnRBc0luc3RhbGwocHJvY2Vzc29yRWxzW2ldKTsKLQkJCXByb2Nlc3NvcnMuYWRkKHByb2Nlc3Nvcik7Ci0JCX0KLQotCQlwcmVmcy5zZXRQcm9jZXNzb3JzKHByb2Nlc3NvcnMpOwotCi0JCXJldHVybiBwcmVmczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJUHJvY2Vzc29ySW5zdGFsbCBlbGVtZW50QXNJbnN0YWxsKEVsZW1lbnQgcGFyZW50KQotCXsKLQkJU3RyaW5nIGlkID0gcGFyZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbGFiZWwgPSBwYXJlbnQuZ2V0QXR0cmlidXRlKCJsYWJlbCIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyB0eXBlSWQgPSBwYXJlbnQuZ2V0QXR0cmlidXRlKCJ0eXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHN1cHBvcnRzID0gcGFyZW50LmdldEF0dHJpYnV0ZSgic3VwcG9ydHMiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgZGVidWdnZXJJZCA9IHBhcmVudC5nZXRBdHRyaWJ1dGUoImRlYnVnZ2VySWQiKTsgLy8kTk9OLU5MUy0xJAotCi0JCUlQcm9jZXNzb3JKYXJbXSBqYXJzID0gbnVsbDsKLQkJRWxlbWVudFtdIGphcnNFbHMgPSBQcmVmZXJlbmNlVXRpbC5nZXRDaGlsZEVsZW1lbnRzKHBhcmVudCwgImphcnMiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoamFyc0Vscy5sZW5ndGggPT0gMSkKLQkJewotCQkJamFycyA9IGVsZW1lbnRBc0phcnMoamFyc0Vsc1swXSk7Ci0JCX0KLQkJSVByb2Nlc3Nvckluc3RhbGwgaW5zdGFsbCA9IG5ldyBQcm9jZXNzb3JJbnN0YWxsKGlkLCBsYWJlbCwgdHlwZUlkLCBqYXJzLCBkZWJ1Z2dlcklkLCBzdXBwb3J0cywgZmFsc2UpOwotCQlyZXR1cm4gaW5zdGFsbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBFbGVtZW50IGluc3RhbGxBc0VsZW1lbnQoRG9jdW1lbnQgZG9jLCBJUHJvY2Vzc29ySW5zdGFsbCBpbnN0YWxsKQotCXsKLQkJRWxlbWVudCBlbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoInByb2Nlc3NvciIpOyAvLyROT04tTkxTLTEkCi0JCWVsZW1lbnQuc2V0QXR0cmlidXRlKCJpZCIsIGluc3RhbGwuZ2V0SWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoImxhYmVsIiwgaW5zdGFsbC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCWVsZW1lbnQuc2V0QXR0cmlidXRlKCJ0eXBlIiwgaW5zdGFsbC5nZXRQcm9jZXNzb3JUeXBlKCkuZ2V0SWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoInN1cHBvcnRzIiwgaW5zdGFsbC5nZXRTdXBwb3J0cygpKTsgLy8kTk9OLU5MUy0xJAotCQllbGVtZW50LnNldEF0dHJpYnV0ZSgiZGVidWdnZXJJZCIsIGluc3RhbGwuZ2V0RGVidWdnZXIoKSAhPSBudWxsID8gaW5zdGFsbC5nZXREZWJ1Z2dlcigpLmdldElkKCkgOiBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQllbGVtZW50LmFwcGVuZENoaWxkKGphcnNBc0VsZW1lbnQoZG9jLCBpbnN0YWxsLmdldFByb2Nlc3NvckphcnMoKSkpOwotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJUHJvY2Vzc29ySmFyW10gZWxlbWVudEFzSmFycyhFbGVtZW50IGVsZW1lbnQpCi0JewotCQlFbGVtZW50W10gamFyRWxzID0gUHJlZmVyZW5jZVV0aWwuZ2V0Q2hpbGRFbGVtZW50cyhlbGVtZW50LCAiamFyIik7IC8vJE5PTi1OTFMtMSQKLQkJTGlzdDxQcm9jZXNzb3JKYXI+IGphcnMgPSBuZXcgQXJyYXlMaXN0PFByb2Nlc3Nvckphcj4oamFyRWxzLmxlbmd0aCk7Ci0JCWZvciAoRWxlbWVudCBqYXJFbCA6IGphckVscykKLQkJewotCQkJTm9kZSBub2RlID0gamFyRWwuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJaWYgKG5vZGUgIT0gbnVsbCAmJiBub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpCi0JCQl7Ci0JCQkJU3RyaW5nIHBhdGggPSAoKFRleHQpIG5vZGUpLmdldE5vZGVWYWx1ZSgpOwotCQkJCWphcnMuYWRkKG5ldyBQcm9jZXNzb3JKYXIoUGF0aC5mcm9tUG9ydGFibGVTdHJpbmcocGF0aCkpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gamFycy50b0FycmF5KG5ldyBJUHJvY2Vzc29ySmFyWzBdKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBFbGVtZW50IGphcnNBc0VsZW1lbnQoRG9jdW1lbnQgZG9jLCBJUHJvY2Vzc29ySmFyW10gamFycykKLQl7Ci0JCUVsZW1lbnQgamFyc0VsID0gZG9jLmNyZWF0ZUVsZW1lbnQoImphcnMiKTsgIC8vJE5PTi1OTFMtMSQKLQkJZm9yIChJUHJvY2Vzc29ySmFyIGphciA6IGphcnMpCi0JCXsKLQkJCWlmIChqYXIgIT0gbnVsbCAmJiBqYXIuZ2V0UGF0aCgpICE9IG51bGwpCi0JCQl7Ci0JCQkJRWxlbWVudCBqYXJFbCA9IGRvYy5jcmVhdGVFbGVtZW50KCJqYXIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVRleHQgdGV4dCA9IGRvYy5jcmVhdGVUZXh0Tm9kZShqYXIuZ2V0UGF0aCgpLnRvUG9ydGFibGVTdHJpbmcoKSk7Ci0JCQkJamFyRWwuYXBwZW5kQ2hpbGQodGV4dCk7Ci0JCQkJamFyc0VsLmFwcGVuZENoaWxkKGphckVsKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gamFyc0VsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9Qcm9jZXNzb3JUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvaW50ZXJuYWwvUHJvY2Vzc29yVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWQ4ZmU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9Qcm9jZXNzb3JUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5JQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuSU91dHB1dFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuSVByb2Nlc3NvclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5JVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuSkFYUFJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5NZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFByb2Nlc3NvclR5cGUgaW1wbGVtZW50cyBJUHJvY2Vzc29yVHlwZQotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDX1NVRkZJWCA9ICIuREVTQyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9TVUZGSVggPSAiLlRZUEUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBpZDsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotCXByaXZhdGUgZmluYWwgSVRyYW5zZm9ybWVyRmFjdG9yeVtdIHRyYW5zZm9ybWVyRmFjdG9yaWVzOwotCXByaXZhdGUgZmluYWwgVVJMIGF0dHJpYnV0ZVByb3BlcnRpZXNVUkw7Ci0JcHJpdmF0ZSBmaW5hbCBVUkwgb3V0cHV0UHJvcGVydGllc1VSTDsKLQotCXByaXZhdGUgSUF0dHJpYnV0ZVtdIGF0dHJpYnV0ZXM7Ci0JcHJpdmF0ZSBJT3V0cHV0UHJvcGVydHlbXSBvdXRwdXRQcm9wZXJ0aWVzOwotCXByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBvdXRwdXRQcm9wZXJ0eVZhbHVlczsKLQlwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gYXR0cmlidXRlVmFsdWVzOwotCi0JcHVibGljIFByb2Nlc3NvclR5cGUoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgVVJMIGF0dHJpYnV0ZVByb3BlcnRpZXNVUkwsIFVSTCBvdXRwdXRQcm9wZXJ0aWVzVVJMLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGF0dHJpYnV0ZVZhbHVlcywgTWFwPFN0cmluZywgU3RyaW5nPiBvdXRwdXRQcm9wZXJ0eVZhbHVlcywgSVRyYW5zZm9ybWVyRmFjdG9yeVtdIHRyYW5zZm9ybWVyRmFjdG9yaWVzKQotCXsKLQkJdGhpcy5pZCA9IGlkOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmF0dHJpYnV0ZVByb3BlcnRpZXNVUkwgPSBhdHRyaWJ1dGVQcm9wZXJ0aWVzVVJMOwotCQl0aGlzLm91dHB1dFByb3BlcnRpZXNVUkwgPSBvdXRwdXRQcm9wZXJ0aWVzVVJMOwotCQl0aGlzLmF0dHJpYnV0ZVZhbHVlcyA9IGF0dHJpYnV0ZVZhbHVlczsKLQkJdGhpcy50cmFuc2Zvcm1lckZhY3RvcmllcyA9IHRyYW5zZm9ybWVyRmFjdG9yaWVzOwotCQl0aGlzLm91dHB1dFByb3BlcnR5VmFsdWVzID0gb3V0cHV0UHJvcGVydHlWYWx1ZXM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJZCgpCi0JewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpCi0JewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRBdHRyaWJ1dGVWYWx1ZXMoKQotCXsKLQkJcmV0dXJuIGF0dHJpYnV0ZVZhbHVlczsKLQl9Ci0KLQlwdWJsaWMgSUF0dHJpYnV0ZVtdIGdldEF0dHJpYnV0ZXMoKQotCXsKLQkJaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkKLQkJewotCQkJaWYgKGF0dHJpYnV0ZVByb3BlcnRpZXNVUkwgIT0gbnVsbCkKLQkJCQlhdHRyaWJ1dGVzID0gbG9hZEF0dHJpYnV0ZXMoKTsKLQkJCWVsc2UKLQkJCQlhdHRyaWJ1dGVzID0gbmV3IElBdHRyaWJ1dGVbMF07Ci0JCX0KLQkJcmV0dXJuIGF0dHJpYnV0ZXM7Ci0JfQotCi0JcHVibGljIE1hcDxTdHJpbmcsU3RyaW5nPiBnZXRPdXRwdXRQcm9wZXJ0eVZhbHVlcygpCi0JewotCQlyZXR1cm4gb3V0cHV0UHJvcGVydHlWYWx1ZXM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNKUkVEZWZhdWx0KCkKLQl7Ci0JCXJldHVybiBKQVhQUnVudGltZS5KUkVfREVGQVVMVF9QUk9DRVNTT1JfVFlQRV9JRC5lcXVhbHMoaWQpOwotCX0KLQotCXB1YmxpYyBJVHJhbnNmb3JtZXJGYWN0b3J5W10gZ2V0VHJhbnNmb3JtZXJGYWN0b3JpZXMoKQotCXsKLQkJcmV0dXJuIHRyYW5zZm9ybWVyRmFjdG9yaWVzOwotCX0KLQkKLQlwdWJsaWMgSVRyYW5zZm9ybWVyRmFjdG9yeSBnZXREZWZhdWx0VHJhbnNmb3JtZXJGYWN0b3J5KCkKLQl7Ci0JCWlmICh0cmFuc2Zvcm1lckZhY3Rvcmllcy5sZW5ndGggPiAwKQotCQkJcmV0dXJuIHRyYW5zZm9ybWVyRmFjdG9yaWVzWzBdOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSU91dHB1dFByb3BlcnR5W10gZ2V0T3V0cHV0UHJvcGVydGllcygpCi0JewotCQlpZiAob3V0cHV0UHJvcGVydGllcyA9PSBudWxsKQotCQl7Ci0JCQlpZiAob3V0cHV0UHJvcGVydGllc1VSTCAhPSBudWxsKQotCQkJCW91dHB1dFByb3BlcnRpZXMgPSBsb2FkT3V0cHV0UHJvcGVydGllcygpOwotCQkJZWxzZQotCQkJCW91dHB1dFByb3BlcnRpZXMgPSBuZXcgSU91dHB1dFByb3BlcnR5WzBdOwotCQl9Ci0JCXJldHVybiBvdXRwdXRQcm9wZXJ0aWVzOwotCX0KLQotCXByaXZhdGUgSU91dHB1dFByb3BlcnR5W10gbG9hZE91dHB1dFByb3BlcnRpZXMoKQotCXsKLQkJQnVmZmVyZWRJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0JCUxpc3Q8T3V0cHV0UHJvcGVydHk+IG91dHB1dHMgPSBuZXcgQXJyYXlMaXN0PE91dHB1dFByb3BlcnR5PigpOwotCQlQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJdHJ5Ci0JCXsKLQotCQkJaXMgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShvdXRwdXRQcm9wZXJ0aWVzVVJMLm9wZW5TdHJlYW0oKSk7Ci0JCQlwcm9wcy5sb2FkKGlzKTsKLQkJCWZvciAoT2JqZWN0IGVsZW1lbnQgOiBwcm9wcy5rZXlTZXQoKSkKLQkJCXsKLQkJCQlTdHJpbmcga2V5ID0gKFN0cmluZykgZWxlbWVudDsKLQkJCQlpZiAoIWtleS5lbmRzV2l0aChERVNDX1NVRkZJWCkpCi0JCQkJewotCQkJCQlTdHJpbmcgbmFtZSA9IGtleTsKLQkJCQkJU3RyaW5nIHVyaSA9IHByb3BzLmdldFByb3BlcnR5KGtleSk7Ci0JCQkJCVN0cmluZyBkZXNjID0gcHJvcHMuZ2V0UHJvcGVydHkoa2V5ICsgREVTQ19TVUZGSVgpOwotCQkJCQlpZiAodXJpICE9IG51bGwgJiYgbmFtZSAhPSBudWxsICYmIGRlc2MgIT0gbnVsbCkKLQkJCQkJewotCQkJCQkJT3V0cHV0UHJvcGVydHkgcHJvcCA9IG5ldyBPdXRwdXRQcm9wZXJ0eSh1cmkudHJpbSgpLCBkZXNjKTsKLQkJCQkJCW91dHB1dHMuYWRkKHByb3ApOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJSkFYUExhdW5jaGluZ1BsdWdpbi5sb2cobmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIEpBWFBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lELCBNZXNzYWdlcy5Qcm9jZXNzb3JUeXBlXzIgKyBvdXRwdXRQcm9wZXJ0aWVzVVJMIAotCQkJCQkJCQkrIE1lc3NhZ2VzLlByb2Nlc3NvclR5cGVfMyArIGtleSkpKTsgCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0JCXsKLQkJCUpBWFBMYXVuY2hpbmdQbHVnaW4ubG9nKGUpOwotCQl9Ci0JCWZpbmFsbHkKLQkJewotCQkJaWYgKGlzICE9IG51bGwpCi0JCQl7Ci0JCQkJdHJ5Ci0JCQkJewotCQkJCQlpcy5jbG9zZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkKLQkJCQl7Ci0JCQkJCUpBWFBMYXVuY2hpbmdQbHVnaW4ubG9nKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gb3V0cHV0cy50b0FycmF5KG5ldyBJT3V0cHV0UHJvcGVydHlbMF0pOwotCX0KLQotCXByaXZhdGUgSUF0dHJpYnV0ZVtdIGxvYWRBdHRyaWJ1dGVzKCkKLQl7Ci0JCUJ1ZmZlcmVkSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotCQlMaXN0PEF0dHJpYnV0ZT4gYXR0cmlidXRlc0xpc3QgPSBuZXcgQXJyYXlMaXN0PEF0dHJpYnV0ZT4oKTsKLQkJdHJ5Ci0JCXsKLQkJCWlzID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oYXR0cmlidXRlUHJvcGVydGllc1VSTC5vcGVuU3RyZWFtKCkpOwotCQkJUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCQlwcm9wcy5sb2FkKGlzKTsKLQotCQkJZm9yIChPYmplY3QgZWxlbWVudCA6IHByb3BzLmtleVNldCgpKQotCQkJewotCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBlbGVtZW50OwotCQkJCWlmICgha2V5LmVuZHNXaXRoKERFU0NfU1VGRklYKSAmJiAha2V5LmVuZHNXaXRoKFRZUEVfU1VGRklYKSkKLQkJCQl7Ci0JCQkJCVN0cmluZyB1cmkgPSBwcm9wcy5nZXRQcm9wZXJ0eShrZXkpOwotCQkJCQlTdHJpbmcgdHlwZSA9IHByb3BzLmdldFByb3BlcnR5KGtleSArIFRZUEVfU1VGRklYKTsKLQkJCQkJU3RyaW5nIGRlc2MgPSBwcm9wcy5nZXRQcm9wZXJ0eShrZXkgKyBERVNDX1NVRkZJWCk7Ci0JCQkJCWlmICh1cmkgIT0gbnVsbCAmJiB0eXBlICE9IG51bGwgJiYgZGVzYyAhPSBudWxsKQotCQkJCQl7Ci0JCQkJCQlBdHRyaWJ1dGUgYXR0cmlidXRlID0gbmV3IEF0dHJpYnV0ZSh1cmkudHJpbSgpLCB0eXBlLnRyaW0oKSwgZGVzYyk7Ci0JCQkJCQlhdHRyaWJ1dGVzTGlzdC5hZGQoYXR0cmlidXRlKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCUpBWFBMYXVuY2hpbmdQbHVnaW4ubG9nKG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBKQVhQTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCwgTWVzc2FnZXMuUHJvY2Vzc29yVHlwZV80ICsgYXR0cmlidXRlUHJvcGVydGllc1VSTAotCQkJCQkJCQkrIE1lc3NhZ2VzLlByb2Nlc3NvclR5cGVfNSArIGtleSkpKTsgCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkKLQkJewotCQkJSkFYUExhdW5jaGluZ1BsdWdpbi5sb2coZSk7Ci0JCX0KLQkJZmluYWxseQotCQl7Ci0JCQlpZiAoaXMgIT0gbnVsbCkKLQkJCXsKLQkJCQl0cnkKLQkJCQl7Ci0JCQkJCWlzLmNsb3NlKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKQotCQkJCXsKLQkJCQkJSkFYUExhdW5jaGluZ1BsdWdpbi5sb2coZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCUlBdHRyaWJ1dGVbXSBhdHRyaWJ1dGVzID0gYXR0cmlidXRlc0xpc3QudG9BcnJheShuZXcgSUF0dHJpYnV0ZVswXSk7Ci0JCUFycmF5cy5zb3J0KGF0dHJpYnV0ZXMpOwotCQlyZXR1cm4gYXR0cmlidXRlczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL2ludGVybmFsL1RyYW5zZm9ybWVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL2ludGVybmFsL1RyYW5zZm9ybWVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDQ5ZDQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9UcmFuc2Zvcm1lckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuSVRyYW5zZm9ybWVyRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFRyYW5zZm9ybWVyRmFjdG9yeSBpbXBsZW1lbnRzIElUcmFuc2Zvcm1lckZhY3RvcnkKLXsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBmYWN0b3J5Q2xhc3M7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLQkKLQlwdWJsaWMgVHJhbnNmb3JtZXJGYWN0b3J5KFN0cmluZyBuYW1lLFN0cmluZyBmYWN0b3J5Q2xhc3MpCi0JewotCQlzdXBlcigpOwotCQl0aGlzLmZhY3RvcnlDbGFzcyA9IGZhY3RvcnlDbGFzczsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZhY3RvcnlDbGFzcygpCi0JewotCQlyZXR1cm4gZmFjdG9yeUNsYXNzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9VdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL2ludGVybmFsL1V0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MWYyOGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL2ludGVybmFsL1V0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5NZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFV0aWxzCi17Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaWxlTG9jYXRpb24oU3RyaW5nIGJ1bmRsZUlkLCBTdHJpbmcgcGF0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCVN0cmluZyBsb2NhdGlvbiA9IG51bGw7Ci0JCXRyeQotCQl7Ci0JCQlVUkwgdXJsID0gRmlsZUxvY2F0b3IuZmluZChQbGF0Zm9ybS5nZXRCdW5kbGUoYnVuZGxlSWQpLCBuZXcgUGF0aChwYXRoKSwgbnVsbCk7Ci0JCQlpZiAodXJsICE9IG51bGwpCi0JCQl7Ci0JCQkJVVJMIGZpbGVVcmwgPSBGaWxlTG9jYXRvci50b0ZpbGVVUkwodXJsKTsKLQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlVXJsLmdldEZpbGUoKSk7Ci0JCQkJbG9jYXRpb24gPSBmaWxlLmdldEFic29sdXRlUGF0aCgpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKQotCQl7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpBWFBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lELCBJU3RhdHVzLkVSUk9SLCBNZXNzYWdlcy5VdGlsc18wICsgcGF0aCArIE1lc3NhZ2VzLlV0aWxzXzEgKyBidW5kbGVJZCwgZSkpOyAKLQkJfSAKLQkJcmV0dXJuIGxvY2F0aW9uOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBsdWdpbkxvY2F0aW9uKFN0cmluZyBidW5kbGVJZCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCVN0cmluZyBsb2NhdGlvbiA9IG51bGw7Ci0JCXRyeQotCQl7Ci0JCQlVUkwgdXJsID0gbmV3IFVSTCgicGxhdGZvcm06L3BsdWdpbi8iK2J1bmRsZUlkKTsKLQkJCWlmICh1cmwgIT0gbnVsbCkKLQkJCXsKLQkJCQlVUkwgZmlsZVVybCA9IEZpbGVMb2NhdG9yLnRvRmlsZVVSTCh1cmwpOwotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGZpbGVVcmwuZ2V0RmlsZSgpKTsKLQkJCQlsb2NhdGlvbiA9IGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0JCXsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkFYUExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQsIElTdGF0dXMuRVJST1IsIE1lc3NhZ2VzLlV0aWxzXzAgKyBidW5kbGVJZCArIE1lc3NhZ2VzLlV0aWxzXzEgKyBidW5kbGVJZCwgZSkpOyAKLQkJfSAKLQkJcmV0dXJuIGxvY2F0aW9uOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL2ludGVybmFsL3JlZ2lzdHJ5L0Fic3RyYWN0UmVnaXN0cnlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9yZWdpc3RyeS9BYnN0cmFjdFJlZ2lzdHJ5UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMjE4YzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL2ludGVybmFsL3JlZ2lzdHJ5L0Fic3RyYWN0UmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLmludGVybmFsLnJlZ2lzdHJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5pbnRlcm5hbC5KQVhQTGF1bmNoaW5nUGx1Z2luOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZWdpc3RyeVJlYWRlcgotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgbG9nRXJyb3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIFN0cmluZyB0ZXh0KQotCXsKLQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpOwotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWYuYXBwZW5kKCJQbHVnaW4gIiArIGV4dGVuc2lvbi5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCkgKyBNZXNzYWdlcy5BYnN0cmFjdFJlZ2lzdHJ5UmVhZGVyXzMgKyBleHRlbnNpb24uZ2V0RXh0ZW5zaW9uUG9pbnRVbmlxdWVJZGVudGlmaWVyKCkpOyAvLyROT04tTkxTLTEkIAotCQlidWYuYXBwZW5kKCJcbiIgKyB0ZXh0KTsgLy8kTk9OLU5MUy0xJAotCQlKQVhQTGF1bmNoaW5nUGx1Z2luLmxvZyhuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpBWFBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lELCBJU3RhdHVzLk9LLCBidWYudG9TdHJpbmcoKSwgbnVsbCkpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgbG9nTWlzc2luZ0F0dHJpYnV0ZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpCi0JewotCQlsb2dFcnJvcihlbGVtZW50LCBNZXNzYWdlcy5BYnN0cmFjdFJlZ2lzdHJ5UmVhZGVyXzUgKyBhdHRyaWJ1dGVOYW1lICsgTWVzc2FnZXMuQWJzdHJhY3RSZWdpc3RyeVJlYWRlcl82KTsgCi0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGxvZ01pc3NpbmdFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgZWxlbWVudE5hbWUpCi0JewotCQlsb2dFcnJvcihlbGVtZW50LCBNZXNzYWdlcy5BYnN0cmFjdFJlZ2lzdHJ5UmVhZGVyXzcgKyBlbGVtZW50TmFtZSArIE1lc3NhZ2VzLkFic3RyYWN0UmVnaXN0cnlSZWFkZXJfOCk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGxvZ1Vua25vd25FbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KQotCXsKLQkJbG9nRXJyb3IoZWxlbWVudCwgTWVzc2FnZXMuQWJzdHJhY3RSZWdpc3RyeVJlYWRlcl85ICsgZWxlbWVudC5nZXROYW1lKCkpOyAKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElFeHRlbnNpb25bXSBvcmRlckV4dGVuc2lvbnMoSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMpCi0JewotCQlJRXh0ZW5zaW9uW10gc29ydGVkRXh0ZW5zaW9uID0gbmV3IElFeHRlbnNpb25bZXh0ZW5zaW9ucy5sZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGV4dGVuc2lvbnMsIDAsIHNvcnRlZEV4dGVuc2lvbiwgMCwgZXh0ZW5zaW9ucy5sZW5ndGgpOwotCQlDb21wYXJhdG9yPElFeHRlbnNpb24+IGNvbXBhcmVyID0gbmV3IENvbXBhcmF0b3I8SUV4dGVuc2lvbj4oKQotCQl7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoSUV4dGVuc2lvbiBhcmcwLCBJRXh0ZW5zaW9uIGFyZzEpCi0JCQl7Ci0JCQkJU3RyaW5nIHMxID0gYXJnMC5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCk7Ci0JCQkJU3RyaW5nIHMyID0gYXJnMS5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCk7Ci0JCQkJcmV0dXJuIHMxLmNvbXBhcmVUb0lnbm9yZUNhc2UoczIpOwotCQkJfQotCQl9OwotCQlDb2xsZWN0aW9ucy5zb3J0KEFycmF5cy5hc0xpc3Qoc29ydGVkRXh0ZW5zaW9uKSwgY29tcGFyZXIpOwotCQlyZXR1cm4gc29ydGVkRXh0ZW5zaW9uOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KTsKLQotCXByb3RlY3RlZCB2b2lkIHJlYWRFbGVtZW50Q2hpbGRyZW4oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpCi0JewotCQlyZWFkRWxlbWVudHMoZWxlbWVudC5nZXRDaGlsZHJlbigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWFkRWxlbWVudHMoSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMpCi0JewotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotCQl7Ci0JCQlpZiAoIXJlYWRFbGVtZW50KGVsZW1lbnRzW2ldKSkKLQkJCQlsb2dVbmtub3duRWxlbWVudChlbGVtZW50c1tpXSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWFkRXh0ZW5zaW9uKElFeHRlbnNpb24gZXh0ZW5zaW9uKQotCXsKLQkJcmVhZEVsZW1lbnRzKGV4dGVuc2lvbi5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVhZFJlZ2lzdHJ5KElFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSwgU3RyaW5nIHBsdWdpbklkLCBTdHJpbmcgZXh0ZW5zaW9uUG9pbnQpCi0JewotCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChwbHVnaW5JZCwgZXh0ZW5zaW9uUG9pbnQpOwotCQlpZiAocG9pbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBwb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCWV4dGVuc2lvbnMgPSBvcmRlckV4dGVuc2lvbnMoZXh0ZW5zaW9ucyk7Ci0JCWZvciAoSUV4dGVuc2lvbiBlbGVtZW50IDogZXh0ZW5zaW9ucykKLQkJCXJlYWRFeHRlbnNpb24oZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQpCi0JewotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjaGlsZHJlbiA9IGNvbmZpZ0VsZW1lbnQuZ2V0Q2hpbGRyZW4oVEFHX0RFU0NSSVBUSU9OKTsKLQkJaWYgKGNoaWxkcmVuLmxlbmd0aCA+PSAxKQotCQl7Ci0JCQlyZXR1cm4gY2hpbGRyZW5bMF0uZ2V0VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDbGFzc1ZhbHVlKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50LCBTdHJpbmcgY2xhc3NBdHRyaWJ1dGVOYW1lKQotCXsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKGNsYXNzQXR0cmlidXRlTmFtZSk7Ci0JCWlmIChjbGFzc05hbWUgIT0gbnVsbCkKLQkJCXJldHVybiBjbGFzc05hbWU7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNhbmRpZGF0ZUNoaWxkcmVuID0gY29uZmlnRWxlbWVudC5nZXRDaGlsZHJlbihjbGFzc0F0dHJpYnV0ZU5hbWUpOwotCQlpZiAoY2FuZGlkYXRlQ2hpbGRyZW4ubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlyZXR1cm4gY2FuZGlkYXRlQ2hpbGRyZW5bMF0uZ2V0QXR0cmlidXRlKEFUVF9DTEFTUyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9yZWdpc3RyeS9EZWJ1Z2dlclJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvaW50ZXJuYWwvcmVnaXN0cnkvRGVidWdnZXJSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGEwYmJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9yZWdpc3RyeS9EZWJ1Z2dlclJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLmludGVybmFsLnJlZ2lzdHJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuSURlYnVnZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuaW50ZXJuYWwuRGVidWdnZXJEZXNjcmlwdG9yOwotCi1wdWJsaWMgY2xhc3MgRGVidWdnZXJSZWdpc3RyeQotewotCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgRGVidWdnZXJEZXNjcmlwdG9yPiBkZWJ1Z2dlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIERlYnVnZ2VyRGVzY3JpcHRvcj4oKTsKLQotCXB1YmxpYyBEZWJ1Z2dlclJlZ2lzdHJ5KCkKLQl7Ci0JCURlYnVnZ2VyUmVnaXN0cnlSZWFkZXIgcmVnaXN0cnlSZWFkZXIgPSBuZXcgRGVidWdnZXJSZWdpc3RyeVJlYWRlcigpOwotCQlyZWdpc3RyeVJlYWRlci5hZGRDb25maWdzKHRoaXMpOwotCX0KLQotCXB1YmxpYyBJRGVidWdnZXIgZ2V0RGVidWdnZXIoU3RyaW5nIGlkKQotCXsKLQkJcmV0dXJuIGRlYnVnZ2Vycy5nZXQoaWQpOwotCX0KLQotCXB1YmxpYyBJRGVidWdnZXJbXSBnZXREZWJ1Z2dlcnMoKQotCXsKLQkJcmV0dXJuIGRlYnVnZ2Vycy52YWx1ZXMoKS50b0FycmF5KG5ldyBJRGVidWdnZXJbMF0pOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZERlYnVnZ2VyKERlYnVnZ2VyRGVzY3JpcHRvciBkZXNjKQotCXsKLQkJZGVidWdnZXJzLnB1dChkZXNjLmdldElkKCksIGRlc2MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9yZWdpc3RyeS9EZWJ1Z2dlclJlZ2lzdHJ5UmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvaW50ZXJuYWwvcmVnaXN0cnkvRGVidWdnZXJSZWdpc3RyeVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGI5ZWU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9yZWdpc3RyeS9EZWJ1Z2dlclJlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLmludGVybmFsLnJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLmludGVybmFsLkRlYnVnZ2VyRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLmludGVybmFsLkpBWFBMYXVuY2hpbmdQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBEZWJ1Z2dlclJlZ2lzdHJ5UmVhZGVyIGV4dGVuZHMgQWJzdHJhY3RSZWdpc3RyeVJlYWRlcgotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19ERUJVR0dFUiA9ICJkZWJ1Z2dlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTTkFNRSA9ICJjbGFzc05hbWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTUEFUSCA9ICJjbGFzc3BhdGgiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX05BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfUFJPQ0VTU09SX1RZUEVfSUQgPSAicHJvY2Vzc29yVHlwZUlkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9UUkFOU0ZPUk1FUl9GQUNUT1JZID0gInRyYW5zZm9ybWVyRmFjdG9yeUNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBEZWJ1Z2dlclJlZ2lzdHJ5IHJlZ2lzdHJ5OwotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpCi0JewotCQlpZiAoIWVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhUQUdfREVCVUdHRVIpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCVN0cmluZyBpZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9JRCk7Ci0JCWlmIChpZCA9PSBudWxsKQotCQl7Ci0JCQlsb2dNaXNzaW5nQXR0cmlidXRlKGVsZW1lbnQsIEFUVF9JRCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCVN0cmluZyBjbGFzc05hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfQ0xBU1NOQU1FKTsKLQkJaWYgKGNsYXNzTmFtZSA9PSBudWxsKQotCQl7Ci0JCQlsb2dNaXNzaW5nQXR0cmlidXRlKGVsZW1lbnQsIEFUVF9DTEFTU05BTUUpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlTdHJpbmcgY2xhc3NwYXRoID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0NMQVNTUEFUSCk7Ci0JCWlmIChjbGFzc3BhdGggPT0gbnVsbCkKLQkJewotCQkJbG9nTWlzc2luZ0F0dHJpYnV0ZShlbGVtZW50LCBBVFRfQ0xBU1NQQVRIKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJU3RyaW5nW10gZW50cmllcyA9IGNsYXNzcGF0aC5zcGxpdCgiOyIpOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykKLQkJewotCQkJU3RyaW5nIHN0cmluZyA9IGVudHJpZXNbaV07Ci0JCQllbnRyaWVzW2ldID0gc3RyaW5nLnRyaW0oKTsKLQkJfQotCi0JCVN0cmluZyBuYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX05BTUUpOwotCQlpZiAobmFtZSA9PSBudWxsKQotCQl7Ci0JCQlsb2dNaXNzaW5nQXR0cmlidXRlKGVsZW1lbnQsIEFUVF9OQU1FKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJU3RyaW5nIHByb2Nlc3NvclR5cGVJZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9QUk9DRVNTT1JfVFlQRV9JRCk7Ci0JCWlmIChwcm9jZXNzb3JUeXBlSWQgPT0gbnVsbCkKLQkJewotCQkJbG9nTWlzc2luZ0F0dHJpYnV0ZShlbGVtZW50LCBBVFRfUFJPQ0VTU09SX1RZUEVfSUQpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJU3RyaW5nIHRGYWN0ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1RSQU5TRk9STUVSX0ZBQ1RPUlkpOwotCi0JCXJlZ2lzdHJ5LmFkZERlYnVnZ2VyKG5ldyBEZWJ1Z2dlckRlc2NyaXB0b3IoaWQsIGVsZW1lbnQuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCksIGNsYXNzTmFtZSwgZW50cmllcywgbmFtZSwgcHJvY2Vzc29yVHlwZUlkLCB0RmFjdCkpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlYWRFbGVtZW50KERlYnVnZ2VyUmVnaXN0cnkgcmVnaXN0cnksIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KQotCXsKLQkJdGhpcy5yZWdpc3RyeSA9IHJlZ2lzdHJ5OwotCQlyZWFkRWxlbWVudChlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRDb25maWdzKERlYnVnZ2VyUmVnaXN0cnkgcmVnaXN0cnkpCi0JewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQl0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnk7Ci0JCXJlYWRSZWdpc3RyeShleHRlbnNpb25SZWdpc3RyeSwgSkFYUExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQsICJkZWJ1Z2dlciIpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL2ludGVybmFsL3JlZ2lzdHJ5L0ludm9rZXJSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL2ludGVybmFsL3JlZ2lzdHJ5L0ludm9rZXJSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2I4MTZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9yZWdpc3RyeS9JbnZva2VyUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuaW50ZXJuYWwucmVnaXN0cnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5JUHJvY2Vzc29ySW52b2tlcjsKLQotcHVibGljIGNsYXNzIEludm9rZXJSZWdpc3RyeQotewotCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgSVByb2Nlc3Nvckludm9rZXI+IGludm9rZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJUHJvY2Vzc29ySW52b2tlcj4oKTsKLQotCXB1YmxpYyBJbnZva2VyUmVnaXN0cnkoKQotCXsKLQkJSW52b2tlclJlZ2lzdHJ5UmVhZGVyIHJlZ2lzdHJ5UmVhZGVyID0gbmV3IEludm9rZXJSZWdpc3RyeVJlYWRlcigpOwotCQlyZWdpc3RyeVJlYWRlci5hZGRDb25maWdzKHRoaXMpOwotCX0KLQotCXB1YmxpYyBJUHJvY2Vzc29ySW52b2tlciBnZXRQcm9jZXNzb3JJbnZva2VyKFN0cmluZyBpZCkKLQl7Ci0JCXJldHVybiBpbnZva2Vycy5nZXQoaWQpOwotCX0KLQotCXB1YmxpYyBJUHJvY2Vzc29ySW52b2tlcltdIGdldFByb2Nlc3Nvckludm9rZXJzKCkKLQl7Ci0JCXJldHVybiBpbnZva2Vycy52YWx1ZXMoKS50b0FycmF5KG5ldyBJUHJvY2Vzc29ySW52b2tlclswXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkSW52b2tlckRlc2NyaXB0b3IoSVByb2Nlc3Nvckludm9rZXIgZGVzYykKLQl7Ci0JCWludm9rZXJzLnB1dChkZXNjLmdldElkKCksIGRlc2MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9yZWdpc3RyeS9JbnZva2VyUmVnaXN0cnlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9yZWdpc3RyeS9JbnZva2VyUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjllNjEzNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvaW50ZXJuYWwvcmVnaXN0cnkvSW52b2tlclJlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLmludGVybmFsLnJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLmludGVybmFsLkpBWFBMYXVuY2hpbmdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5pbnRlcm5hbC5Qcm9jZXNzb3JJbnZva2VyRGVzY3JpcHRvcjsKLQotcHVibGljIGNsYXNzIEludm9rZXJSZWdpc3RyeVJlYWRlciBleHRlbmRzIEFic3RyYWN0UmVnaXN0cnlSZWFkZXIKLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfSU5WT0tFID0gImludm9rZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfQ0xBU1NQQVRIID0gImNsYXNzcGF0aCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSW52b2tlclJlZ2lzdHJ5IHJlZ2lzdHJ5OwotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpCi0JewotCQlpZiAoIWVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhUQUdfSU5WT0tFKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlTdHJpbmcgaWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfSUQpOwotCQlpZiAoaWQgPT0gbnVsbCkKLQkJewotCQkJbG9nTWlzc2luZ0F0dHJpYnV0ZShlbGVtZW50LCBBVFRfSUQpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlTdHJpbmcgY2xhc3NuYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0NMQVNTKTsKLQkJaWYgKGNsYXNzbmFtZSA9PSBudWxsKQotCQl7Ci0JCQlsb2dNaXNzaW5nQXR0cmlidXRlKGVsZW1lbnQsIEFUVF9DTEFTUyk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCVN0cmluZyBjbGFzc3BhdGggPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfQ0xBU1NQQVRIKTsKLQkJaWYgKGNsYXNzcGF0aCA9PSBudWxsKQotCQl7Ci0JCQlsb2dNaXNzaW5nQXR0cmlidXRlKGVsZW1lbnQsIEFUVF9DTEFTU1BBVEgpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlTdHJpbmdbXSBlbnRyaWVzID0gY2xhc3NwYXRoLnNwbGl0KCI7Iik7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKQotCQl7Ci0JCQlTdHJpbmcgc3RyaW5nID0gZW50cmllc1tpXTsKLQkJCWVudHJpZXNbaV0gPSBzdHJpbmcudHJpbSgpOwotCQl9Ci0KLQkJcmVnaXN0cnkuYWRkSW52b2tlckRlc2NyaXB0b3IobmV3IFByb2Nlc3Nvckludm9rZXJEZXNjcmlwdG9yKGlkLCBlbGVtZW50LmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpLCBjbGFzc25hbWUsIGVudHJpZXMpKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWFkRWxlbWVudChJbnZva2VyUmVnaXN0cnkgcmVnaXN0cnksIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KQotCXsKLQkJdGhpcy5yZWdpc3RyeSA9IHJlZ2lzdHJ5OwotCQlyZWFkRWxlbWVudChlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRDb25maWdzKEludm9rZXJSZWdpc3RyeSByZWdpc3RyeSkKLQl7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCXRoaXMucmVnaXN0cnkgPSByZWdpc3RyeTsKLQkJcmVhZFJlZ2lzdHJ5KGV4dGVuc2lvblJlZ2lzdHJ5LCBKQVhQTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCwgImludm9rZSIpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL2ludGVybmFsL3JlZ2lzdHJ5L1Byb2Nlc3NvclJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvaW50ZXJuYWwvcmVnaXN0cnkvUHJvY2Vzc29yUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RkNDAwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvaW50ZXJuYWwvcmVnaXN0cnkvUHJvY2Vzc29yUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLmludGVybmFsLnJlZ2lzdHJ5OwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuSVByb2Nlc3Nvckluc3RhbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5JUHJvY2Vzc29ySmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuSkFYUFJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5Qcm9jZXNzb3JJbnN0YWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuaW50ZXJuYWwuSkFYUExhdW5jaGluZ1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLmludGVybmFsLlByb2Nlc3NvclByZWZlcmVuY2VzOwotCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc29yUmVnaXN0cnkKLXsKLQlwcml2YXRlIGZpbmFsIExpc3Q8UHJvY2Vzc29ySW5zdGFsbD4gY29udHJpYnV0ZWRJbnN0YWxscyA9IG5ldyBBcnJheUxpc3Q8UHJvY2Vzc29ySW5zdGFsbD4oKTsKLQlwcml2YXRlIExpc3Q8SVByb2Nlc3Nvckluc3RhbGw+IHVzZXJJbnN0YWxscyA9IG5ldyBBcnJheUxpc3Q8SVByb2Nlc3Nvckluc3RhbGw+KCk7Ci0JcHJpdmF0ZSBJUHJvY2Vzc29ySW5zdGFsbCBkZWZhdWx0UHJvY2Vzc29yOwotCXByaXZhdGUgSVByb2Nlc3Nvckluc3RhbGwganJlRGVmYXVsdFByb2Nlc3NvcjsKLQlwcml2YXRlIElQcm9jZXNzb3JJbnN0YWxsW10gaW5zdGFsbHM7Ci0KLQlwdWJsaWMgUHJvY2Vzc29yUmVnaXN0cnkoKQotCXsKLQkJaW5pdGlhbGl6ZUZyb21TdG9yYWdlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVGcm9tU3RvcmFnZSgpCi0JewotCQkvLyByZWFkIGZyb20gdGhlIHJlZ2lzdHJ5Ci0JCVByb2Nlc3NvclJlZ2lzdHJ5UmVhZGVyIHJlZ2lzdHJ5UmVhZGVyID0gbmV3IFByb2Nlc3NvclJlZ2lzdHJ5UmVhZGVyKCk7Ci0JCXJlZ2lzdHJ5UmVhZGVyLmFkZENvbmZpZ3ModGhpcyk7Ci0JCS8vIGZpbmQgdGhlIGpyZSBkZWZhdWx0Ci0JCWZvciAoSXRlcmF0b3I8UHJvY2Vzc29ySW5zdGFsbD4gaXRlciA9IGNvbnRyaWJ1dGVkSW5zdGFsbHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotCQl7Ci0JCQlJUHJvY2Vzc29ySW5zdGFsbCBpbnN0YWxsID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoaW5zdGFsbC5nZXRJZCgpLmVxdWFscyhKQVhQUnVudGltZS5KUkVfREVGQVVMVF9QUk9DRVNTT1JfSUQpKQotCQkJewotCQkJCWpyZURlZmF1bHRQcm9jZXNzb3IgPSBpbnN0YWxsOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCS8vIHJlYWQgZnJvbSB0aGUgcHJlZmVyZW5jZXMKLQkJYWRkUGVyc2lzdGVkVk1zKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFBlcnNpc3RlZFZNcygpCi0JewotCQkvLyBUcnkgcmV0cmlldmluZyB0aGUgVk0gcHJlZmVyZW5jZXMgZnJvbSB0aGUgcHJlZmVyZW5jZSBzdG9yZQotCQlTdHJpbmcgdm1YTUxTdHJpbmcgPSBKQVhQTGF1bmNoaW5nUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldFN0cmluZyhKQVhQUnVudGltZS5QUkVGX1BST0NFU1NPUl9YTUwpOwotCi0JCS8vIElmIHRoZSBwcmVmZXJlbmNlIHdhcyBmb3VuZCwgbG9hZCBWTXMgZnJvbSBpdCBpbnRvIG1lbW9yeQotCQlpZiAodm1YTUxTdHJpbmcubGVuZ3RoKCkgPiAwKQotCQl7Ci0JCQl0cnkKLQkJCXsKLQkJCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh2bVhNTFN0cmluZy5nZXRCeXRlcygpKTsKLQkJCQlQcm9jZXNzb3JQcmVmZXJlbmNlcyBwcmVmcyA9IFByb2Nlc3NvclByZWZlcmVuY2VzLmZyb21YTUwoaW5wdXRTdHJlYW0pOwotCQkJCVN0cmluZyBkZWZhdWx0UHJvY2Vzc29ySWQgPSBwcmVmcy5nZXREZWZhdWx0UHJvY2Vzc29ySWQoKTsKLQkJCQl1c2VySW5zdGFsbHMgPSBwcmVmcy5nZXRQcm9jZXNzb3JzKCk7Ci0JCQkJZm9yIChJdGVyYXRvcjxJUHJvY2Vzc29ySW5zdGFsbD4gaXRlciA9IHVzZXJJbnN0YWxscy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0JCQkJewotCQkJCQlJUHJvY2Vzc29ySW5zdGFsbCBpbnN0YWxsID0gaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChpbnN0YWxsLmdldElkKCkuZXF1YWxzKGRlZmF1bHRQcm9jZXNzb3JJZCkpCi0JCQkJCXsKLQkJCQkJCWRlZmF1bHRQcm9jZXNzb3IgPSBpbnN0YWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChkZWZhdWx0UHJvY2Vzc29yID09IG51bGwpCi0JCQkJewotCQkJCQlmb3IgKEl0ZXJhdG9yPFByb2Nlc3Nvckluc3RhbGw+IGl0ZXIgPSBjb250cmlidXRlZEluc3RhbGxzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLQkJCQkJewotCQkJCQkJSVByb2Nlc3Nvckluc3RhbGwgaW5zdGFsbCA9IGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKGRlZmF1bHRQcm9jZXNzb3IgPT0gbnVsbCAmJiBpbnN0YWxsLmdldElkKCkuZXF1YWxzKGRlZmF1bHRQcm9jZXNzb3JJZCkpCi0JCQkJCQl7Ci0JCQkJCQkJZGVmYXVsdFByb2Nlc3NvciA9IGluc3RhbGw7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotCQkJewotCQkJCUpBWFBMYXVuY2hpbmdQbHVnaW4ubG9nKGUpOwotCQkJfQotCQl9Ci0JCS8vIG1ha2UgdGhlIEpSRSB0aGUgZGVmYXVsdCBkZWZhdWx0Ci0JCWlmIChkZWZhdWx0UHJvY2Vzc29yID09IG51bGwpCi0JCXsKLQkJCWRlZmF1bHRQcm9jZXNzb3IgPSBqcmVEZWZhdWx0UHJvY2Vzc29yOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUHJvY2Vzc29yKFN0cmluZyBidW5kbGVJZCwgU3RyaW5nIGlkLCBTdHJpbmcgbGFiZWwsIFN0cmluZyBwcm9jZXNzb3JUeXBlSWQsIFN0cmluZyBjbGFzc3BhdGgsIFN0cmluZyBkZWJ1Z2dlcklkLCBTdHJpbmcgc3VwcG9ydHMpCi0JewotCQlJUHJvY2Vzc29ySmFyW10gamFycyA9IFByb2Nlc3Nvckluc3RhbGwuY3JlYXRlSmFycyhidW5kbGVJZCwgY2xhc3NwYXRoKTsKLQkJY29udHJpYnV0ZWRJbnN0YWxscy5hZGQobmV3IFByb2Nlc3Nvckluc3RhbGwoaWQsIGxhYmVsLCBwcm9jZXNzb3JUeXBlSWQsIGphcnMsIGRlYnVnZ2VySWQsIHN1cHBvcnRzLCB0cnVlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUHJvY2Vzc29yKElQcm9jZXNzb3JJbnN0YWxsIGluc3RhbGwpCi0JewotCQlpZiAoIWluc3RhbGwuaXNDb250cmlidXRlZCgpKQotCQkJdXNlckluc3RhbGxzLmFkZChpbnN0YWxsKTsKLQkJSVByb2Nlc3Nvckluc3RhbGxbXSBuZXdpbnN0YWxscyA9IG5ldyBJUHJvY2Vzc29ySW5zdGFsbFtpbnN0YWxscy5sZW5ndGggKyAxXTsKLQkJU3lzdGVtLmFycmF5Y29weShpbnN0YWxscywgMCwgbmV3aW5zdGFsbHMsIDAsIGluc3RhbGxzLmxlbmd0aCk7Ci0JCW5ld2luc3RhbGxzW2luc3RhbGxzLmxlbmd0aF0gPSBpbnN0YWxsOwotCQlpbnN0YWxscyA9IG5ld2luc3RhbGxzOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVByb2Nlc3NvcihpbnQgaW5kZXgpCi0JewotCQlJUHJvY2Vzc29ySW5zdGFsbCByZW1vdmVkID0gaW5zdGFsbHNbaW5kZXhdOwotCQlpZiAoIXJlbW92ZWQuaXNDb250cmlidXRlZCgpKQotCQkJdXNlckluc3RhbGxzLnJlbW92ZShyZW1vdmVkKTsKLQkJSVByb2Nlc3Nvckluc3RhbGxbXSBuZXdpbnN0YWxscyA9IG5ldyBJUHJvY2Vzc29ySW5zdGFsbFtpbnN0YWxscy5sZW5ndGggLSAxXTsKLQkJU3lzdGVtLmFycmF5Y29weShpbnN0YWxscywgMCwgbmV3aW5zdGFsbHMsIDAsIGluZGV4KTsKLQkJU3lzdGVtLmFycmF5Y29weShpbnN0YWxscywgaW5kZXggKyAxLCBuZXdpbnN0YWxscywgaW5kZXgsIG5ld2luc3RhbGxzLmxlbmd0aCAtIGluZGV4KTsKLQkJaW5zdGFsbHMgPSBuZXdpbnN0YWxsczsKLQl9Ci0KLQlwdWJsaWMgSVByb2Nlc3Nvckluc3RhbGxbXSBnZXRQcm9jZXNzb3JzKCkKLQl7Ci0JCWlmIChpbnN0YWxscyA9PSBudWxsKQotCQl7Ci0JCQlpbnN0YWxscyA9IG5ldyBJUHJvY2Vzc29ySW5zdGFsbFtjb250cmlidXRlZEluc3RhbGxzLnNpemUoKSArIHVzZXJJbnN0YWxscy5zaXplKCldOwotCQkJaW50IHN0YXJ0SW5kZXggPSAwOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250cmlidXRlZEluc3RhbGxzLnNpemUoKTsgaSsrKQotCQkJewotCQkJCWluc3RhbGxzW2ldID0gY29udHJpYnV0ZWRJbnN0YWxscy5nZXQoaSk7Ci0JCQkJc3RhcnRJbmRleCA9IGkgKyAxOwotCQkJfQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1c2VySW5zdGFsbHMuc2l6ZSgpOyBpKyspCi0JCQl7Ci0JCQkJaW5zdGFsbHNbc3RhcnRJbmRleCArIGldID0gdXNlckluc3RhbGxzLmdldChpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5zdGFsbHM7Ci0JfQotCi0JcHVibGljIElQcm9jZXNzb3JJbnN0YWxsW10gZ2V0UHJvY2Vzc29ycyhTdHJpbmcgaWQpCi0JewotCQlJUHJvY2Vzc29ySW5zdGFsbFtdIGluc3RhbGxzID0gZ2V0UHJvY2Vzc29ycygpOwotCQlMaXN0PElQcm9jZXNzb3JJbnN0YWxsPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PElQcm9jZXNzb3JJbnN0YWxsPigpOwotCQlmb3IgKElQcm9jZXNzb3JJbnN0YWxsIHR5cGUgOiBpbnN0YWxscykKLQkJewotCQkJaWYgKHR5cGUuZ2V0UHJvY2Vzc29yVHlwZSgpLmdldElkKCkuZXF1YWxzKGlkKSkKLQkJCQlyZXN1bHQuYWRkKHR5cGUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQudG9BcnJheShuZXcgSVByb2Nlc3Nvckluc3RhbGxbMF0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRQcm9jZXNzb3IoSVByb2Nlc3Nvckluc3RhbGwgZGVmYXVsdEluc3RhbGwpCi0JewotCQlkZWZhdWx0UHJvY2Vzc29yID0gZGVmYXVsdEluc3RhbGw7Ci0JfQotCi0JcHVibGljIElQcm9jZXNzb3JJbnN0YWxsIGdldERlZmF1bHRQcm9jZXNzb3IoKQotCXsKLQkJcmV0dXJuIGRlZmF1bHRQcm9jZXNzb3I7Ci0JfQotCi0JcHVibGljIElQcm9jZXNzb3JJbnN0YWxsIGdldEpSRURlZmF1bHRQcm9jZXNzb3IoKQotCXsKLQkJcmV0dXJuIGpyZURlZmF1bHRQcm9jZXNzb3I7Ci0JfQotCi0JcHVibGljIElQcm9jZXNzb3JJbnN0YWxsW10gZ2V0Q29udHJpYnV0ZWRQcm9jZXNzb3JzKCkKLQl7Ci0JCXJldHVybiBjb250cmlidXRlZEluc3RhbGxzLnRvQXJyYXkobmV3IElQcm9jZXNzb3JJbnN0YWxsWzBdKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvaW50ZXJuYWwvcmVnaXN0cnkvUHJvY2Vzc29yUmVnaXN0cnlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9yZWdpc3RyeS9Qcm9jZXNzb3JSZWdpc3RyeVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmUzZDMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9yZWdpc3RyeS9Qcm9jZXNzb3JSZWdpc3RyeVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5pbnRlcm5hbC5yZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5pbnRlcm5hbC5KQVhQTGF1bmNoaW5nUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc29yUmVnaXN0cnlSZWFkZXIgZXh0ZW5kcyBBYnN0cmFjdFJlZ2lzdHJ5UmVhZGVyCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX3Byb2Nlc3NvciA9ICJwcm9jZXNzb3IiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9MQUJFTCA9ICJsYWJlbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfVFlQRV9JRCA9ICJwcm9jZXNzb3JUeXBlSWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0RFQlVHR0VSX0lEID0gImRlYnVnZ2VySWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTUEFUSCA9ICJjbGFzc3BhdGgiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1NVUFBPUlRTID0gInN1cHBvcnRzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBQcm9jZXNzb3JSZWdpc3RyeSByZWdpc3RyeTsKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KQotCXsKLQkJaWYgKCFlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoVEFHX3Byb2Nlc3NvcikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJU3RyaW5nIGlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0lEKTsKLQkJaWYgKGlkID09IG51bGwpCi0JCXsKLQkJCWxvZ01pc3NpbmdBdHRyaWJ1dGUoZWxlbWVudCwgQVRUX0lEKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJU3RyaW5nIGxhYmVsID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0xBQkVMKTsKLQkJaWYgKGxhYmVsID09IG51bGwpCi0JCXsKLQkJCWxvZ01pc3NpbmdBdHRyaWJ1dGUoZWxlbWVudCwgQVRUX0xBQkVMKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJU3RyaW5nIHByb2Nlc3NvclR5cGVJZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9UWVBFX0lEKTsKLQkJaWYgKHByb2Nlc3NvclR5cGVJZCA9PSBudWxsKQotCQl7Ci0JCQlsb2dNaXNzaW5nQXR0cmlidXRlKGVsZW1lbnQsIEFUVF9UWVBFX0lEKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJU3RyaW5nIGNsYXNzcGF0aCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9DTEFTU1BBVEgpOwotCQlpZiAoY2xhc3NwYXRoID09IG51bGwpCi0JCXsKLQkJCWxvZ01pc3NpbmdBdHRyaWJ1dGUoZWxlbWVudCwgQVRUX0NMQVNTUEFUSCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCVN0cmluZyBkZWJ1Z2dlcklkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0RFQlVHR0VSX0lEKTsKLQotCQlTdHJpbmcgc3VwcG9ydHMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfU1VQUE9SVFMpOwotCQlpZiAoY2xhc3NwYXRoID09IG51bGwpCi0JCXsKLQkJCWxvZ01pc3NpbmdBdHRyaWJ1dGUoZWxlbWVudCwgQVRUX1NVUFBPUlRTKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcmVnaXN0cnkuYWRkUHJvY2Vzc29yKGVsZW1lbnQuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCksIGlkLCBsYWJlbCwgcHJvY2Vzc29yVHlwZUlkLCBjbGFzc3BhdGgsIGRlYnVnZ2VySWQsIHN1cHBvcnRzKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWFkRWxlbWVudChQcm9jZXNzb3JSZWdpc3RyeSByZWdpc3RyeSwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpCi0JewotCQl0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnk7Ci0JCXJlYWRFbGVtZW50KGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZENvbmZpZ3MoUHJvY2Vzc29yUmVnaXN0cnkgcmVnaXN0cnkpCi0JewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQl0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnk7Ci0JCXJlYWRSZWdpc3RyeShleHRlbnNpb25SZWdpc3RyeSwgSkFYUExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQsICJwcm9jZXNzb3IiKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9yZWdpc3RyeS9Qcm9jZXNzb3JUeXBlUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9yZWdpc3RyeS9Qcm9jZXNzb3JUeXBlUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVmZjQ0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvaW50ZXJuYWwvcmVnaXN0cnkvUHJvY2Vzc29yVHlwZVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5pbnRlcm5hbC5yZWdpc3RyeTsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5JUHJvY2Vzc29yVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLklUcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5KQVhQUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLmludGVybmFsLkZlYXR1cmVQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLmludGVybmFsLkpBWFBMYXVuY2hpbmdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5pbnRlcm5hbC5PdXRwdXRQcm9wZXJ0eVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuaW50ZXJuYWwuUHJvY2Vzc29yVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLmludGVybmFsLlRyYW5zZm9ybWVyRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFByb2Nlc3NvclR5cGVSZWdpc3RyeQotewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NfU1VGRklYID0gIi5ERVNDIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfU1VGRklYID0gIi5UWVBFIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBmaW5hbCBMaXN0PElDb25maWd1cmF0aW9uRWxlbWVudD4gZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PElDb25maWd1cmF0aW9uRWxlbWVudD4oKTsKLQlwcml2YXRlIElQcm9jZXNzb3JUeXBlW10gaW5zdGFsbFR5cGVzOwotCi0JcHVibGljIFByb2Nlc3NvclR5cGVSZWdpc3RyeSgpCi0JewotCQlQcm9jZXNzb3JUeXBlUmVnaXN0cnlSZWFkZXIgcmVnaXN0cnlSZWFkZXIgPSBuZXcgUHJvY2Vzc29yVHlwZVJlZ2lzdHJ5UmVhZGVyKCk7Ci0JCXJlZ2lzdHJ5UmVhZGVyLmFkZENvbmZpZ3ModGhpcyk7Ci0JfQotCi0JcHVibGljIElQcm9jZXNzb3JUeXBlW10gZ2V0UHJvY2Vzc29yVHlwZXMoKQotCXsKLQkJaWYgKGluc3RhbGxUeXBlcyA9PSBudWxsKQotCQl7Ci0JCQlMaXN0PFByb2Nlc3NvclR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxQcm9jZXNzb3JUeXBlPigpOwotCQkJU3RyaW5nIGZlYXR1cmVYTUxTdHJpbmcgPSBKQVhQTGF1bmNoaW5nUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldFN0cmluZyhKQVhQUnVudGltZS5QUkVGX0ZFQVRVUkVfWE1MKTsKLQkJCS8vIElmIHRoZSBwcmVmZXJlbmNlIHdhcyBmb3VuZCwgbG9hZCBWTXMgZnJvbSBpdCBpbnRvIG1lbW9yeQotCQkJRmVhdHVyZVByZWZlcmVuY2VzIHByZWZzID0gbnVsbDsKLQkJCWlmIChmZWF0dXJlWE1MU3RyaW5nLmxlbmd0aCgpID4gMCkKLQkJCXsKLQkJCQl0cnkKLQkJCQl7Ci0JCQkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGZlYXR1cmVYTUxTdHJpbmcuZ2V0Qnl0ZXMoKSk7Ci0JCQkJCXByZWZzID0gRmVhdHVyZVByZWZlcmVuY2VzLmZyb21YTUwoaW5wdXRTdHJlYW0pOwotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotCQkJCXsKLQkJCQkJSkFYUExhdW5jaGluZ1BsdWdpbi5sb2coZSk7Ci0JCQkJfQotCQkJfQotCi0JCQlTdHJpbmcgcHJvcFhNTFN0cmluZyA9IEpBWFBMYXVuY2hpbmdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKEpBWFBSdW50aW1lLlBSRUZfT1VUUFVUX1BST1BFUlRJRVNfWE1MKTsKLQkJCS8vIElmIHRoZSBwcmVmZXJlbmNlIHdhcyBmb3VuZCwgbG9hZCBWTXMgZnJvbSBpdCBpbnRvIG1lbW9yeQotCQkJT3V0cHV0UHJvcGVydHlQcmVmZXJlbmNlcyBvdXRwdXRwcmVmcyA9IG51bGw7Ci0JCQlpZiAocHJvcFhNTFN0cmluZy5sZW5ndGgoKSA+IDApCi0JCQl7Ci0JCQkJdHJ5Ci0JCQkJewotCQkJCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShwcm9wWE1MU3RyaW5nLmdldEJ5dGVzKCkpOwotCQkJCQlvdXRwdXRwcmVmcyA9IE91dHB1dFByb3BlcnR5UHJlZmVyZW5jZXMuZnJvbVhNTChpbnB1dFN0cmVhbSk7Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JCQkJewotCQkJCQlKQVhQTGF1bmNoaW5nUGx1Z2luLmxvZyhlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWZvciAoSXRlcmF0b3I8SUNvbmZpZ3VyYXRpb25FbGVtZW50PiBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotCQkJewotCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJU3RyaW5nIGlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoUHJvY2Vzc29yVHlwZVJlZ2lzdHJ5UmVhZGVyLkFUVF9JRCk7Ci0JCQkJU3RyaW5nIGxhYmVsID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoUHJvY2Vzc29yVHlwZVJlZ2lzdHJ5UmVhZGVyLkFUVF9MQUJFTCk7Ci0JCQkJTWFwPFN0cmluZywgU3RyaW5nPiBmZWF0dXJlVmFsdWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCQkJTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0eVZhbHVlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCQkJCWlmIChwcmVmcyAhPSBudWxsICYmIHByZWZzLmdldEZlYXR1cmVzVmFsdWVzKGlkKSAhPSBudWxsKQotCQkJCQlmZWF0dXJlVmFsdWVzLnB1dEFsbChwcmVmcy5nZXRGZWF0dXJlc1ZhbHVlcyhpZCkpOwotCQkJCWlmIChvdXRwdXRwcmVmcyAhPSBudWxsICYmIG91dHB1dHByZWZzLmdldE91dHB1dFByb3BlcnR5VmFsdWVzKGlkKSAhPSBudWxsKQotCQkJCQlwcm9wZXJ0eVZhbHVlcy5wdXRBbGwob3V0cHV0cHJlZnMuZ2V0T3V0cHV0UHJvcGVydHlWYWx1ZXMoaWQpKTsKLQotCQkJCVN0cmluZyBvdXRwdXRQcm9wZXJ0aWVzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoUHJvY2Vzc29yVHlwZVJlZ2lzdHJ5UmVhZGVyLkFUVF9PVVRQVVRfUFJPUEVSVElFUyk7Ci0JCQkJVVJMIG91dHB1dFByb3BlcnRpZXNVUkwgPSBGaWxlTG9jYXRvci5maW5kKFBsYXRmb3JtLmdldEJ1bmRsZShlbGVtZW50LmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpKSwgbmV3IFBhdGgob3V0cHV0UHJvcGVydGllcyksIG51bGwpOwotCQkJCVN0cmluZyBmZWF0dXJlUHJvcGVydGllcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFByb2Nlc3NvclR5cGVSZWdpc3RyeVJlYWRlci5BVFRfQVRUUklCVVRFX1BST1BFUlRJRVMpOwotCQkJCVVSTCBmZWF0dXJlUHJvcGVydGllc1VSTCA9IEZpbGVMb2NhdG9yLmZpbmQoUGxhdGZvcm0uZ2V0QnVuZGxlKGVsZW1lbnQuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkpLCBuZXcgUGF0aChmZWF0dXJlUHJvcGVydGllcyksIG51bGwpOwotCQkJCQotCQkJCUxpc3Q8SVRyYW5zZm9ybWVyRmFjdG9yeT4gdHJhbnNGYWN0b3J5TGlzdCA9IG5ldyBBcnJheUxpc3Q8SVRyYW5zZm9ybWVyRmFjdG9yeT4oKTsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSB0cmFuc0ZhY3RFbHMgPSBlbGVtZW50LmdldENoaWxkcmVuKFByb2Nlc3NvclR5cGVSZWdpc3RyeVJlYWRlci5FTF9UUkFOU0ZPUk1FUl9GQUNUT1JZKTsKLQkJCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCB0cmFuc0ZhY3RFbCA6IHRyYW5zRmFjdEVscykKLQkJCQl7Ci0JCQkJCVN0cmluZyB0cmFuc0ZhY3RvcnlOYW1lID0gdHJhbnNGYWN0RWwuZ2V0QXR0cmlidXRlKFByb2Nlc3NvclR5cGVSZWdpc3RyeVJlYWRlci5BVFRfVFJBTlNGT1JNRVJfRkFDVE9SWV9OQU1FKTsKLQkJCQkJU3RyaW5nIHRyYW5zRmFjdG9yeUNsYXNzID0gdHJhbnNGYWN0RWwuZ2V0QXR0cmlidXRlKFByb2Nlc3NvclR5cGVSZWdpc3RyeVJlYWRlci5BVFRfVFJBTlNGT1JNRVJfRkFDVE9SWV9DTEFTUyk7Ci0JCQkJCXRyYW5zRmFjdG9yeUxpc3QuYWRkKG5ldyBUcmFuc2Zvcm1lckZhY3RvcnkodHJhbnNGYWN0b3J5TmFtZSx0cmFuc0ZhY3RvcnlDbGFzcykpOwotCQkJCX0KLQkJCQkKLQkJCQl0eXBlcy5hZGQobmV3IFByb2Nlc3NvclR5cGUoaWQsIGxhYmVsLCBmZWF0dXJlUHJvcGVydGllc1VSTCwgb3V0cHV0UHJvcGVydGllc1VSTCwgZmVhdHVyZVZhbHVlcywgcHJvcGVydHlWYWx1ZXMsIHRyYW5zRmFjdG9yeUxpc3QudG9BcnJheShuZXcgSVRyYW5zZm9ybWVyRmFjdG9yeVswXSkpKTsKLQkJCX0KLQkJCWluc3RhbGxUeXBlcyA9IHR5cGVzLnRvQXJyYXkobmV3IElQcm9jZXNzb3JUeXBlWzBdKTsKLQkJfQotCQlyZXR1cm4gaW5zdGFsbFR5cGVzOwotCX0KLQotCXB1YmxpYyBJUHJvY2Vzc29yVHlwZVtdIGdldFByb2Nlc3NvclR5cGVzRXhjbEpSRURlZmF1bHQoKQotCXsKLQkJSVByb2Nlc3NvclR5cGVbXSBpbnN0YWxsVHlwZXMgPSBnZXRQcm9jZXNzb3JUeXBlcygpOwotCQlMaXN0PElQcm9jZXNzb3JUeXBlPiBleGNsVHlwZXMgPSBuZXcgQXJyYXlMaXN0PElQcm9jZXNzb3JUeXBlPihpbnN0YWxsVHlwZXMubGVuZ3RoIC0gMSk7Ci0JCWZvciAoSVByb2Nlc3NvclR5cGUgdHlwZSA6IGluc3RhbGxUeXBlcykKLQkJewotCQkJaWYgKCF0eXBlLmlzSlJFRGVmYXVsdCgpKQotCQkJCWV4Y2xUeXBlcy5hZGQodHlwZSk7Ci0JCX0KLQkJcmV0dXJuIGV4Y2xUeXBlcy50b0FycmF5KG5ldyBJUHJvY2Vzc29yVHlwZVswXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkVHlwZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKLQl7Ci0JCWVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgSVByb2Nlc3NvclR5cGUgZ2V0UHJvY2Vzc29yVHlwZShTdHJpbmcgaWQpCi0JewotCQlJUHJvY2Vzc29yVHlwZVtdIGluc3RhbGxUeXBlcyA9IGdldFByb2Nlc3NvclR5cGVzKCk7Ci0JCWZvciAoSVByb2Nlc3NvclR5cGUgdHlwZSA6IGluc3RhbGxUeXBlcykKLQkJewotCQkJaWYgKHR5cGUuZ2V0SWQoKS5lcXVhbHMoaWQpKQotCQkJCXJldHVybiB0eXBlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9yZWdpc3RyeS9Qcm9jZXNzb3JUeXBlUmVnaXN0cnlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9pbnRlcm5hbC9yZWdpc3RyeS9Qcm9jZXNzb3JUeXBlUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAxZTJmNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvaW50ZXJuYWwvcmVnaXN0cnkvUHJvY2Vzc29yVHlwZVJlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLmludGVybmFsLnJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLmludGVybmFsLkpBWFBMYXVuY2hpbmdQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBQcm9jZXNzb3JUeXBlUmVnaXN0cnlSZWFkZXIgZXh0ZW5kcyBBYnN0cmFjdFJlZ2lzdHJ5UmVhZGVyCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX3Byb2Nlc3NvclR5cGUgPSAicHJvY2Vzc29yVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0xBQkVMID0gImxhYmVsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9PVVRQVVRfUFJPUEVSVElFUyA9ICJvdXRwdXRQcm9wZXJ0aWVzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9BVFRSSUJVVEVfUFJPUEVSVElFUyA9ICJhdHRyaWJ1dGVQcm9wZXJ0aWVzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMX1RSQU5TRk9STUVSX0ZBQ1RPUlkgPSAidHJhbnNmb3JtZXJGYWN0b3J5IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfVFJBTlNGT1JNRVJfRkFDVE9SWV9OQU1FID0gIm5hbWUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9UUkFOU0ZPUk1FUl9GQUNUT1JZX0NMQVNTID0gImZhY3RvcnlDbGFzcyI7Ci0KLQlwcml2YXRlIFByb2Nlc3NvclR5cGVSZWdpc3RyeSByZWdpc3RyeTsKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KQotCXsKLQkJaWYgKCFlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoVEFHX3Byb2Nlc3NvclR5cGUpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCVN0cmluZyBpZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9JRCk7Ci0JCWlmIChpZCA9PSBudWxsKQotCQl7Ci0JCQlsb2dNaXNzaW5nQXR0cmlidXRlKGVsZW1lbnQsIEFUVF9JRCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCVN0cmluZyBsYWJlbCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9MQUJFTCk7Ci0JCWlmIChsYWJlbCA9PSBudWxsKQotCQl7Ci0JCQlsb2dNaXNzaW5nQXR0cmlidXRlKGVsZW1lbnQsIEFUVF9MQUJFTCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCVN0cmluZyBvdXRwdXRQcm9wZXJ0aWVzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX09VVFBVVF9QUk9QRVJUSUVTKTsKLQkJaWYgKG91dHB1dFByb3BlcnRpZXMgPT0gbnVsbCkKLQkJewotCQkJbG9nTWlzc2luZ0F0dHJpYnV0ZShlbGVtZW50LCBBVFRfT1VUUFVUX1BST1BFUlRJRVMpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlTdHJpbmcgZmVhdHVyZVByb3BlcnRpZXMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfQVRUUklCVVRFX1BST1BFUlRJRVMpOwotCQlpZiAoZmVhdHVyZVByb3BlcnRpZXMgPT0gbnVsbCkKLQkJewotCQkJbG9nTWlzc2luZ0F0dHJpYnV0ZShlbGVtZW50LCBBVFRfQVRUUklCVVRFX1BST1BFUlRJRVMpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlyZWdpc3RyeS5hZGRUeXBlKGVsZW1lbnQpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlYWRFbGVtZW50KFByb2Nlc3NvclR5cGVSZWdpc3RyeSByZWdpc3RyeSwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpCi0JewotCQl0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnk7Ci0JCXJlYWRFbGVtZW50KGVsZW1lbnQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZENvbmZpZ3MoUHJvY2Vzc29yVHlwZVJlZ2lzdHJ5IHJlZ2lzdHJ5KQotCXsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJdGhpcy5yZWdpc3RyeSA9IHJlZ2lzdHJ5OwotCQlyZWFkUmVnaXN0cnkoZXh0ZW5zaW9uUmVnaXN0cnksIEpBWFBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lELCAicHJvY2Vzc29yVHlwZSIpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2pheHAvbGF1bmNoaW5nL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI3ZWUzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLVhTTFRSdW50aW1lXzEwPUZhaWxlZCB0byBzYXZlIHByb2Nlc3MgcHJlZmVyZW5jZXMKLVhTTFRSdW50aW1lXzU9U2F2aW5nIGF0dHJpYnV0ZXMuLi4KLVhTTFRSdW50aW1lXzY9RmFpbGVkIHRvIHNhdmUgYXR0cmlidXRlIHByZWZlcmVuY2VzCi1YU0xUUnVudGltZV83PVNhdmluZyBwcm9wZXJ0aWVzLi4uCi1YU0xUUnVudGltZV84PUZhaWxlZCB0byBzYXZlIG91dHB1dCBwcm9wZXJ0eSBwcmVmZXJlbmNlcwotWFNMVFJ1bnRpbWVfOT1TYXZpbmcgcHJvY2Vzc29ycy4uLgotCi1BdHRyaWJ1dGVfMD1WYWx1ZSBtdXN0IGJlIGEgZG91YmxlCi1BdHRyaWJ1dGVfMT1WYWx1ZSBtdXN0IGJlIGFuIGludGVnZXIKLUF0dHJpYnV0ZV8yPVZhbGlkIHZhbHVlcyBhcmUgJ3RydWUnIG9yICdmYWxzZScKLUF0dHJpYnV0ZV81PVZhbHVlIG11c3QgYmUgYSBmbG9hdAotUGx1Z2luUHJvY2Vzc29ySmFyXzA9LCBwYXRoIAotUHJvY2Vzc29yVHlwZV8yPU91dHB1dCBwcm9wZXJ0aWVzIGZpbGUgCi1Qcm9jZXNzb3JUeXBlXzM9XCBub3QgY29uZmlndXJlZCBwcm9wZXJseSBmb3Iga2V5IAotUHJvY2Vzc29yVHlwZV80PUF0dHJpYnV0ZSBwcm9wZXJ0aWVzIGZpbGUgCi1Qcm9jZXNzb3JUeXBlXzU9XCBub3QgY29uZmlndXJlZCBwcm9wZXJseSBmb3Iga2V5IAotVXRpbHNfMD1FcnJvciBkZXRlcm1pbmluZyBqYXIgZmlsZSBsb2NhdGlvbjogCi1VdGlsc18xPVwgZnJvbSBidW5kbGU6IAotWFNMVExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZV8wPVN3aXRjaCB0byBEZWZhdWx0IERlYnVnZ2VyCi1YU0xUTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlXzE9VGhlIAotWFNMVExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZV8yPVwgWFNMVCBwcm9jZXNzb3IgZG9lcyBub3Qgc3VwcG9ydCBkZWJ1Z2dpbmdfXG4KLVhTTFRMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGVfMjM9Q291bGQgbm90IGxvY2F0ZSBqYXIgZmlsZSAKLVhTTFRMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGVfMz1Xb3VsZCB5b3UgbGlrZSB0byBkZWJ1ZyB1c2luZyB0aGUgZGVmYXVsdCAKLVhTTFRMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGVfMzE9XCB0byAKLVhTTFRMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGVfND1cIHByb2Nlc3NvciBpbnN0ZWFkPwotWFNMVExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZV81PWxhdW5jaAotWFNMVExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZV82PWxhdW5jaC54bWwKLVhTTFRMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGVfNz1FcnJvciBjb3B5aW5nIHVybCAKLQotQWJzdHJhY3RSZWdpc3RyeVJlYWRlcl8zPSwgZXh0ZW5zaW9uIAotQWJzdHJhY3RSZWdpc3RyeVJlYWRlcl81PVJlcXVpcmVkIGF0dHJpYnV0ZSAnCi1BYnN0cmFjdFJlZ2lzdHJ5UmVhZGVyXzY9JyBub3QgZGVmaW5lZAotQWJzdHJhY3RSZWdpc3RyeVJlYWRlcl83PVJlcXVpcmVkIHN1YiBlbGVtZW50ICcKLUFic3RyYWN0UmVnaXN0cnlSZWFkZXJfOD0nIG5vdCBkZWZpbmVkCi1BYnN0cmFjdFJlZ2lzdHJ5UmVhZGVyXzk9VW5rbm93biBleHRlbnNpb24gdGFnIGZvdW5kOiAKLQotTGF1bmNoSGVscGVyXzA9RmlsZSBub3QgZm91bmQKLUxhdW5jaEhlbHBlcl8xPUlPIEV4Y2VwdGlvbgotCi1YU0xEZWJ1Z1RhcmdldF8wPVVuYWJsZSB0byBjb25uZWN0IHRvIGRlYnVnZ2VyCi1YU0xEZWJ1Z1RhcmdldF8xPWxvY2FsaG9zdAotWFNMRGVidWdUYXJnZXRfMTk9UmVxdWVzdCBmYWlsZWQ6IAotWFNMRGVidWdUYXJnZXRfMj1Db3VsZCBub3QgY29ubmVjdCB0byBzb2NrZXQgCi1YU0xEZWJ1Z1RhcmdldF8yMD1FdmVudCBEaXNwYXRjaAotWFNMRGVidWdUYXJnZXRfMz1cIGFmdGVyIAotWFNMRGVidWdUYXJnZXRfND1cIGF0dGVtcHRzCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9tb2RlbC9KQVhQRGVidWdUYXJnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9qYXhwL2xhdW5jaGluZy9tb2RlbC9KQVhQRGVidWdUYXJnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU2OGNhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9sYXVuY2hpbmcvbW9kZWwvSkFYUERlYnVnVGFyZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5tb2RlbDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5uZXQuQ29ubmVjdEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0OwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXJEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSURlYnVnVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSUxpbmVCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSU1lbW9yeUJsb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3RhY2tGcmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklUaHJlYWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLmRlYnVnZ2VyLkRlYnVnQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5pbnRlcm5hbC5KQVhQTGF1bmNoaW5nUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmNvbmZpZy5CYXNlTGF1bmNoSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLm1vZGVsLklYU0xDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcubW9kZWwuSVhTTERlYnVnVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLm1vZGVsLlhTTERlYnVnRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5tb2RlbC5YU0xTdGFja0ZyYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLm1vZGVsLlhTTFRocmVhZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5tb2RlbC5YU0xWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5tb2RlbC5YU0xWYXJpYWJsZTsKLQotcHVibGljIGNsYXNzIEpBWFBEZWJ1Z1RhcmdldCBleHRlbmRzIFhTTERlYnVnRWxlbWVudCBpbXBsZW1lbnRzIElYU0xEZWJ1Z1RhcmdldCB7Ci0JcHJpdmF0ZSBmaW5hbCBieXRlW10gU1RBQ0tfRlJBTUVTX0xPQ0sgPSBuZXcgYnl0ZVswXTsKLQlwcml2YXRlIGZpbmFsIGJ5dGVbXSBWQUxVRV9NQVBfTE9DSyA9IG5ldyBieXRlWzBdOwotCXByaXZhdGUgZmluYWwgYnl0ZVtdIFdSSVRFX0xPQ0sgPSBuZXcgYnl0ZVswXTsKLQotCXByaXZhdGUgZmluYWwgaW50IENPTk5FQ1RfQVRURU1QVFMgPSA2MDsKLQlwcml2YXRlIGZpbmFsIGludCBDT05ORUNUX1dBSVQgPSAxMDAwOwotCi0JcHJpdmF0ZSBmaW5hbCBJUHJvY2VzcyBwcm9jZXNzOwotCXByaXZhdGUgZmluYWwgSUxhdW5jaCBsYXVuY2g7Ci0JcHJpdmF0ZSBYU0xUaHJlYWQgdGhyZWFkOwotCXByaXZhdGUgSVRocmVhZFtdIHRocmVhZHMgPSBuZXcgSVRocmVhZFswXTsKLQlwcml2YXRlIElTdGFja0ZyYW1lW10gc3RhY2tGcmFtZXNDYWNoZSA9IG5ldyBJU3RhY2tGcmFtZVswXTsKLQotCXByaXZhdGUgRXZlbnREaXNwYXRjaEpvYiBldmVudERpc3BhdGNoOwotCi0JcHJpdmF0ZSBmaW5hbCBNYXA8SW50ZWdlciwgWFNMVmFyaWFibGU+IHZhcmlhYmxlTWFwQ2FjaGUgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBYU0xWYXJpYWJsZT4oKTsKLQlwcml2YXRlIGZpbmFsIE1hcDxYU0xWYXJpYWJsZSwgWFNMVmFsdWU+IHZhbHVlTWFwQ2FjaGUgPSBuZXcgSGFzaE1hcDxYU0xWYXJpYWJsZSwgWFNMVmFsdWU+KCk7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQlwcml2YXRlIGJvb2xlYW4gc3VzcGVuZGVkOwotCi0JcHJpdmF0ZSBTb2NrZXQgcmVxdWVzdFNvY2tldDsKLQlwcml2YXRlIFNvY2tldCBldmVudFNvY2tldDsKLQlwcml2YXRlIFNvY2tldCBnZW5lcmF0ZVNvY2tldDsKLQlwcml2YXRlIEJ1ZmZlcmVkUmVhZGVyIHJlcXVlc3RSZWFkZXI7Ci0JcHJpdmF0ZSBCdWZmZXJlZFJlYWRlciBldmVudFJlYWRlcjsKLQlwcml2YXRlIFByaW50V3JpdGVyIHJlcXVlc3RXcml0ZXI7Ci0JcHJpdmF0ZSBSZWFkZXIgZ2VuZXJhdGVSZWFkZXI7Ci0JcHJpdmF0ZSBib29sZWFuIHN0YWxlOwotCi0JcHVibGljIEpBWFBEZWJ1Z1RhcmdldChJTGF1bmNoIGxhdW5jaCwgSVByb2Nlc3MgcHJvY2VzcywKLQkJCUJhc2VMYXVuY2hIZWxwZXIgQmFzZUxhdW5jaEhlbHBlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzdXBlcihudWxsKTsKLQkJdGhpcy5sYXVuY2ggPSBsYXVuY2g7Ci0JCXRoaXMucHJvY2VzcyA9IHByb2Nlc3M7Ci0JCXRoaXMucmVxdWVzdFNvY2tldCA9IGF0dGVtcHRDb25uZWN0KEJhc2VMYXVuY2hIZWxwZXIuZ2V0UmVxdWVzdFBvcnQoKSk7Ci0JCXRoaXMuZXZlbnRTb2NrZXQgPSBhdHRlbXB0Q29ubmVjdChCYXNlTGF1bmNoSGVscGVyLmdldEV2ZW50UG9ydCgpKTsKLQkJdGhpcy5nZW5lcmF0ZVNvY2tldCA9IGF0dGVtcHRDb25uZWN0KEJhc2VMYXVuY2hIZWxwZXIuZ2V0R2VuZXJhdGVQb3J0KCkpOwotCi0JCWlmICghcHJvY2Vzcy5pc1Rlcm1pbmF0ZWQoKSkgewotCQkJdHJ5IHsKLQkJCQl0aGlzLmV2ZW50UmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihldmVudFNvY2tldC5nZXRJbnB1dFN0cmVhbSgpKSk7Ci0JCQkJdGhpcy5yZXF1ZXN0V3JpdGVyID0gbmV3IFByaW50V3JpdGVyKHJlcXVlc3RTb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCkpOwotCQkJCXRoaXMucmVxdWVzdFJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIocmVxdWVzdFNvY2tldC5nZXRJbnB1dFN0cmVhbSgpKSk7Ci0JCQkJdGhpcy5nZW5lcmF0ZVJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihnZW5lcmF0ZVNvY2tldC5nZXRJbnB1dFN0cmVhbSgpKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlhYm9ydChNZXNzYWdlcy5YU0xEZWJ1Z1RhcmdldF8wLCBlKTsgCi0JCQl9Ci0JCQl0aGlzLnRocmVhZCA9IG5ldyBYU0xUaHJlYWQodGhpcyk7Ci0JCQl0aGlzLnRocmVhZHMgPSBuZXcgSVRocmVhZFtdIHsgdGhyZWFkIH07Ci0JCQl0aGlzLmV2ZW50RGlzcGF0Y2ggPSBuZXcgRXZlbnREaXNwYXRjaEpvYigpOwotCQkJdGhpcy5ldmVudERpc3BhdGNoLnNjaGVkdWxlKCk7Ci0JCQkKLQkJCURlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCcmVha3BvaW50TWFuYWdlcigpLmFkZEJyZWFrcG9pbnRMaXN0ZW5lcih0aGlzKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgUmVhZGVyIGdldEdlbmVyYXRlUmVhZGVyKCkKLQl7Ci0JCXJldHVybiBnZW5lcmF0ZVJlYWRlcjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWJvcnQoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBlKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlpZiAoIWdldERlYnVnVGFyZ2V0KCkuaXNUZXJtaW5hdGVkKCkpCi0JCQlnZXREZWJ1Z1RhcmdldCgpLmdldFByb2Nlc3MoKS50ZXJtaW5hdGUoKTsKLQkJdGhyb3cgbmV3IERlYnVnRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQlKQVhQTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCwgRGVidWdQbHVnaW4uSU5URVJOQUxfRVJST1IsIG1lc3NhZ2UsCi0JCQkJZSkpOwotCX0KLQotCXByaXZhdGUgU29ja2V0IGF0dGVtcHRDb25uZWN0KGludCBwb3J0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVNvY2tldCBzb2NrZXQgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IENPTk5FQ1RfQVRURU1QVFM7IGkrKykgewotCQkJLy8gYnJlYWsgb3V0IGlmIHByb2Nlc3MgaXMgdGVybWluYXRlZAotCQkJaWYgKHByb2Nlc3MuaXNUZXJtaW5hdGVkKCkpCi0JCQkJYnJlYWs7Ci0JCQl0cnkgewotCQkJCXNvY2tldCA9IG5ldyBTb2NrZXQoCi0JCQkJCQlNZXNzYWdlcy5YU0xEZWJ1Z1RhcmdldF8xLCBwb3J0KTsgCi0JCQl9IGNhdGNoIChDb25uZWN0RXhjZXB0aW9uIGUpIHsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJCWlmIChzb2NrZXQgIT0gbnVsbCkKLQkJCQlicmVhazsKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKENPTk5FQ1RfV0FJVCk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJaWYgKHNvY2tldCA9PSBudWxsICYmICFwcm9jZXNzLmlzVGVybWluYXRlZCgpKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oCi0JCQkJCW5ldyBTdGF0dXMoCi0JCQkJCQkJSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQlKQVhQTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCwKLQkJCQkJCQlNZXNzYWdlcy5YU0xEZWJ1Z1RhcmdldF8yICsgcG9ydCArIE1lc3NhZ2VzLlhTTERlYnVnVGFyZ2V0XzMgKyBDT05ORUNUX0FUVEVNUFRTICsgTWVzc2FnZXMuWFNMRGVidWdUYXJnZXRfNCkpOyAKLQkJcmV0dXJuIHNvY2tldDsKLQl9Ci0KLQlwdWJsaWMgSVByb2Nlc3MgZ2V0UHJvY2VzcygpIHsKLQkJcmV0dXJuIHByb2Nlc3M7Ci0JfQotCi0JcHVibGljIElUaHJlYWRbXSBnZXRUaHJlYWRzKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRocmVhZHM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzVGhyZWFkcygpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aHJlYWRzICE9IG51bGwgJiYgdGhyZWFkcy5sZW5ndGggPiAwOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCW5hbWUgPSBsYXVuY2guZ2V0QXR0cmlidXRlKCJsYXVuY2hOYW1lIik7Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNCcmVha3BvaW50KElCcmVha3BvaW50IGJyZWFrcG9pbnQpIHsKLQkJaWYgKGJyZWFrcG9pbnQuZ2V0TW9kZWxJZGVudGlmaWVyKCkuZXF1YWxzKAotCQkJCUlYU0xDb25zdGFudHMuSURfWFNMX0RFQlVHX01PREVMKQotCQkJCSYmIGJyZWFrcG9pbnQgaW5zdGFuY2VvZiBJTGluZUJyZWFrcG9pbnQpIHsKLQkJCS8vIHRyeQotCQkJLy8gewotCQkJLy8gSUxpbmVCcmVha3BvaW50IGxiID0gKElMaW5lQnJlYWtwb2ludCkgYnJlYWtwb2ludDsKLQkJCS8vIElNYXJrZXIgbWFya2VyID0gbGIuZ2V0TWFya2VyKCk7Ci0JCQkvLyBmb3IgKEl0ZXJhdG9yPD8+IGl0ZXIgPQotCQkJLy8gQmFzZUxhdW5jaEhlbHBlci5nZXRQaXBlbGluZSgpLmdldFRyYW5zZm9ybURlZnMoKS5pdGVyYXRvcigpOwotCQkJLy8gaXRlci5oYXNOZXh0KCk7KQotCQkJLy8gewotCQkJLy8gTGF1bmNoVHJhbnNmb3JtIGx0ID0gKExhdW5jaFRyYW5zZm9ybSkgaXRlci5uZXh0KCk7Ci0JCQkvLyBpZiAobWFya2VyLmdldFJlc291cmNlKCkuZ2V0TG9jYXRpb24oKS5lcXVhbHMobHQuZ2V0TG9jYXRpb24oKSkpCi0JCQkvLyByZXR1cm4gdHJ1ZTsKLQkJCS8vIH0KLQkJCS8vIH0KLQkJCS8vIGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JCQkvLyB7Ci0JCQkvLyBKQVhQTGF1bmNoaW5nUGx1Z2luLmxvZyhlKTsKLQkJCS8vIH0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSURlYnVnVGFyZ2V0IGdldERlYnVnVGFyZ2V0KCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSUxhdW5jaCBnZXRMYXVuY2goKSB7Ci0JCXJldHVybiBsYXVuY2g7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuVGVybWluYXRlKCkgewotCQlyZXR1cm4gZ2V0UHJvY2VzcygpLmNhblRlcm1pbmF0ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVGVybWluYXRlZCgpIHsKLQkJcmV0dXJuIGdldFByb2Nlc3MoKS5pc1Rlcm1pbmF0ZWQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXJtaW5hdGUoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKFdSSVRFX0xPQ0spIHsKLQkJCWdldFByb2Nlc3MoKS50ZXJtaW5hdGUoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhblJlc3VtZSgpIHsKLQkJcmV0dXJuICFpc1Rlcm1pbmF0ZWQoKSAmJiBpc1N1c3BlbmRlZCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhblN1c3BlbmQoKSB7Ci0JCXJldHVybiAhaXNUZXJtaW5hdGVkKCkgJiYgIWlzU3VzcGVuZGVkKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTdXNwZW5kZWQoKSB7Ci0JCXJldHVybiBzdXNwZW5kZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzdW1lKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJc2VuZFJlcXVlc3QoRGVidWdDb25zdGFudHMuUkVRVUVTVF9SRVNVTUUpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZXN1bWVkKGludCBkZXRhaWwpIHsKLQkJc3VzcGVuZGVkID0gZmFsc2U7Ci0JCXRocmVhZC5maXJlUmVzdW1lRXZlbnQoZGV0YWlsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3VzcGVuZGVkKGludCBkZXRhaWwpIHsKLQkJc3VzcGVuZGVkID0gdHJ1ZTsKLQkJdGhyZWFkLmZpcmVTdXNwZW5kRXZlbnQoZGV0YWlsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdXNwZW5kKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJc2VuZFJlcXVlc3QoRGVidWdDb25zdGFudHMuUkVRVUVTVF9TVVNQRU5EKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBicmVha3BvaW50QWRkZWQoSUJyZWFrcG9pbnQgYnJlYWtwb2ludCkgewotCQlpZiAoc3VwcG9ydHNCcmVha3BvaW50KGJyZWFrcG9pbnQpKSB7Ci0JCQl0cnkgewotCQkJCUlMaW5lQnJlYWtwb2ludCBsYiA9IChJTGluZUJyZWFrcG9pbnQpIGJyZWFrcG9pbnQ7Ci0JCQkJaWYgKGJyZWFrcG9pbnQuaXNFbmFibGVkKCkpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlNYXJrZXIgbWFya2VyID0gbGIuZ2V0TWFya2VyKCk7Ci0JCQkJCQlpZiAobWFya2VyICE9IG51bGwpIHsKLQkJCQkJCQlVUkwgZmlsZSA9IG1hcmtlci5nZXRSZXNvdXJjZSgpLmdldExvY2F0aW9uKCkKLQkJCQkJCQkJCS50b0ZpbGUoKS50b1VSSSgpLnRvVVJMKCk7Ci0JCQkJCQkJc2VuZFJlcXVlc3QoRGVidWdDb25zdGFudHMuUkVRVUVTVF9BRERfQlJFQUtQT0lOVAotCQkJCQkJCQkJKyAiICIgKyBmaWxlICsgIiAiICsgbGIuZ2V0TGluZU51bWJlcigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJSkFYUExhdW5jaGluZ1BsdWdpbi5sb2coZSk7Ci0JCQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlKQVhQTGF1bmNoaW5nUGx1Z2luLmxvZyhlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYnJlYWtwb2ludFJlbW92ZWQoSUJyZWFrcG9pbnQgYnJlYWtwb2ludCwgSU1hcmtlckRlbHRhIGRlbHRhKSB7Ci0JCWlmIChzdXBwb3J0c0JyZWFrcG9pbnQoYnJlYWtwb2ludCkpIHsKLQkJCXRyeSB7Ci0JCQkJSUxpbmVCcmVha3BvaW50IGxiID0gKElMaW5lQnJlYWtwb2ludCkgYnJlYWtwb2ludDsKLQkJCQlJTWFya2VyIG1hcmtlciA9IGxiLmdldE1hcmtlcigpOwotCQkJCWlmIChtYXJrZXIgIT0gbnVsbCkgewotCQkJCQlVUkwgZmlsZSA9IG1hcmtlci5nZXRSZXNvdXJjZSgpLmdldExvY2F0aW9uKCkudG9GaWxlKCkKLQkJCQkJCQkudG9VUkkoKS50b1VSTCgpOwotCQkJCQlzZW5kUmVxdWVzdChEZWJ1Z0NvbnN0YW50cy5SRVFVRVNUX1JFTU9WRV9CUkVBS1BPSU5UCi0JCQkJCQkJKyAiICIgKyBmaWxlICsgIiAiICsgbGIuZ2V0TGluZU51bWJlcigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJSkFYUExhdW5jaGluZ1BsdWdpbi5sb2coZSk7Ci0JCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCUpBWFBMYXVuY2hpbmdQbHVnaW4ubG9nKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYnJlYWtwb2ludENoYW5nZWQoSUJyZWFrcG9pbnQgYnJlYWtwb2ludCwgSU1hcmtlckRlbHRhIGRlbHRhKSB7Ci0JCWlmIChzdXBwb3J0c0JyZWFrcG9pbnQoYnJlYWtwb2ludCkpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGJyZWFrcG9pbnQuaXNFbmFibGVkKCkpIHsKLQkJCQkJYnJlYWtwb2ludEFkZGVkKGJyZWFrcG9pbnQpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWJyZWFrcG9pbnRSZW1vdmVkKGJyZWFrcG9pbnQsIG51bGwpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY2FuRGlzY29ubmVjdCgpIHsKLQkJLy8gVE9ETyBpbXBsZW1lbnQgZGlzY29ubmVjdAotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzY29ubmVjdCgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gaW1wbGVtZW50IGRpc2Nvbm5lY3QKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0Rpc2Nvbm5lY3RlZCgpIHsKLQkJLy8gVE9ETyBpbXBsZW1lbnQgZGlzY29ubmVjdAotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNTdG9yYWdlUmV0cmlldmFsKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIElNZW1vcnlCbG9jayBnZXRNZW1vcnlCbG9jayhsb25nIHN0YXJ0QWRkcmVzcywgbG9uZyBsZW5ndGgpCi0JCQl0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVhZHkoKSB7Ci0JCWZpcmVDcmVhdGlvbkV2ZW50KCk7Ci0JCWluc3RhbGxEZWZlcnJlZEJyZWFrcG9pbnRzKCk7Ci0JCXRyeSB7Ci0JCQlzZW5kUmVxdWVzdChEZWJ1Z0NvbnN0YW50cy5SRVFVRVNUX1NUQVJUKTsKLQkJfSBjYXRjaCAoRGVidWdFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluc3RhbGwgYnJlYWtwb2ludHMgdGhhdCBhcmUgYWxyZWFkeSByZWdpc3RlcmVkIHdpdGggdGhlIGJyZWFrcG9pbnQKLQkgKiBtYW5hZ2VyLgotCSAqLwotCXByaXZhdGUgdm9pZCBpbnN0YWxsRGVmZXJyZWRCcmVha3BvaW50cygpIHsKLQkJSUJyZWFrcG9pbnRbXSBicmVha3BvaW50cyA9IERlYnVnUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRCcmVha3BvaW50TWFuYWdlcigpLmdldEJyZWFrcG9pbnRzKAotCQkJCQkJSVhTTENvbnN0YW50cy5JRF9YU0xfREVCVUdfTU9ERUwpOwotCQlmb3IgKElCcmVha3BvaW50IGVsZW1lbnQgOiBicmVha3BvaW50cykgewotCQkJYnJlYWtwb2ludEFkZGVkKGVsZW1lbnQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHRlcm1pbmF0ZWQoKSB7Ci0JCXN1c3BlbmRlZCA9IHRydWU7Ci0JCURlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCcmVha3BvaW50TWFuYWdlcigpLnJlbW92ZUJyZWFrcG9pbnRMaXN0ZW5lcih0aGlzKTsKLQkJdGhyZWFkcyA9IG5ldyBJVGhyZWFkWzBdOwotCQlmaXJlVGVybWluYXRlRXZlbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHN0YWNrIGZyYW1lcyBpbiB0aGUgdGFyZ2V0LgotCSAqLwotCXB1YmxpYyBJU3RhY2tGcmFtZVtdIGdldFN0YWNrRnJhbWVzKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkIChTVEFDS19GUkFNRVNfTE9DSykgewotCQkJaWYgKHN0YWxlKSB7Ci0JCQkJc3RhbGUgPSBmYWxzZTsKLQkJCQlTdHJpbmcgZnJhbWVzRGF0YSA9IHNlbmRSZXF1ZXN0KERlYnVnQ29uc3RhbnRzLlJFUVVFU1RfU1RBQ0spOwotCQkJCVN0cmluZ1tdIGZyYW1lcyA9IGZyYW1lc0RhdGEuc3BsaXQoIlxcJFxcJFxcJCIpOyAvLyROT04tTkxTLTEkCi0JCQkJSVN0YWNrRnJhbWVbXSBzZiA9IG5ldyBJU3RhY2tGcmFtZVtmcmFtZXMubGVuZ3RoXTsKLQkJCQlMaXN0PElTdGFja0ZyYW1lPiBjdXJyZW50RnJhbWVzID0gQXJyYXlzCi0JCQkJCQkuYXNMaXN0KHN0YWNrRnJhbWVzQ2FjaGUpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCVN0cmluZyBkYXRhID0gZnJhbWVzW2ldOwotCQkJCQlYU0xTdGFja0ZyYW1lIGZyYW1lID0gbmV3IFhTTFN0YWNrRnJhbWUodGhyZWFkLCBkYXRhLCBpKTsKLQkJCQkJaW50IGluZGV4OwotCQkJCQlpZiAoKGluZGV4ID0gY3VycmVudEZyYW1lcy5pbmRleE9mKGZyYW1lKSkgIT0gLTEpIHsKLQkJCQkJCVhTTFN0YWNrRnJhbWUgY3VyciA9IChYU0xTdGFja0ZyYW1lKSBjdXJyZW50RnJhbWVzCi0JCQkJCQkJCS5nZXQoaW5kZXgpOwotCQkJCQkJY3Vyci5zZXRMaW5lTnVtYmVyKGZyYW1lLmdldExpbmVOdW1iZXIoKSk7Ci0JCQkJCQljdXJyLnNldFZhcmlhYmxlcyhmcmFtZS5nZXRWYXJpYWJsZXMoKSk7Ci0JCQkJCQlmcmFtZSA9IGN1cnI7Ci0JCQkJCX0KLQkJCQkJc2ZbZnJhbWVzLmxlbmd0aCAtIGkgLSAxXSA9IGZyYW1lOwotCQkJCX0KLQkJCQlzdGFja0ZyYW1lc0NhY2hlID0gc2Y7Ci0JCQl9Ci0JCQlyZXR1cm4gc3RhY2tGcmFtZXNDYWNoZTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZXNzZXRTdGFja0ZyYW1lc0NhY2hlKCkgewotCQlzdGFsZSA9IHRydWU7Ci0JCXN5bmNocm9uaXplZCAoVkFMVUVfTUFQX0xPQ0spIHsKLQkJCXZhbHVlTWFwQ2FjaGUuY2xlYXIoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNpbmdsZSBzdGVwIHRoZSBpbnRlcnByZXRlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGVwT3ZlcigpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCXNlbmRSZXF1ZXN0KERlYnVnQ29uc3RhbnRzLlJFUVVFU1RfU1RFUF9PVkVSKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGVwSW50bygpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCXNlbmRSZXF1ZXN0KERlYnVnQ29uc3RhbnRzLlJFUVVFU1RfU1RFUF9JTlRPKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGVwUmV0dXJuKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJc2VuZFJlcXVlc3QoRGVidWdDb25zdGFudHMuUkVRVUVTVF9TVEVQX1JFVFVSTik7Ci0JfQotCi0JcHVibGljIFhTTFZhcmlhYmxlIGdldFZhcmlhYmxlKGludCB2YXJJZCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh2YXJpYWJsZU1hcENhY2hlKSB7Ci0JCQlYU0xWYXJpYWJsZSB2YXIgPSB2YXJpYWJsZU1hcENhY2hlLmdldCh2YXJJZCk7Ci0JCQlpZiAodmFyID09IG51bGwpIHsKLQkJCQl2YXIgPSBuZXcgWFNMVmFyaWFibGUodGhpcywgdmFySWQpOwotCQkJCVN0cmluZyByZXMgPSBzZW5kUmVxdWVzdChEZWJ1Z0NvbnN0YW50cy5SRVFVRVNUX1ZBUklBQkxFCi0JCQkJCQkrICIgIiArIHZhcklkKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZ1tdIGRhdGEgPSByZXMuc3BsaXQoIiYiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXZhci5zZXRTY29wZShkYXRhWzBdKTsKLQkJCQl2YXIuc2V0TmFtZShkYXRhWzFdKTsKLQkJCQl2YXJpYWJsZU1hcENhY2hlLnB1dCh2YXJJZCwgdmFyKTsKLQkJCX0KLQkJCXJldHVybiB2YXI7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSVZhbHVlIGdldFZhcmlhYmxlVmFsdWUoWFNMVmFyaWFibGUgdmFyaWFibGUpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAoVkFMVUVfTUFQX0xPQ0spIHsKLQkJCVhTTFZhbHVlIHZhbHVlID0gdmFsdWVNYXBDYWNoZS5nZXQodmFyaWFibGUpOwotCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQlpZiAoaXNTdXNwZW5kZWQoKSkgewotCQkJCQlTdHJpbmcgcmVzID0gc2VuZFJlcXVlc3QoRGVidWdDb25zdGFudHMuUkVRVUVTVF9WQUxVRQotCQkJCQkJCSsgIiAiICsgdmFyaWFibGUuZ2V0SWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJU3RyaW5nW10gZGF0YSA9IHJlcy5zcGxpdCgiJiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZyB0eXBlID0gZGF0YVswXTsKLQkJCQkJU3RyaW5nIHRoZXZhbDsKLQkJCQkJaWYgKGRhdGEubGVuZ3RoID4gMSkKLQkJCQkJCXRoZXZhbCA9IGRhdGFbMV07Ci0JCQkJCWVsc2UKLQkJCQkJCXRoZXZhbCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCXZhbHVlID0gbmV3IFhTTFZhbHVlKHRoaXMsIHR5cGUsIHRoZXZhbCk7Ci0JCQkJCXZhbHVlTWFwQ2FjaGUucHV0KHZhcmlhYmxlLCB2YWx1ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gYW55dGhpbmcgYXMgbG9uZyBhcyBub3QgbnVsbCEKLQkJCQkJdmFsdWUgPSBuZXcgWFNMVmFsdWUodGhpcywgIkciLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJCXJldHVybiB2YWx1ZTsKLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIHNlbmRSZXF1ZXN0KFN0cmluZyByZXF1ZXN0KSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlTdHJpbmcgcmVzcG9uc2UgPSBudWxsOwotCQlzeW5jaHJvbml6ZWQgKFdSSVRFX0xPQ0spIHsKLS8vCQkJaWYgKERlYnVnLmRlYnVnTGF1bmNoZXIpIHsKLS8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUkVRVUVTVDogIiArIHJlcXVlc3QpOwotLy8JCQl9Ci0JCQlyZXF1ZXN0V3JpdGVyLnByaW50bG4ocmVxdWVzdCk7Ci0JCQlyZXF1ZXN0V3JpdGVyLmZsdXNoKCk7Ci0JCQl0cnkgewotCQkJCS8vIHdhaXQgZm9yIHJlc3BvbnNlCi0JCQkJcmVzcG9uc2UgPSByZXF1ZXN0UmVhZGVyLnJlYWRMaW5lKCk7Ci0vLwkJCQlpZiAoRGVidWcuZGVidWdMYXVuY2hlcikgewotLy8JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUkVTUE9OU0U6ICIgKyByZXNwb25zZSk7Ci0vLwkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJYWJvcnQoTWVzc2FnZXMuWFNMRGVidWdUYXJnZXRfMTkgKyByZXF1ZXN0LCBlKTsgCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3BvbnNlOwotCX0KLQotCXByaXZhdGUgdm9pZCBicmVha3BvaW50SGl0KFN0cmluZyBldmVudCkgewotCQkvLyBkZXRlcm1pbmUgd2hpY2ggYnJlYWtwb2ludCB3YXMgaGl0LCBhbmQgc2V0IHRoZSB0aHJlYWQncyBicmVha3BvaW50Ci0JCWludCBsYXN0U3BhY2UgPSBldmVudC5sYXN0SW5kZXhPZignICcpOwotCQlpZiAobGFzdFNwYWNlID4gMCkgewotCQkJU3RyaW5nIGxpbmUgPSBldmVudC5zdWJzdHJpbmcobGFzdFNwYWNlICsgMSk7Ci0JCQlpbnQgbGluZU51bWJlciA9IEludGVnZXIucGFyc2VJbnQobGluZSk7Ci0JCQlJQnJlYWtwb2ludFtdIGJyZWFrcG9pbnRzID0gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRCcmVha3BvaW50TWFuYWdlcigpLmdldEJyZWFrcG9pbnRzKAotCQkJCQkJCUlYU0xDb25zdGFudHMuSURfWFNMX0RFQlVHX01PREVMKTsKLQkJCWZvciAoSUJyZWFrcG9pbnQgYnJlYWtwb2ludCA6IGJyZWFrcG9pbnRzKSB7Ci0JCQkJaWYgKHN1cHBvcnRzQnJlYWtwb2ludChicmVha3BvaW50KSkgewotCQkJCQlpZiAoYnJlYWtwb2ludCBpbnN0YW5jZW9mIElMaW5lQnJlYWtwb2ludCkgewotCQkJCQkJSUxpbmVCcmVha3BvaW50IGxpbmVCcmVha3BvaW50ID0gKElMaW5lQnJlYWtwb2ludCkgYnJlYWtwb2ludDsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJaWYgKGxpbmVCcmVha3BvaW50LmdldExpbmVOdW1iZXIoKSA9PSBsaW5lTnVtYmVyKSB7Ci0JCQkJCQkJCXRocmVhZAotCQkJCQkJCQkJCS5zZXRCcmVha3BvaW50cyhuZXcgSUJyZWFrcG9pbnRbXSB7IGJyZWFrcG9pbnQgfSk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1c3BlbmRlZChEZWJ1Z0V2ZW50LkJSRUFLUE9JTlQpOwotCX0KLQotCXByaXZhdGUgY2xhc3MgRXZlbnREaXNwYXRjaEpvYiBleHRlbmRzIEpvYiB7Ci0KLQkJcHVibGljIEV2ZW50RGlzcGF0Y2hKb2IoKSB7Ci0JCQlzdXBlcihNZXNzYWdlcy5YU0xEZWJ1Z1RhcmdldF8yMCk7IAotCQkJc2V0U3lzdGVtKHRydWUpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCVN0cmluZyBldmVudCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl3aGlsZSAoIWlzVGVybWluYXRlZCgpICYmIGV2ZW50ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlldmVudCA9IGV2ZW50UmVhZGVyLnJlYWRMaW5lKCk7Ci0JCQkJCWlmIChldmVudCAhPSBudWxsKSB7Ci0JCQkJCQl0aHJlYWQuc2V0QnJlYWtwb2ludHMobnVsbCk7Ci0JCQkJCQl0aHJlYWQuc2V0U3RlcHBpbmcoZmFsc2UpOwotCQkJCQkJaWYgKGV2ZW50LmVxdWFscygicmVhZHkiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJewotCQkJCQkJCXJlYWR5KCk7Ci0JCQkJCQl9IGVsc2UgaWYgKGV2ZW50LmVxdWFscygic3RvcHBlZCIpKSAvLyROT04tTkxTLTEkCi0JCQkJCQl7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJdGVybWluYXRlKCk7Ci0JCQkJCQkJfSBjYXRjaCAoRGVidWdFeGNlcHRpb24gZSkgewotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSBpZiAoZXZlbnQuZXF1YWxzKCJ0ZXJtaW5hdGVkIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCXsKLQkJCQkJCQl0ZXJtaW5hdGVkKCk7Ci0JCQkJCQl9IGVsc2UgaWYgKGV2ZW50LnN0YXJ0c1dpdGgoInJlc3VtZWQiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJewotCQkJCQkJCWlmIChldmVudC5lbmRzV2l0aCgic3RlcCIpKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJewotCQkJCQkJCQl0aHJlYWQuc2V0U3RlcHBpbmcodHJ1ZSk7Ci0JCQkJCQkJCXJlc3VtZWQoRGVidWdFdmVudC5TVEVQX09WRVIpOwotCQkJCQkJCX0gZWxzZSBpZiAoZXZlbnQuZW5kc1dpdGgoImNsaWVudCIpKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJewotCQkJCQkJCQlyZXN1bWVkKERlYnVnRXZlbnQuQ0xJRU5UX1JFUVVFU1QpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWRlYnVnRXZlbnRNc2coZXZlbnQpOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSBpZiAoZXZlbnQuc3RhcnRzV2l0aCgic3VzcGVuZGVkIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCXsKLQkJCQkJCQkvLyBjbGVhciBkb3duIHRoZSBmcmFtZXMgc28gdGhhdCB0aGV5IGFyZSByZS1mZXRjaGVkCi0JCQkJCQkJcmVzc2V0U3RhY2tGcmFtZXNDYWNoZSgpOwotCQkJCQkJCWlmIChldmVudC5lbmRzV2l0aCgiY2xpZW50IikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl7Ci0JCQkJCQkJCXN1c3BlbmRlZChEZWJ1Z0V2ZW50LkNMSUVOVF9SRVFVRVNUKTsKLQkJCQkJCQl9IGVsc2UgaWYgKGV2ZW50LmVuZHNXaXRoKCJzdGVwIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl7Ci0JCQkJCQkJCXN1c3BlbmRlZChEZWJ1Z0V2ZW50LlNURVBfRU5EKTsKLQkJCQkJCQl9IGVsc2UgaWYgKGV2ZW50LmluZGV4T2YoImJyZWFrcG9pbnQiKSA+PSAwKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJewotCQkJCQkJCQlicmVha3BvaW50SGl0KGV2ZW50KTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlkZWJ1Z0V2ZW50TXNnKGV2ZW50KTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWRlYnVnRXZlbnRNc2coZXZlbnQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQl0ZXJtaW5hdGVkKCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgZGVidWdFdmVudE1zZyhTdHJpbmcgZXZlbnQpIHsKLS8vCQkJaWYgKERlYnVnLmRlYnVnTGF1bmNoZXIpIHsKLS8vCQkJCSBTeXN0ZW0ub3V0LnByaW50bG4oIkRpZCBub3QgdW5kZXJzdGFuZCBldmVudDoiICsgZXZlbnQpOwotLy8JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNGU4NjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRhMjU1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJ1aWxkLnhtbAotamF2YUNvbXBpbGVyLi4uYXJncwotdGVtcC5mb2xkZXIKLUBkb3QKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTIzYWNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZzwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLmFwaS50b29scy5hcGlBbmFseXNpc0J1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLmFwaS50b29scy5hcGlBbmFseXNpc05hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JhY2M4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1RodSBKYW4gMDMgMjI6MjQ6MjUgRVNUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI4NmQ4YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSNUdWUgRmViIDEwIDA1OjI1OjIzIEdNVCAyMDA5Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3M9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ0Rlc2NyaXB0aW9uPXJldHVybl90YWcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZmMzZWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotI1dlZCBKdWwgMzAgMjA6NTY6NTYgQlNUIDIwMDgKLWNvbXBpbGVycy5mLnVucmVzb2x2ZWQtZmVhdHVyZXM9MQotY29tcGlsZXJzLmYudW5yZXNvbHZlZC1wbHVnaW5zPTEKLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MQotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5kaXNjb3VyYWdlZC1jbGFzcz0xCi1jb21waWxlcnMucC5pbnRlcm5hbD0xCi1jb21waWxlcnMucC5taXNzaW5nLWJ1bmRsZS1jbGFzc3BhdGgtZW50cmllcz0wCi1jb21waWxlcnMucC5taXNzaW5nLXBhY2thZ2VzPTIKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0xCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTEKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLWlkZW50aWZpZXI9MQotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0xCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMucy5jcmVhdGUtZG9jcz1mYWxzZQotY29tcGlsZXJzLnMuZG9jLWZvbGRlcj1kb2MKLWNvbXBpbGVycy5zLm9wZW4tdGFncz0xCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzY3MDNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmc7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZy5MYXVuY2hpbmdQbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS52YXJpYWJsZXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5pZGU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54c2wuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uub3NnaS51dGlsO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmc7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZywKLSBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5jb25maWcsCi0gb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcubW9kZWwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE3ODM0YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLWphcnMuY29tcGlsZS5vcmRlciA9IC4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTljNTE1Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0jUHJvcGVydGllcyBmaWxlIGZvciBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZwotQnVuZGxlLU5hbWUuMCA9IFhTTCBUcmFuc2Zvcm0gTGF1bmNoaW5nIChJbmN1YmF0aW5nKQotbGF1bmNoQ29uZmlndXJhdGlvblR5cGUubmFtZS4wID0gWFNMCi1zb3VyY2VMb2NhdG9yLm5hbWUuMCA9IFhTTFQgU291cmNlIExvb2t1cCBEaXJlY3RvcgotZXh0ZW5zaW9uLXBvaW50Lm5hbWUuMCA9IFhTTFQgUHJvY2Vzc29yIEludm9rZXIKLWV4dGVuc2lvbi1wb2ludC5uYW1lLjEgPSBYU0xUIFByb2Nlc3NvciBUeXBlCi1leHRlbnNpb24tcG9pbnQubmFtZS4yID0gWFNMVCBQcm9jZXNzb3IKLWV4dGVuc2lvbi1wb2ludC5uYW1lLjMgPSBYU0xUIERlYnVnZ2VyCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlLm9yZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JiMWU2YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlcyI+Ci0JCTxsYXVuY2hDb25maWd1cmF0aW9uVHlwZQotICAgICAgICAgICAgc291cmNlTG9jYXRvcklkPSJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5zb3VyY2VMb29rdXBEaXJlY3RvciIKLSAgICAgICAgICAgIHNvdXJjZVBhdGhDb21wdXRlcklkPSJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5zb3VyY2VQYXRoQ29tcHV0ZXIiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcubGF1bmNoQ29uZmlndXJhdGlvblR5cGUiCi0JCQluYW1lPSIlbGF1bmNoQ29uZmlndXJhdGlvblR5cGUubmFtZS4wIiAvPgotCTwvZXh0ZW5zaW9uPgotCQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlTG9jYXRvcnMiPgotICAgICAgPHNvdXJjZUxvY2F0b3IKLSAgICAgICAgICAgIG5hbWU9IiVzb3VyY2VMb2NhdG9yLm5hbWUuMCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZy5YU0xUU291cmNlTG9va3VwRGlyZWN0b3IiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuc291cmNlTG9va3VwRGlyZWN0b3IiPgotICAgICAgPC9zb3VyY2VMb2NhdG9yPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZVBhdGhDb21wdXRlcnMiPgotICAgICAgPHNvdXJjZVBhdGhDb21wdXRlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nLlhTTFRTb3VyY2VQYXRoQ29tcHV0ZXJEZWxlZ2F0ZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5zb3VyY2VQYXRoQ29tcHV0ZXIiPgotICAgICAgPC9zb3VyY2VQYXRoQ29tcHV0ZXI+Ci0gICA8L2V4dGVuc2lvbj4KLQkKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLmJyZWFrcG9pbnRzIj4KLSAgICAgIDxicmVha3BvaW50Ci0gICAgICAJCWlkPSJ4c2xMaW5lQnJlYWtwb2ludCIKLSAgICAgICAgICAgIG1hcmtlclR5cGU9Im9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLnhzbExpbmVCcmVha3BvaW50TWFya2VyIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLm1vZGVsLlhTTExpbmVCcmVha3BvaW50Ij4KLSAgICAgIDwvYnJlYWtwb2ludD4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0ieHNsTGluZUJyZWFrcG9pbnRNYXJrZXIiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyI+Ci0gICAgICA8c3VwZXIKLSAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubGluZUJyZWFrcG9pbnRNYXJrZXIiPgotICAgICAgPC9zdXBlcj4KLSAgICAgIDxwZXJzaXN0ZW50Ci0gICAgICAgICAgICB2YWx1ZT0idHJ1ZSI+Ci0gICAgICA8L3BlcnNpc3RlbnQ+Ci0gICA8L2V4dGVuc2lvbj4KLQkKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvTGF1bmNoaW5nUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9MYXVuY2hpbmdQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhhYmIxNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9MYXVuY2hpbmdQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICovCi1wdWJsaWMgY2xhc3MgTGF1bmNoaW5nUGx1Z2luIGV4dGVuZHMgUGx1Z2luCi17Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZyI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBMYXVuY2hpbmdQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIExhdW5jaGluZ1BsdWdpbigpCi0JewotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24KLQl7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICogCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBMYXVuY2hpbmdQbHVnaW4gZ2V0RGVmYXVsdCgpCi0JewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coRXhjZXB0aW9uIGUpCi0JewotCQlnZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCAwLCAiIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhDb3JlRXhjZXB0aW9uIGUpCi0JewotCQlnZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKGUuZ2V0U3RhdHVzKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjJlM2E4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZy5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFV0aWxzXzA7IAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFV0aWxzXzE7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBYU0xMaW5lQnJlYWtwb2ludF8wOyAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBYU0xTdGFja0ZyYW1lXzU7ICAgICAKLQotCXByaXZhdGUgTWVzc2FnZXMoKSB7Ci0JfQotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL1V0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9VdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTQ0MjVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL1V0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotCi1wdWJsaWMgY2xhc3MgVXRpbHMKLXsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZpbGVMb2NhdGlvbihTdHJpbmcgYnVuZGxlSWQsIFN0cmluZyBwYXRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJU3RyaW5nIGxvY2F0aW9uID0gbnVsbDsKLQkJdHJ5Ci0JCXsKLQkJCVVSTCB1cmwgPSBGaWxlTG9jYXRvci5maW5kKFBsYXRmb3JtLmdldEJ1bmRsZShidW5kbGVJZCksIG5ldyBQYXRoKHBhdGgpLCBudWxsKTsKLQkJCWlmICh1cmwgIT0gbnVsbCkKLQkJCXsKLQkJCQlVUkwgZmlsZVVybCA9IEZpbGVMb2NhdG9yLnRvRmlsZVVSTCh1cmwpOwotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGZpbGVVcmwuZ2V0RmlsZSgpKTsKLQkJCQlsb2NhdGlvbiA9IGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0JCXsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCwgSVN0YXR1cy5FUlJPUiwgTWVzc2FnZXMuVXRpbHNfMCArIHBhdGggKyBNZXNzYWdlcy5VdGlsc18xICsgYnVuZGxlSWQsIGUpKTsKLQkJfSAKLQkJcmV0dXJuIGxvY2F0aW9uOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBsdWdpbkxvY2F0aW9uKFN0cmluZyBidW5kbGVJZCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCVN0cmluZyBsb2NhdGlvbiA9IG51bGw7Ci0JCXRyeQotCQl7Ci0JCQlVUkwgdXJsID0gbmV3IFVSTCgicGxhdGZvcm06L3BsdWdpbi8iK2J1bmRsZUlkKTsKLQkJCWlmICh1cmwgIT0gbnVsbCkKLQkJCXsKLQkJCQlVUkwgZmlsZVVybCA9IEZpbGVMb2NhdG9yLnRvRmlsZVVSTCh1cmwpOwotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGZpbGVVcmwuZ2V0RmlsZSgpKTsKLQkJCQlsb2NhdGlvbiA9IGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0JCXsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCwgSVN0YXR1cy5FUlJPUiwgTWVzc2FnZXMuVXRpbHNfMCArIGJ1bmRsZUlkICsgTWVzc2FnZXMuVXRpbHNfMSArIGJ1bmRsZUlkLCBlKSk7Ci0JCX0gCi0JCXJldHVybiBsb2NhdGlvbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL1hTTFByb3BlcnR5VGVzdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9YU0xQcm9wZXJ0eVRlc3Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmRkNmIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL1hTTFByb3BlcnR5VGVzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuUHJvcGVydHlUZXN0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBYU0xQcm9wZXJ0eVRlc3RlciBleHRlbmRzIFByb3BlcnR5VGVzdGVyCi17Ci0JcHVibGljIGJvb2xlYW4gdGVzdChPYmplY3QgYXJnMCwgU3RyaW5nIGFyZzEsIE9iamVjdFtdIGFyZzIsIE9iamVjdCBhcmczKQotCXsKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvWFNMVFNvdXJjZUxvb2t1cERpcmVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9YU0xUU291cmNlTG9va3VwRGlyZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWEzZTczYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9YU0xUU291cmNlTG9va3VwRGlyZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuQWJzdHJhY3RTb3VyY2VMb29rdXBEaXJlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5JU291cmNlTG9va3VwUGFydGljaXBhbnQ7Ci0KLXB1YmxpYyBjbGFzcyBYU0xUU291cmNlTG9va3VwRGlyZWN0b3IgZXh0ZW5kcyBBYnN0cmFjdFNvdXJjZUxvb2t1cERpcmVjdG9yCi17Ci0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhcnRpY2lwYW50cygpCi0JewotCQlhZGRQYXJ0aWNpcGFudHMobmV3IElTb3VyY2VMb29rdXBQYXJ0aWNpcGFudFtdeyBuZXcgWFNMVFNvdXJjZUxvb2t1cFBhcnRpY2lwYW50KCkgfSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvWFNMVFNvdXJjZUxvb2t1cFBhcnRpY2lwYW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9YU0xUU291cmNlTG9va3VwUGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmUyMzI4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9YU0xUU291cmNlTG9va3VwUGFydGljaXBhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuQWJzdHJhY3RTb3VyY2VMb29rdXBQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5tb2RlbC5YU0xTdGFja0ZyYW1lOwotCi0vKioKLSAqIFRyYW5zbGF0ZSBhIHN0YWNrIGZyYW1lIGludG8gYSBzb3VyY2UgZmlsZSBuYW1lCi0gKi8KLXB1YmxpYyBjbGFzcyBYU0xUU291cmNlTG9va3VwUGFydGljaXBhbnQgZXh0ZW5kcyBBYnN0cmFjdFNvdXJjZUxvb2t1cFBhcnRpY2lwYW50Ci17Ci0JcHVibGljIFN0cmluZyBnZXRTb3VyY2VOYW1lKE9iamVjdCBvYmplY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgWFNMU3RhY2tGcmFtZSkKLQkJewotCQkJcmV0dXJuICgoWFNMU3RhY2tGcmFtZSkgb2JqZWN0KS5nZXRTb3VyY2VOYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvWFNMVFNvdXJjZVBhdGhDb21wdXRlckRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9YU0xUU291cmNlUGF0aENvbXB1dGVyRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUwOWE4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9YU0xUU291cmNlUGF0aENvbXB1dGVyRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZzsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUudmFyaWFibGVzLlZhcmlhYmxlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLklTb3VyY2VDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuSVNvdXJjZVBhdGhDb21wdXRlckRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLmNvbnRhaW5lcnMuRGlyZWN0b3J5U291cmNlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLmNvbnRhaW5lcnMuRm9sZGVyU291cmNlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLmNvbnRhaW5lcnMuUHJvamVjdFNvdXJjZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5YU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmNvbmZpZy5MYXVuY2hQaXBlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5jb25maWcuTGF1bmNoVHJhbnNmb3JtOwotCi1wdWJsaWMgY2xhc3MgWFNMVFNvdXJjZVBhdGhDb21wdXRlckRlbGVnYXRlIGltcGxlbWVudHMgSVNvdXJjZVBhdGhDb21wdXRlckRlbGVnYXRlCi17Ci0JcHVibGljIElTb3VyY2VDb250YWluZXJbXSBjb21wdXRlU291cmNlQ29udGFpbmVycyhJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlMaXN0PElTb3VyY2VDb250YWluZXI+IGNvbnRhaW5lcnMgPSBuZXcgQXJyYXlMaXN0PElTb3VyY2VDb250YWluZXI+KCk7Ci0KLQkJU3RyaW5nIHNvdXJjZUZpbGVFeHByID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0lOUFVUX0ZJTEUsIChTdHJpbmcpIG51bGwpOwotCQlJUGF0aCBzb3VyY2VGaWxlID0gZ2V0U3Vic3RpdHV0ZWRQYXRoKHNvdXJjZUZpbGVFeHByKTsKLQkJTGF1bmNoUGlwZWxpbmUgcGlwZWxpbmUgPSBoeWRyYXRlUGlwZWxpbmUoY29uZmlndXJhdGlvbik7Ci0KLQkJLy8gVE9ETyBoYXZlIHNvbWUgd2F5IG9mIGtub3dpbmcgd2hldGhlciBpdCBpcyBhbiBJUmVzb3VyY2Ugb3Igbm90Ci0JCWNvbnRhaW5lcnMuYWRkKG5ldyBEaXJlY3RvcnlTb3VyY2VDb250YWluZXIoc291cmNlRmlsZSwgZmFsc2UpKTsKLQotCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ZXIgPSBwaXBlbGluZS5nZXRUcmFuc2Zvcm1EZWZzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotCQl7Ci0JCQlMYXVuY2hUcmFuc2Zvcm0gdHJhbnNmb3JtID0gKExhdW5jaFRyYW5zZm9ybSkgaXRlci5uZXh0KCk7Ci0JCQlJUGF0aCBwYXRoID0gdHJhbnNmb3JtLmdldFBhdGgoKTsKLQkJCUlTb3VyY2VDb250YWluZXIgc291cmNlQ29udGFpbmVyID0gbnVsbDsKLQkJCWlmICh0cmFuc2Zvcm0uZ2V0UGF0aFR5cGUoKS5lcXVhbHMoTGF1bmNoVHJhbnNmb3JtLlJFU09VUkNFX1RZUEUpKQotCQkJewotCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihwYXRoKTsKLQkJCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IHJlc291cmNlLmdldFBhcmVudCgpOwotCQkJCWlmIChjb250YWluZXIuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKQotCQkJCXsKLQkJCQkJc291cmNlQ29udGFpbmVyID0gbmV3IFByb2plY3RTb3VyY2VDb250YWluZXIoKElQcm9qZWN0KSBjb250YWluZXIsIGZhbHNlKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoY29udGFpbmVyLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSKQotCQkJCXsKLQkJCQkJc291cmNlQ29udGFpbmVyID0gbmV3IEZvbGRlclNvdXJjZUNvbnRhaW5lcihjb250YWluZXIsIGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJc291cmNlQ29udGFpbmVyID0gbmV3IERpcmVjdG9yeVNvdXJjZUNvbnRhaW5lcihwYXRoLCBmYWxzZSk7Ci0JCQl9Ci0JCQljb250YWluZXJzLmFkZChzb3VyY2VDb250YWluZXIpOwotCQl9Ci0KLQkJLy8gaWYgKHNvdXJjZUNvbnRhaW5lciA9PSBudWxsKQotCQkvLyB7Ci0JCS8vIHNvdXJjZUNvbnRhaW5lciA9IG5ldyBXb3Jrc3BhY2VTb3VyY2VDb250YWluZXIoKTsKLQkJLy8gfQotCi0JCXJldHVybiBjb250YWluZXJzLnRvQXJyYXkobmV3IElTb3VyY2VDb250YWluZXJbMF0pOwotCX0KLQotCXByaXZhdGUgc3RhdGljIExhdW5jaFBpcGVsaW5lIGh5ZHJhdGVQaXBlbGluZShJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJTGF1bmNoUGlwZWxpbmUgcGlwZWxpbmUgPSBudWxsOwotCQlTdHJpbmcgcyA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QSVBFTElORSwgKFN0cmluZykgbnVsbCk7Ci0JCWlmIChzICE9IG51bGwgJiYgcy5sZW5ndGgoKSA+IDApCi0JCXsKLQkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHMuZ2V0Qnl0ZXMoKSk7Ci0JCQlwaXBlbGluZSA9IExhdW5jaFBpcGVsaW5lLmZyb21YTUwoaW5wdXRTdHJlYW0pOwotCQl9Ci0JCXJldHVybiBwaXBlbGluZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJUGF0aCBnZXRTdWJzdGl0dXRlZFBhdGgoU3RyaW5nIHBhdGgpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlpZiAocGF0aCAhPSBudWxsKQotCQl7Ci0JCQlwYXRoID0gVmFyaWFibGVzUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdHJpbmdWYXJpYWJsZU1hbmFnZXIoKS5wZXJmb3JtU3RyaW5nU3Vic3RpdHV0aW9uKHBhdGgpOwotCQkJcmV0dXJuIG5ldyBQYXRoKHBhdGgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MTExZmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLVV0aWxzXzA9RXJyb3IgZGV0ZXJtaW5pbmcgamFyIGZpbGUgbG9jYXRpb246IAotVXRpbHNfMT1cIGZyb20gYnVuZGxlOiAKLVhTTERlYnVnVGFyZ2V0XzA9VW5hYmxlIHRvIGNvbm5lY3QgdG8gZGVidWdnZXIKLVhTTERlYnVnVGFyZ2V0XzE9bG9jYWxob3N0Ci1YU0xEZWJ1Z1RhcmdldF8xOT1SZXF1ZXN0IGZhaWxlZDogCi1YU0xEZWJ1Z1RhcmdldF8yPUNvdWxkIG5vdCBjb25uZWN0IHRvIHNvY2tldCAKLVhTTERlYnVnVGFyZ2V0XzIwPUV2ZW50IERpc3BhdGNoCi1YU0xEZWJ1Z1RhcmdldF8zPVwgYWZ0ZXIgCi1YU0xEZWJ1Z1RhcmdldF80PVwgYXR0ZW1wdHMKLVhTTExpbmVCcmVha3BvaW50XzA9TGluZSBCcmVha3BvaW50OiAKLVhTTFN0YWNrRnJhbWVfNT1cIGxpbmU6IApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL1hTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL1hTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M0OTA0ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9YU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nLkxhdW5jaGluZ1BsdWdpbjsKLQotcHVibGljIGNsYXNzIFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMKLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0lOUFVUX0ZJTEUgPSBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lEICsgIi5BVFRSX0lOUFVUX0ZJTEUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9VU0VfREVGQVVMVF9PVVRQVVRfRklMRSA9IExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQgKyAiLkFUVFJfVVNFX0RFRkFVTFRfT1VUUFVUX0ZJTEUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQHNpbmNlIDEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfT1VUUFVUX0ZPTERFUiA9IExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQgKyAiLkFUVFJfT1VUUFVUX0ZPTERFUiI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBAc2luY2UgMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9PVVRQVVRfRklMRU5BTUUgPSBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lEICsgIi5BVFRSX09VVFBVVF9GSUxFTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9MQVVOQ0hfQ09ORklHX1RZUEUgPSBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lEICsgIi5sYXVuY2hDb25maWd1cmF0aW9uVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1BJUEVMSU5FID0gTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCArICIuQVRUUl9QSVBFTElORSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX09QRU5fRklMRSA9IExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQgKyAiLkFUVFJfT1BFTl9GSUxFIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIEBzaW5jZSAxLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0ZPUk1BVF9GSUxFID0gTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCArICIuQVRUUl9GT1JNQVRfRklMRSI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL1hTTFRSdW50aW1lLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9YU0xUUnVudGltZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGM3NmRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL1hTTFRSdW50aW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS52YXJpYWJsZXMuVmFyaWFibGVzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nLkxhdW5jaGluZ1BsdWdpbjsKLQotcHVibGljIGNsYXNzIFhTTFRSdW50aW1lCi17Ci0JcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIE5FWFRfSURfTE9DSyA9IG5ldyBieXRlWzBdOwotCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBSRUdJU1RSWV9MT0NLID0gbmV3IGJ5dGVbMF07Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgbGFzdFN0YW5kaW5JRDsKLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHNhdmVQcmVmZXJlbmNlcygpCi0JewotCQlMYXVuY2hpbmdQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKCkKLQl7Ci0JCXJldHVybiBMYXVuY2hpbmdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGRlZmF1bHQgT3V0cHV0IEZpbGUgZm9yIHRoZSBnaXZlbiBpbnB1dCBmaWxlIHN0cmluZy4KLQkgKiBAcmV0dXJuIFJldHVybnMgYW4gSVBhdGggZm9yIHRoZSBPdXRwdXQgRmlsZS4KLQkgKiBAc2luY2UgMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGF0aCBkZWZhdWx0T3V0cHV0RmlsZUZvcklucHV0RmlsZShTdHJpbmcgaW5wdXRGaWxlRXhwcmVzc2lvbikgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCVN0cmluZyBmaWxlID0gVmFyaWFibGVzUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdHJpbmdWYXJpYWJsZU1hbmFnZXIoKS5wZXJmb3JtU3RyaW5nU3Vic3RpdHV0aW9uKGlucHV0RmlsZUV4cHJlc3Npb24pOwotCQlJUGF0aCBpbnB1dEZpbGVQYXRoID0gbmV3IFBhdGgoZmlsZSk7Ci0JCWlucHV0RmlsZVBhdGggPSBpbnB1dEZpbGVQYXRoLnJlbW92ZUZpbGVFeHRlbnNpb24oKTsKLQkJaW5wdXRGaWxlUGF0aCA9IGlucHV0RmlsZVBhdGguYWRkRmlsZUV4dGVuc2lvbigib3V0LnhtbCIpOwotCQlyZXR1cm4gaW5wdXRGaWxlUGF0aDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL2NvbmZpZy9CYXNlTGF1bmNoSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9jb25maWcvQmFzZUxhdW5jaEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGFiODU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL2NvbmZpZy9CYXNlTGF1bmNoSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuY29uZmlnOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuU2VydmVyU29ja2V0OwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUudmFyaWFibGVzLlZhcmlhYmxlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nLkxhdW5jaGluZ1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5YU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLlhTTFRSdW50aW1lOwotCi0vKioKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEJhc2VMYXVuY2hIZWxwZXIKLXsKLQlwcml2YXRlIGZpbmFsIFVSTCBzb3VyY2U7Ci0JcHJpdmF0ZSBmaW5hbCBGaWxlIHRhcmdldDsKLQlwcm90ZWN0ZWQgZmluYWwgTGF1bmNoUGlwZWxpbmUgcGlwZWxpbmU7Ci0JcHJpdmF0ZSBpbnQgcmVxdWVzdFBvcnQgPSAtMTsKLQlwcml2YXRlIGludCBldmVudFBvcnQgPSAtMTsKLQlwcml2YXRlIGludCBnZW5lcmF0ZVBvcnQgPSAtMTsKLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gb3BlbkZpbGVPbkNvbXBsZXRpb247Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIGZvcm1hdEZpbGVPbkNvbXBsZXRpb247Ci0KLQlwdWJsaWMgQmFzZUxhdW5jaEhlbHBlcihJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJc291cmNlID0gaHlkcmF0ZVNvdXJjZUZpbGVVUkwoY29uZmlndXJhdGlvbik7Ci0JCXRhcmdldCA9IGh5ZHJhdGVPdXRwdXRGaWxlKGNvbmZpZ3VyYXRpb24pOwotCQlwaXBlbGluZSA9IGh5ZHJhdGVQaXBlbGluZShjb25maWd1cmF0aW9uKTsKLQkJb3BlbkZpbGVPbkNvbXBsZXRpb24gPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfT1BFTl9GSUxFLCB0cnVlKTsKLQkJZm9ybWF0RmlsZU9uQ29tcGxldGlvbiA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9GT1JNQVRfRklMRSwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0UmVxdWVzdFBvcnQoKQotCXsKLQkJaWYgKHJlcXVlc3RQb3J0ID09IC0xKQotCQkJcmVxdWVzdFBvcnQgPSBmaW5kRnJlZVBvcnQoKTsKLQkJcmV0dXJuIHJlcXVlc3RQb3J0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RXZlbnRQb3J0KCkKLQl7Ci0JCWlmIChldmVudFBvcnQgPT0gLTEpCi0JCQlldmVudFBvcnQgPSBmaW5kRnJlZVBvcnQoKTsKLQkJcmV0dXJuIGV2ZW50UG9ydDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEdlbmVyYXRlUG9ydCgpCi0JewotCQlpZiAoZ2VuZXJhdGVQb3J0ID09IC0xKQotCQkJZ2VuZXJhdGVQb3J0ID0gZmluZEZyZWVQb3J0KCk7Ci0JCXJldHVybiBnZW5lcmF0ZVBvcnQ7Ci0JfQotCi0JcHVibGljIExhdW5jaFBpcGVsaW5lIGdldFBpcGVsaW5lKCkKLQl7Ci0JCXJldHVybiBwaXBlbGluZTsKLQl9Ci0KLQlwdWJsaWMgVVJMIGdldFNvdXJjZSgpCi0JewotCQlyZXR1cm4gc291cmNlOwotCX0KLQotCXB1YmxpYyBGaWxlIGdldFRhcmdldCgpCi0JewotCQlyZXR1cm4gdGFyZ2V0OwotCX0KLQotCXByaXZhdGUgc3RhdGljIExhdW5jaFBpcGVsaW5lIGh5ZHJhdGVQaXBlbGluZShJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJTGF1bmNoUGlwZWxpbmUgcGlwZWxpbmUgPSBudWxsOwotCQlTdHJpbmcgcyA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QSVBFTElORSwgKFN0cmluZykgbnVsbCk7Ci0JCWlmIChzICE9IG51bGwgJiYgcy5sZW5ndGgoKSA+IDApCi0JCXsKLQkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHMuZ2V0Qnl0ZXMoKSk7Ci0JCQlwaXBlbGluZSA9IExhdW5jaFBpcGVsaW5lLmZyb21YTUwoaW5wdXRTdHJlYW0pOwotCQl9Ci0JCXJldHVybiBwaXBlbGluZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFVSTCBoeWRyYXRlU291cmNlRmlsZVVSTChJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJSVBhdGggc291cmNlRmlsZSA9IGh5ZHJhdGVTb3VyY2VGaWxlKGNvbmZpZ3VyYXRpb24pOwotCQlyZXR1cm4gcGF0aFRvVVJMKHNvdXJjZUZpbGUpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBJUGF0aCBoeWRyYXRlU291cmNlRmlsZShJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJU3RyaW5nIHNvdXJjZUZpbGVFeHByID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0lOUFVUX0ZJTEUsIChTdHJpbmcpIG51bGwpOwotCQlyZXR1cm4gZ2V0U3Vic3RpdHV0ZWRQYXRoKHNvdXJjZUZpbGVFeHByKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFVSTCBwYXRoVG9VUkwoSVBhdGggc291cmNlRmlsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCVVSTCB1cmwgPSBudWxsOwotCQl0cnkKLQkJewotCQkJdXJsID0gc291cmNlRmlsZS50b0ZpbGUoKS50b1VSTCgpOwotCQl9Ci0JCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLQkJewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lELCBJU3RhdHVzLkVSUk9SLCBzb3VyY2VGaWxlLnRvU3RyaW5nKCksIGUpKTsKLQkJfQotCQlyZXR1cm4gdXJsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRmlsZSBoeWRyYXRlT3V0cHV0RmlsZShJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJSVBhdGggb3V0cHV0RmlsZSA9IG51bGw7Ci0JCWJvb2xlYW4gdXNlRGVmYXVsdE91dHB1dEZpbGUgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfVVNFX0RFRkFVTFRfT1VUUFVUX0ZJTEUsIHRydWUpOwotCQlpZiAoIXVzZURlZmF1bHRPdXRwdXRGaWxlKQotCQl7Ci0JCQlTdHJpbmcgb3V0cHV0RmlsZU5hbWUgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfT1VUUFVUX0ZJTEVOQU1FLCAoU3RyaW5nKSBudWxsKTsKLQkJCVN0cmluZyBvdXRwdXRGb2xkZXJFeHByID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX09VVFBVVF9GT0xERVIsIChTdHJpbmcpIG51bGwpOwotCQkJb3V0cHV0RmlsZSA9IGdldFN1YnN0aXR1dGVkUGF0aChvdXRwdXRGb2xkZXJFeHByKS5hcHBlbmQob3V0cHV0RmlsZU5hbWUpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJb3V0cHV0RmlsZSA9IFhTTFRSdW50aW1lLmRlZmF1bHRPdXRwdXRGaWxlRm9ySW5wdXRGaWxlKGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9JTlBVVF9GSUxFLCAoU3RyaW5nKSBudWxsKSk7Ci0JCX0KLQkJcmV0dXJuIG91dHB1dEZpbGUudG9GaWxlKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSVBhdGggZ2V0U3Vic3RpdHV0ZWRQYXRoKFN0cmluZyBwYXRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJaWYgKHBhdGggIT0gbnVsbCkKLQkJewotCQkJcGF0aCA9IFZhcmlhYmxlc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RyaW5nVmFyaWFibGVNYW5hZ2VyKCkucGVyZm9ybVN0cmluZ1N1YnN0aXR1dGlvbihwYXRoKTsKLQkJCXJldHVybiBuZXcgUGF0aChwYXRoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgZnJlZSBwb3J0IG51bWJlciBvbiBsb2NhbGhvc3QsIG9yIC0xIGlmIHVuYWJsZSB0byBmaW5kIGEgZnJlZQotCSAqIHBvcnQuCi0JICogCi0JICogQHJldHVybiBhIGZyZWUgcG9ydCBudW1iZXIgb24gbG9jYWxob3N0LCBvciAtMSBpZiB1bmFibGUgdG8gZmluZCBhIGZyZWUKLQkgKiAgICAgICAgIHBvcnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBmaW5kRnJlZVBvcnQoKQotCXsKLQkJU2VydmVyU29ja2V0IHNvY2tldCA9IG51bGw7Ci0JCXRyeQotCQl7Ci0JCQlzb2NrZXQgPSBuZXcgU2VydmVyU29ja2V0KDApOwotCQkJcmV0dXJuIHNvY2tldC5nZXRMb2NhbFBvcnQoKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkKLQkJewotCQkJTGF1bmNoaW5nUGx1Z2luLmxvZyhlKTsKLQkJfQotCQlmaW5hbGx5Ci0JCXsKLQkJCWlmIChzb2NrZXQgIT0gbnVsbCkKLQkJCXsKLQkJCQl0cnkKLQkJCQl7Ci0JCQkJCXNvY2tldC5jbG9zZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkKLQkJCQl7Ci0JCQkJCUxhdW5jaGluZ1BsdWdpbi5sb2coZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRPcGVuRmlsZU9uQ29tcGxldGlvbigpCi0JewotCQlyZXR1cm4gb3BlbkZpbGVPbkNvbXBsZXRpb247Ci0JfQotCQotCi0JcHVibGljIGJvb2xlYW4gZ2V0Rm9ybWF0RmlsZU9uQ29tcGxldGlvbigpCi0JewotCQlyZXR1cm4gZm9ybWF0RmlsZU9uQ29tcGxldGlvbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL2NvbmZpZy9MYXVuY2hBdHRyaWJ1dGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL2NvbmZpZy9MYXVuY2hBdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZmMWM5ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9jb25maWcvTGF1bmNoQXR0cmlidXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5jb25maWc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnZhcmlhYmxlcy5WYXJpYWJsZXNQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBMYXVuY2hBdHRyaWJ1dGUKLXsKLQlwdWJsaWMgZmluYWwgU3RyaW5nIHVyaTsKLQlwdWJsaWMgU3RyaW5nIHR5cGU7Ci0JcHVibGljIFN0cmluZyB2YWx1ZTsKLQotCXB1YmxpYyBMYXVuY2hBdHRyaWJ1dGUoU3RyaW5nIHVyaSwgU3RyaW5nIHR5cGUsIFN0cmluZyB2YWx1ZSkKLQl7Ci0JCXRoaXMudXJpID0gdXJpOwotCQl0aGlzLnR5cGUgPSB0eXBlOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKQotCXsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFJlc29sdmVkVmFsdWUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIFZhcmlhYmxlc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RyaW5nVmFyaWFibGVNYW5hZ2VyKCkucGVyZm9ybVN0cmluZ1N1YnN0aXR1dGlvbih2YWx1ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpCi0JewotCQlyZXR1cm4gdXJpLmhhc2hDb2RlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopCi0JewotCQlpZiAob2JqIGluc3RhbmNlb2YgTGF1bmNoQXR0cmlidXRlKQotCQl7Ci0JCQlMYXVuY2hBdHRyaWJ1dGUgYXR0ID0gKExhdW5jaEF0dHJpYnV0ZSkgb2JqOwotCQkJcmV0dXJuIGF0dC51cmkuZXF1YWxzKHVyaSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9jb25maWcvTGF1bmNoUGlwZWxpbmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL2NvbmZpZy9MYXVuY2hQaXBlbGluZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTRjYTM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL2NvbmZpZy9MYXVuY2hQaXBlbGluZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmNvbmZpZzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZy5MYXVuY2hpbmdQbHVnaW47Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBMYXVuY2hQaXBlbGluZQotewotCXByaXZhdGUgTGlzdDxMYXVuY2hUcmFuc2Zvcm0+IHRyYW5zZm9ybURlZnMgPSBuZXcgQXJyYXlMaXN0PExhdW5jaFRyYW5zZm9ybT4oKTsKLQlwcml2YXRlIGZpbmFsIFByb3BlcnRpZXMgb3V0cHV0UHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0KLQlwdWJsaWMgUHJvcGVydGllcyBnZXRPdXRwdXRQcm9wZXJ0aWVzKCkKLQl7Ci0JCXJldHVybiBvdXRwdXRQcm9wZXJ0aWVzOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZE91dHB1dFByb3BlcnR5KFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpCi0JewotCQlvdXRwdXRQcm9wZXJ0aWVzLnB1dChuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIExpc3Q8TGF1bmNoVHJhbnNmb3JtPiBnZXRUcmFuc2Zvcm1EZWZzKCkKLQl7Ci0JCXJldHVybiB0cmFuc2Zvcm1EZWZzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRyYW5zZm9ybURlZnMoTGlzdDxMYXVuY2hUcmFuc2Zvcm0+IHRyYW5zZm9ybXMpCi0JewotCQl0cmFuc2Zvcm1EZWZzID0gdHJhbnNmb3JtczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRUcmFuc2Zvcm1EZWYoTGF1bmNoVHJhbnNmb3JtIHRkZWYpCi0JewotCQl0ZGVmLnNldFBpcGVsaW5lKHRoaXMpOwotCQl0cmFuc2Zvcm1EZWZzLmFkZCh0ZGVmKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVUcmFuc2Zvcm1EZWYoTGF1bmNoVHJhbnNmb3JtIHRkZWYpCi0JewotCQl0cmFuc2Zvcm1EZWZzLnJlbW92ZSh0ZGVmKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvWE1MKCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCVN0cmluZyB4bWwgPSBudWxsOwotCQl0cnkKLQkJewotCQkJRG9jdW1lbnQgZG9jID0gUHJlZmVyZW5jZVV0aWwuZ2V0RG9jdW1lbnQoKTsKLQkJCUVsZW1lbnQgcm9vdEVsID0gZG9jLmNyZWF0ZUVsZW1lbnQoIlBpcGVsaW5lIik7IC8vJE5PTi1OTFMtMSQKLQkJCWRvYy5hcHBlbmRDaGlsZChyb290RWwpOwotCi0JCQlFbGVtZW50IG9wRWwgPSBkb2MuY3JlYXRlRWxlbWVudCgiT3V0cHV0UHJvcGVydGllcyIpOyAvLyROT04tTkxTLTEkCi0JCQlyb290RWwuYXBwZW5kQ2hpbGQob3BFbCk7Ci0JCQlmb3IgKE9iamVjdCBlbGVtZW50IDogb3V0cHV0UHJvcGVydGllcy5lbnRyeVNldCgpKQotCQkJewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGVsZW1lbnQ7Ci0JCQkJRWxlbWVudCBwcm9wRWwgPSBkb2MuY3JlYXRlRWxlbWVudCgiUHJvcGVydHkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXByb3BFbC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlwcm9wRWwuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIChTdHJpbmcpIGVudHJ5LmdldFZhbHVlKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJb3BFbC5hcHBlbmRDaGlsZChwcm9wRWwpOwotCQkJfQotCi0JCQlmb3IgKEl0ZXJhdG9yPExhdW5jaFRyYW5zZm9ybT4gaXRlciA9IHRyYW5zZm9ybURlZnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotCQkJewotCQkJCUxhdW5jaFRyYW5zZm9ybSB0ZGVmID0gaXRlci5uZXh0KCk7Ci0JCQkJRWxlbWVudCB0ZGVmRWwgPSB0ZGVmLmFzWE1MKGRvYyk7Ci0JCQkJcm9vdEVsLmFwcGVuZENoaWxkKHRkZWZFbCk7Ci0JCQl9Ci0KLQkJCXhtbCA9IFByZWZlcmVuY2VVdGlsLnNlcmlhbGl6ZURvY3VtZW50KGRvYyk7Ci0JCX0KLQkJY2F0Y2ggKERPTUV4Y2VwdGlvbiBlKQotCQl7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQsIDAsIGUuZ2V0TWVzc2FnZSgpLCBlKSk7Ci0JCX0KLQkJY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkKLQkJewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lELCAwLCBlLmdldE1lc3NhZ2UoKSwgZSkpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKQotCQl7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQsIDAsIGUuZ2V0TWVzc2FnZSgpLCBlKSk7Ci0JCX0KLQkJY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGUpCi0JCXsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCwgMCwgZS5nZXRNZXNzYWdlKCksIGUpKTsKLQkJfQotCQlyZXR1cm4geG1sOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGF1bmNoUGlwZWxpbmUgZnJvbVhNTChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCURvY3VtZW50IGRvYyA9IFByZWZlcmVuY2VVdGlsLmdldERvY3VtZW50KGlucHV0U3RyZWFtKTsKLQotCQlMYXVuY2hQaXBlbGluZSBwZGVmID0gbmV3IExhdW5jaFBpcGVsaW5lKCk7Ci0KLQkJRWxlbWVudCByb290RWwgPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0KLQkJRWxlbWVudCBvcEVsID0gKEVsZW1lbnQpIHJvb3RFbC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiT3V0cHV0UHJvcGVydGllcyIpLml0ZW0oMCk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG9wRWwgIT0gbnVsbCkKLQkJewotCQkJTm9kZUxpc3QgcHJvcEVscyA9IG9wRWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlByb3BlcnR5Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcEVscy5nZXRMZW5ndGgoKTsgaSsrKQotCQkJewotCQkJCUVsZW1lbnQgcHJvcEVsID0gKEVsZW1lbnQpIHByb3BFbHMuaXRlbShpKTsKLQkJCQlTdHJpbmcgbmFtZSA9IHByb3BFbC5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyB2YWx1ZSA9IHByb3BFbC5nZXRBdHRyaWJ1dGUoInZhbHVlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlwZGVmLmFkZE91dHB1dFByb3BlcnR5KG5hbWUsIHZhbHVlKTsKLQkJCX0KLQkJfQotCi0JCU5vZGVMaXN0IHRyYW5zZm9ybUVscyA9IHJvb3RFbC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVHJhbnNmb3JtIik7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0cmFuc2Zvcm1FbHMuZ2V0TGVuZ3RoKCk7IGkrKykKLQkJewotCQkJRWxlbWVudCB0cmFuc2Zvcm1FbCA9IChFbGVtZW50KSB0cmFuc2Zvcm1FbHMuaXRlbShpKTsKLQkJCUxhdW5jaFRyYW5zZm9ybSB0ZGVmID0gTGF1bmNoVHJhbnNmb3JtLmZyb21YTUwodHJhbnNmb3JtRWwpOwotCQkJcGRlZi5hZGRUcmFuc2Zvcm1EZWYodGRlZik7Ci0JCX0KLQotCQlyZXR1cm4gcGRlZjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9jb25maWcvTGF1bmNoVHJhbnNmb3JtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9jb25maWcvTGF1bmNoVHJhbnNmb3JtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMjUyOGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvY29uZmlnL0xhdW5jaFRyYW5zZm9ybS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmNvbmZpZzsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnZhcmlhYmxlcy5WYXJpYWJsZXNQbHVnaW47Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotcHVibGljIGNsYXNzIExhdW5jaFRyYW5zZm9ybQotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX1RZUEUgPSAicmVzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURVJOQUxfVFlQRSA9ICJleHRlcm5hbCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIHN0eWxlc2hlZXQ7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcGF0aFR5cGU7Ci0JcHJpdmF0ZSBTdHJpbmcgcmVzb2x2ZXI7Ci0JcHJpdmF0ZSBmaW5hbCBTZXQ8TGF1bmNoQXR0cmlidXRlPiBwYXJhbWV0ZXJzID0gbmV3IEhhc2hTZXQ8TGF1bmNoQXR0cmlidXRlPigpOwotCXByaXZhdGUgTGF1bmNoUGlwZWxpbmUgcGlwZWxpbmU7Ci0KLQkvKioKLQkgKiBUaGUgcGF0aCBtYXkgYmUgYW4gSVJlc291cmNlIHRvIGEgZmlsZSBpbiB0aGUgd29ya3NwYWNlLCBvciBhbiBJUGF0aCB0byBhCi0JICogZmlsZSBvdXRzaWRlIG9mIHRoZSB3b3Jrc3BhY2UgLSBkZXBlbmRpbmcgb24gdGhlIHBhdGhUeXBlLiBUaGUgcGF0aAotCSAqIHNob3VsZCBiZSBjcmVhdGVkIHVzaW5nIElQYXRoLnRvUG9ydGFibGVTdHJpbmcoKS4gVGhlIHBhdGggbWF5IGFsc28KLQkgKiBjb250YWluIHZhcmlhYmxlcyBkZWZpbmVkIGJ5IHRoZSBWYXJpYWJsZVBsdWdpbi4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqIEBwYXJhbSBwYXRoVHlwZQotCSAqLwotCXB1YmxpYyBMYXVuY2hUcmFuc2Zvcm0oU3RyaW5nIHBhdGgsIFN0cmluZyBwYXRoVHlwZSkKLQl7Ci0JCXN0eWxlc2hlZXQgPSBwYXRoOwotCQl0aGlzLnBhdGhUeXBlID0gcGF0aFR5cGU7Ci0JfQotCi0JcHVibGljIFNldDxMYXVuY2hBdHRyaWJ1dGU+IGdldFBhcmFtZXRlcnMoKQotCXsKLQkJcmV0dXJuIHBhcmFtZXRlcnM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZFBhcmFtZXRlcihMYXVuY2hBdHRyaWJ1dGUgcGFyYW1ldGVyKQotCXsKLQkJcGFyYW1ldGVycy5hZGQocGFyYW1ldGVyKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFJlc29sdmVyKCkKLQl7Ci0JCXJldHVybiByZXNvbHZlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZXNvbHZlcihTdHJpbmcgcmVzb2x2ZXIpCi0JewotCQl0aGlzLnJlc29sdmVyID0gcmVzb2x2ZXI7Ci0JfQotCi0JcHVibGljIElQYXRoIGdldFBhdGgoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJU3RyaW5nIHN1YnN0aXR1dGVkVmFsdWUgPSBWYXJpYWJsZXNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0cmluZ1ZhcmlhYmxlTWFuYWdlcigpLnBlcmZvcm1TdHJpbmdTdWJzdGl0dXRpb24oc3R5bGVzaGVldCk7Ci0JCXJldHVybiBQYXRoLmZyb21Qb3J0YWJsZVN0cmluZyhzdWJzdGl0dXRlZFZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhdGhUeXBlKCkKLQl7Ci0JCXJldHVybiBwYXRoVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZnVsbCBwYXRoIHRvIHRoZSBmaWxlIGluIHRoZSBsb2NhbCBmaWxlIHN5c3RlbSAod2l0aCBhbnkgc3RyaW5nCi0JICogc3Vic2l0dXRpb25zIGFscmVhZHkgbWFkZSkuCi0JICogCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRMb2NhdGlvbigpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlJUGF0aCBwYXJ0aWFsUGF0aCA9IGdldFBhdGgoKTsKLQkJSVBhdGggZnVsbFBhdGggPSBudWxsOwotCQlpZiAoUkVTT1VSQ0VfVFlQRS5lcXVhbHMocGF0aFR5cGUpKQotCQl7Ci0JCQlJRmlsZSBmaWxlID0gKElGaWxlKSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIocGFydGlhbFBhdGgpOwotCQkJZnVsbFBhdGggPSBmaWxlLmdldExvY2F0aW9uKCk7Ci0JCX0KLQkJZWxzZSBpZiAoRVhURVJOQUxfVFlQRS5lcXVhbHMocGF0aFR5cGUpKQotCQl7Ci0JCQlmdWxsUGF0aCA9IHBhcnRpYWxQYXRoOwotCQl9Ci0JCXJldHVybiBmdWxsUGF0aDsKLQl9Ci0KLQlwdWJsaWMgRWxlbWVudCBhc1hNTChEb2N1bWVudCBkb2MpCi0JewotCQlFbGVtZW50IHRkZWZFbCA9IGRvYy5jcmVhdGVFbGVtZW50KCJUcmFuc2Zvcm0iKTsgLy8kTk9OLU5MUy0xJAotCQl0ZGVmRWwuc2V0QXR0cmlidXRlKCJwYXRoIiwgc3R5bGVzaGVldCk7IC8vJE5PTi1OTFMtMSQKLQkJdGRlZkVsLnNldEF0dHJpYnV0ZSgicGF0aFR5cGUiLCBwYXRoVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHJlc29sdmVyICE9IG51bGwpCi0JCQl0ZGVmRWwuc2V0QXR0cmlidXRlKCJ1cmlSZXNvbHZlciIsIHJlc29sdmVyKTsgLy8kTk9OLU5MUy0xJAotCQlFbGVtZW50IHBhcmFtc0VsID0gZG9jLmNyZWF0ZUVsZW1lbnQoIlBhcmFtZXRlcnMiKTsgLy8kTk9OLU5MUy0xJAotCQl0ZGVmRWwuYXBwZW5kQ2hpbGQocGFyYW1zRWwpOwotCQlmb3IgKEl0ZXJhdG9yPExhdW5jaEF0dHJpYnV0ZT4gaXRlciA9IHBhcmFtZXRlcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotCQl7Ci0JCQlMYXVuY2hBdHRyaWJ1dGUgcGFyYW0gPSBpdGVyLm5leHQoKTsKLQkJCUVsZW1lbnQgcHJvcEVsID0gZG9jLmNyZWF0ZUVsZW1lbnQoIlBhcmFtZXRlciIpOyAvLyROT04tTkxTLTEkCi0JCQlwcm9wRWwuc2V0QXR0cmlidXRlKCJuYW1lIiwgcGFyYW0udXJpKTsgLy8kTk9OLU5MUy0xJAotCQkJcHJvcEVsLnNldEF0dHJpYnV0ZSgidmFsdWUiLCBwYXJhbS52YWx1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCXBhcmFtc0VsLmFwcGVuZENoaWxkKHByb3BFbCk7Ci0JCX0KLQkJcmV0dXJuIHRkZWZFbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExhdW5jaFRyYW5zZm9ybSBmcm9tWE1MKEVsZW1lbnQgdHJhbnNmb3JtRWwpCi0JewotCQlTdHJpbmcgcGF0aCA9IHRyYW5zZm9ybUVsLmdldEF0dHJpYnV0ZSgicGF0aCIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBwYXRoVHlwZSA9IHRyYW5zZm9ybUVsLmdldEF0dHJpYnV0ZSgicGF0aFR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCi0JCUxhdW5jaFRyYW5zZm9ybSB0ZGVmID0gbmV3IExhdW5jaFRyYW5zZm9ybShwYXRoLCBwYXRoVHlwZSk7Ci0KLQkJU3RyaW5nIHVyaVJlc29sdmVyID0gdHJhbnNmb3JtRWwuZ2V0QXR0cmlidXRlKCJ1cmlSZXNvbHZlciIpOyAvLyROT04tTkxTLTEkCi0JCXRkZWYuc2V0UmVzb2x2ZXIodXJpUmVzb2x2ZXIpOwotCi0JCUVsZW1lbnQgcGFyYW1zRWwgPSAoRWxlbWVudCkgdHJhbnNmb3JtRWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlBhcmFtZXRlcnMiKS5pdGVtKDApOyAvLyROT04tTkxTLTEkCi0JCU5vZGVMaXN0IHBhcmFtRWxzID0gcGFyYW1zRWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlBhcmFtZXRlciIpOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1FbHMuZ2V0TGVuZ3RoKCk7IGkrKykKLQkJewotCQkJRWxlbWVudCBwYXJhbUVsID0gKEVsZW1lbnQpIHBhcmFtRWxzLml0ZW0oaSk7Ci0JCQlTdHJpbmcgbmFtZSA9IHBhcmFtRWwuZ2V0QXR0cmlidXRlKCJuYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyB0eXBlID0gcGFyYW1FbC5nZXRBdHRyaWJ1dGUoInR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHZhbHVlID0gcGFyYW1FbC5nZXRBdHRyaWJ1dGUoInZhbHVlIik7IC8vJE5PTi1OTFMtMSQKLQkJCXRkZWYuYWRkUGFyYW1ldGVyKG5ldyBMYXVuY2hBdHRyaWJ1dGUobmFtZSwgdHlwZSwgdmFsdWUpKTsKLQkJfQotCi0JCXJldHVybiB0ZGVmOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBpcGVsaW5lKExhdW5jaFBpcGVsaW5lIHBpcGVsaW5lKQotCXsKLQkJdGhpcy5waXBlbGluZSA9IHBpcGVsaW5lOwotCX0KLQotCXB1YmxpYyBMYXVuY2hQaXBlbGluZSBnZXRQaXBlbGluZSgpCi0JewotCQlyZXR1cm4gcGlwZWxpbmU7Ci0JfQotCi0JLyoKLQkgKiBwcml2YXRlIEZpbGUgZ2V0VVJJUmVzb2x2ZXJEaXJlY3RvcnkoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikKLQkgKiB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7IEZpbGUgcmVzb2x2ZXJEaXIgPSBudWxsOyBTdHJpbmcgYmFzZVVSSVR5cGUgPQotCSAqIGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9CQVNFX1VSSV9UWVBFLAotCSAqIFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQkFTRV9VUklfV09SS0lOR19ESVJfUkVMQVRJVkUpOyBpZgotCSAqIChYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkJBU0VfVVJJX0FCU09MVVRFLmVxdWFscyhiYXNlVVJJVHlwZSkpIHsKLQkgKiBTdHJpbmcgdXJpRGlyID0KLQkgKiBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfQkFTRV9VUklfRElSRUNUT1JZLAotCSAqIChTdHJpbmcpbnVsbCk7IGlmICh1cmlEaXIhPW51bGwpIHsgU3RyaW5nIHBhdGhFeHByID0KLQkgKiBWYXJpYWJsZXNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0cmluZ1ZhcmlhYmxlTWFuYWdlcigpLnBlcmZvcm1TdHJpbmdTdWJzdGl0dXRpb24odXJpRGlyKTsKLQkgKiBQYXRoIHBhdGggPSBuZXcgUGF0aChwYXRoRXhwcik7IGlmIChwYXRoLmlzQWJzb2x1dGUoKSkgeyBGaWxlIGRpciA9IG5ldwotCSAqIEZpbGUocGF0aC50b09TU3RyaW5nKCkpOyBpZiAoZGlyLmlzRGlyZWN0b3J5KCkgJiYgZGlyLmV4aXN0cygpKSB7IHJldHVybgotCSAqIGRpcjsgfSAvLyBUaGlzIG1heSBiZSBhIHdvcmtzcGFjZSByZWxhdGl2ZSBwYXRoIHJldHVybmVkIGJ5IGEgdmFyaWFibGUuIC8vCi0JICogSG93ZXZlciB2YXJpYWJsZSBwYXRocyBzdGFydCB3aXRoIGEgc2xhc2ggYW5kIHRodXMgYXJlIHRob3VnaHQgdG8gLy8gYmUKLQkgKiBhYnNvbHV0ZSwgc28gZmFsbCB0aHJvdWdoIHRvIGJlbG93IH0gSVJlc291cmNlIHJlcyA9Ci0JICogUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kTWVtYmVyKHBhdGgpOyBpZiAocmVzCi0JICogaW5zdGFuY2VvZiBJQ29udGFpbmVyICYmIHJlcy5leGlzdHMoKSkgcmV0dXJuIHJlcy5nZXRMb2NhdGlvbigpLnRvRmlsZSgpOwotCSAqIGFib3J0KCJVUkkgcGF0aCBpcyBpbnZhbGlkIixudWxsLDApOyB9IH0gZWxzZSBpZgotCSAqIChYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkJBU0VfVVJJX1NUWUxFU0hFRVRfUkVMQVRJVkUuZXF1YWxzKGJhc2VVUklUeXBlKSkgewotCSAqIHJlc29sdmVyRGlyID0gZ2V0U3R5bGVzaGVldFJlbGF0aXZlVVJJUmVzb2x2ZXIoY29uZmlndXJhdGlvbik7IH0gLy8gbm8KLQkgKiBuZWVkIHRvIGhhbmRsZSB0aGUgY2FzZSBvZiB3b3JraW5nX2RpciByZWxhdGl2ZSAtIHRoaXMgaXMgdGhlIGRlZmF1bHQgZm9yCi0JICogSkFYUCBzbyByZXR1cm4gbnVsbCByZXR1cm4gcmVzb2x2ZXJEaXI7IH0KLQkgKiAKLQkgKiBwcml2YXRlIEZpbGUgZ2V0U3R5bGVzaGVldFJlbGF0aXZlVVJJUmVzb2x2ZXIoSUxhdW5jaENvbmZpZ3VyYXRpb24KLQkgKiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7IExpc3Qgc3R5bGVzaGVldHMgPQotCSAqIGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9TVFlMRVNIRUVUU19MSVNULChMaXN0KW51bGwpOwotCSAqIGlmIChzdHlsZXNoZWV0cyA9PSBudWxsIHx8IHN0eWxlc2hlZXRzLnNpemUoKSA9PSAwKSBhYm9ydCgiTm8gc3R5bGVzaGVldHMKLQkgKiBkZWZpbmVkIGZvciB0aGlzIGxhdW5jaCBjb25maWd1cmF0aW9uIiwgbnVsbCwgMCk7IGVsc2UgeyBTdHJpbmcgc2hlZXQgPQotCSAqIChTdHJpbmcpc3R5bGVzaGVldHMuZ2V0KDApOyBTdHJpbmcgcGF0aEV4cHIgPQotCSAqIFZhcmlhYmxlc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RyaW5nVmFyaWFibGVNYW5hZ2VyKCkucGVyZm9ybVN0cmluZ1N1YnN0aXR1dGlvbihzaGVldCk7Ci0JICogUGF0aCBwYXRoID0gbmV3IFBhdGgocGF0aEV4cHIpOyBpZiAocGF0aC5pc0Fic29sdXRlKCkpIHsgRmlsZSBmaWxlID0gbmV3Ci0JICogRmlsZShwYXRoLnRvT1NTdHJpbmcoKSk7IGlmIChmaWxlLmV4aXN0cygpKSB7IEZpbGUgZGlyID0KLQkgKiBmaWxlLmdldFBhcmVudEZpbGUoKTsgcmV0dXJuIGRpcjsgfSAvLyBUaGlzIG1heSBiZSBhIHdvcmtzcGFjZSByZWxhdGl2ZQotCSAqIHBhdGggcmV0dXJuZWQgYnkgYSB2YXJpYWJsZS4gLy8gSG93ZXZlciB2YXJpYWJsZSBwYXRocyBzdGFydCB3aXRoIGEgc2xhc2gKLQkgKiBhbmQgdGh1cyBhcmUgdGhvdWdodCB0byAvLyBiZSBhYnNvbHV0ZSBJUmVzb3VyY2UgcmVzID0KLQkgKiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIocGF0aCk7IElDb250YWluZXIKLQkgKiBwYXJlbnQgPSByZXMuZ2V0UGFyZW50KCk7IGlmIChwYXJlbnQuZXhpc3RzKCkpIHJldHVybgotCSAqIHBhcmVudC5nZXRMb2NhdGlvbigpLnRvRmlsZSgpOyBhYm9ydCgiU3R5bGVzaGVldCBwYXRoIGlzCi0JICogaW52YWxpZCIsbnVsbCwwKTsgfSBlbHNlIHsgSVJlc291cmNlIHJlcyA9Ci0JICogUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kTWVtYmVyKHBhdGgpOyBJQ29udGFpbmVyCi0JICogcGFyZW50ID0gcmVzLmdldFBhcmVudCgpOyBpZiAocGFyZW50LmV4aXN0cygpKSByZXR1cm4KLQkgKiBwYXJlbnQuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKTsgYWJvcnQoIlN0eWxlc2hlZXQgcGF0aCBpcwotCSAqIGludmFsaWQiLG51bGwsMCk7IH0gfSByZXR1cm4gbnVsbDsgfQotCSAqLwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvY29uZmlnL1ByZWZlcmVuY2VVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9jb25maWcvUHJlZmVyZW5jZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBlYzBkNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9jb25maWcvUHJlZmVyZW5jZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5jb25maWc7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3I7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLk91dHB1dEtleXM7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nLkxhdW5jaGluZ1BsdWdpbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLS8qKgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJlZmVyZW5jZVV0aWwKLXsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVDb3JlRXhjZXB0aW9uKFRocm93YWJsZSBlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lELCAwLCBlLmdldE1lc3NhZ2UoKSwgZSkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotCXsKLQkJRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkJRG9jdW1lbnRCdWlsZGVyIGRvY0J1aWxkZXIgPSBkZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLQkJRG9jdW1lbnQgZG9jID0gZG9jQnVpbGRlci5uZXdEb2N1bWVudCgpOwotCQlyZXR1cm4gZG9jOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcmlhbGl6ZURvY3VtZW50KERvY3VtZW50IGRvYykgdGhyb3dzIElPRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckV4Y2VwdGlvbgotCXsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHMgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0KLQkJVHJhbnNmb3JtZXJGYWN0b3J5IGZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkJVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSBmYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7Ci0JCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuTUVUSE9ELCAieG1sIik7ICAvLyROT04tTkxTLTEkCi0JCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuSU5ERU5ULCAieWVzIik7ICAvLyROT04tTkxTLTEkCi0KLQkJRE9NU291cmNlIHNvdXJjZSA9IG5ldyBET01Tb3VyY2UoZG9jKTsKLQkJU3RyZWFtUmVzdWx0IG91dHB1dFRhcmdldCA9IG5ldyBTdHJlYW1SZXN1bHQocyk7Ci0JCXRyYW5zZm9ybWVyLnRyYW5zZm9ybShzb3VyY2UsIG91dHB1dFRhcmdldCk7Ci0KLQkJcmV0dXJuIHMudG9TdHJpbmcoIlVURjgiKTsgCQkJIC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEVsZW1lbnRbXSBnZXRDaGlsZEVsZW1lbnRzKEVsZW1lbnQgcGFyZW50LCBTdHJpbmcgbmFtZSkKLQl7Ci0JCUxpc3Q8RWxlbWVudD4gY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PEVsZW1lbnQ+KCk7Ci0JCU5vZGVMaXN0IGxpc3QgPSBwYXJlbnQuZ2V0Q2hpbGROb2RlcygpOwotCQlpbnQgbGVuZ3RoID0gbGlzdC5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkKLQkJewotCQkJTm9kZSBub2RlID0gbGlzdC5pdGVtKGkpOwotCQkJc2hvcnQgdHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJCWlmICh0eXBlID09IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJewotCQkJCUVsZW1lbnQgcHJvY2Vzc29yRWxlbWVudCA9IChFbGVtZW50KSBub2RlOwotCQkJCWlmIChwcm9jZXNzb3JFbGVtZW50LmdldE5vZGVOYW1lKCkuZXF1YWxzKG5hbWUpKQotCQkJCXsKLQkJCQkJY2hpbGRyZW4uYWRkKHByb2Nlc3NvckVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY2hpbGRyZW4udG9BcnJheShuZXcgRWxlbWVudFswXSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Tm9kZVRleHQoTm9kZSBub2RlKQotCXsKLQkJc3dpdGNoIChub2RlLmdldE5vZGVUeXBlKCkpCi0JCXsKLQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREU6Ci0JCQkJTm9kZUxpc3QgY2hpbGROb2RlcyA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkTm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykKLQkJCQl7Ci0JCQkJCU5vZGUgY2hpbGQgPSBjaGlsZE5vZGVzLml0ZW0oaSk7Ci0JCQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKQotCQkJCQl7Ci0JCQkJCQlzYi5hcHBlbmQoY2hpbGQuZ2V0Tm9kZVZhbHVlKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBzYi50b1N0cmluZygpOwotCQkJY2FzZSBOb2RlLlRFWFRfTk9ERToKLQkJCWNhc2UgTm9kZS5BVFRSSUJVVEVfTk9ERToKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIG5vZGUuZ2V0Tm9kZVZhbHVlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIERvY3VtZW50IGdldERvY3VtZW50KElucHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCURvY3VtZW50IGRvYyA9IG51bGw7Ci0JCXRyeQotCQl7Ci0JCQlEb2N1bWVudEJ1aWxkZXIgcGFyc2VyID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpOwotCQkJcGFyc2VyLnNldEVycm9ySGFuZGxlcihuZXcgRGVmYXVsdEhhbmRsZXIoKSk7Ci0JCQlkb2MgPSBwYXJzZXIucGFyc2UobmV3IElucHV0U291cmNlKHN0cmVhbSkpOwotCQl9Ci0JCWNhdGNoIChTQVhFeGNlcHRpb24gZSkKLQkJewotCQkJUHJlZmVyZW5jZVV0aWwuY3JlYXRlQ29yZUV4Y2VwdGlvbihlKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkKLQkJewotCQkJUHJlZmVyZW5jZVV0aWwuY3JlYXRlQ29yZUV4Y2VwdGlvbihlKTsKLQkJfQotCQljYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKQotCQl7Ci0JCQlQcmVmZXJlbmNlVXRpbC5jcmVhdGVDb3JlRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWNhdGNoIChGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIGUpCi0JCXsKLQkJCVByZWZlcmVuY2VVdGlsLmNyZWF0ZUNvcmVFeGNlcHRpb24oZSk7Ci0JCX0KLQkJZmluYWxseQotCQl7Ci0JCQl0cnkKLQkJCXsKLQkJCQlzdHJlYW0uY2xvc2UoKTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKQotCQkJewotCQkJCVByZWZlcmVuY2VVdGlsLmNyZWF0ZUNvcmVFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRvYzsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9tb2RlbC9JWFNMQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9tb2RlbC9JWFNMQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmYTQ3ZGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvbW9kZWwvSVhTTENvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcubW9kZWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVhTTENvbnN0YW50cwotewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfWFNMX0RFQlVHX01PREVMID0gIm9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLlhTTERlYnVnTW9kZWwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFSS0VSX0lEID0gIm9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLnhzbExpbmVCcmVha3BvaW50TWFya2VyIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9tb2RlbC9JWFNMRGVidWdUYXJnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL21vZGVsL0lYU0xEZWJ1Z1RhcmdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTllNTU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL21vZGVsL0lYU0xEZWJ1Z1RhcmdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JRGVidWdUYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3RhY2tGcmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklWYWx1ZTsKLQotcHVibGljIGludGVyZmFjZSBJWFNMRGVidWdUYXJnZXQgZXh0ZW5kcyBJRGVidWdUYXJnZXQKLXsKLQlYU0xWYXJpYWJsZSBnZXRWYXJpYWJsZShpbnQgdmFySWQpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbjsKLQotCUlTdGFja0ZyYW1lW10gZ2V0U3RhY2tGcmFtZXMoKSB0aHJvd3MgRGVidWdFeGNlcHRpb247Ci0KLQl2b2lkIHN0ZXBJbnRvKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uOwotCi0Jdm9pZCBzdGVwT3ZlcigpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbjsKLQotCXZvaWQgc3RlcFJldHVybigpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbjsKLQotCUlWYWx1ZSBnZXRWYXJpYWJsZVZhbHVlKFhTTFZhcmlhYmxlIHZhcmlhYmxlKSB0aHJvd3MgRGVidWdFeGNlcHRpb247CQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvbW9kZWwvTm9kZUxpc3RWYXJpYWJsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvbW9kZWwvTm9kZUxpc3RWYXJpYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTcxYTE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL21vZGVsL05vZGVMaXN0VmFyaWFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKkNvcHlyaWdodCAoYykgMjAwOCBTVEFSIGFuZCBvdGhlcnMuCi0gKkFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKndoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICpDb250cmlidXRvcnM6Ci0gKiAgICBEYXZpZCBDYXJ2ZXIgKFNUQVIpIC0gYnVnIDIxNDIzNSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklEZWJ1Z1RhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklWYXJpYWJsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIE5vZGVMaXN0VmFyaWFibGUgcmVwcmVzZW50cyBhIFhTTCBOb2Rlc2V0LiAgVGhpcyBpcyB0eXBpY2FsbHkgYSBncm91cCBvZiBub2RlcyB0aGF0Ci0gKiBtYXRjaGVkIGEgcGFydGljdWxhciBYUGF0aCBleHByZXNzaW9uLCBhbmQgYXJlIHN0b3JlZCBpbiBhbiBYU0xUIHZhcmlhYmxlLgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOb2RlTGlzdFZhcmlhYmxlIGV4dGVuZHMgWFNMRGVidWdFbGVtZW50IGltcGxlbWVudHMgSVZhcmlhYmxlIHsKLQkKLQlwcml2YXRlIE5vZGUgbm9kZSA9IG51bGw7Ci0KLQlwcml2YXRlIElEZWJ1Z1RhcmdldCBkZWJ1Z1RhcmdldDsKLQkKLQlwdWJsaWMgTm9kZUxpc3RWYXJpYWJsZShJRGVidWdUYXJnZXQgdGFyZ2V0LCBOb2RlIG5vZGVMaXN0Tm9kZSkgewotCQlzdXBlcih0YXJnZXQpOwotCQlub2RlID0gbm9kZUxpc3ROb2RlOwotCQlkZWJ1Z1RhcmdldCA9IHRhcmdldDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCVN0cmluZyBub2RlTmFtZSA9ICIiOwotCQlpZiAobm9kZS5nZXRQcmVmaXgoKSAhPSBudWxsKSB7Ci0JCQlub2RlTmFtZSA9IG5vZGVOYW1lICsgbm9kZS5nZXRQcmVmaXgoKSArICI6IjsKLQkJfQotCQlpZiAobm9kZS5nZXROb2RlTmFtZSgpICE9IG51bGwpIHsKLQkJCW5vZGVOYW1lID0gbm9kZU5hbWUgKyBub2RlLmdldE5vZGVOYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGVOYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlVHlwZU5hbWUoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJVmFsdWUgZ2V0VmFsdWUoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlTdHJpbmcgbm9kZVZhbHVlID0gIiI7Ci0JCWlmIChub2RlLmdldE5vZGVWYWx1ZSgpICE9IG51bGwpIHsKLQkJICAgbm9kZVZhbHVlID0gbm9kZS5nZXROb2RlVmFsdWUoKTsKLQkJfQotCQkvL0lWYWx1ZSB2YWx1ZSA9IG5ldyBYU0xWYWx1ZShkZWJ1Z1RhcmdldCwgInN0cmluZyIsIG5vZGVWYWx1ZSk7Ci0JCUlWYWx1ZSB2YWx1ZSA9IG5ldyBYU0xWYWx1ZShkZWJ1Z1RhcmdldCwgInN0cmluZyIsIG5vZGUpOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzVmFsdWVDaGFuZ2VkKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzVmFsdWVNb2RpZmljYXRpb24oKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHZlcmlmeVZhbHVlKFN0cmluZyBleHByZXNzaW9uKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB2ZXJpZnlWYWx1ZShJVmFsdWUgdmFsdWUpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBleHByZXNzaW9uKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKElWYWx1ZSB2YWx1ZSkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkKLQl9Ci0JCi0JcHVibGljIE5vZGUgZ2V0Tm9kZSgpIHsKLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9tb2RlbC9YU0xEZWJ1Z0VsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL21vZGVsL1hTTERlYnVnRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjA5ZjJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL21vZGVsL1hTTERlYnVnRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuRGVidWdFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSURlYnVnVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSURpc2Nvbm5lY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVGVybWluYXRlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgWFNMRGVidWdFbGVtZW50IGV4dGVuZHMgRGVidWdFbGVtZW50IGltcGxlbWVudHMgSURpc2Nvbm5lY3QKLXsKLQlwdWJsaWMgWFNMRGVidWdFbGVtZW50KElEZWJ1Z1RhcmdldCB0YXJnZXQpCi0JewotCQlzdXBlcih0YXJnZXQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TW9kZWxJZGVudGlmaWVyKCkKLQl7Ci0JCXJldHVybiBJWFNMQ29uc3RhbnRzLklEX1hTTF9ERUJVR19NT0RFTDsKLQl9Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIAotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCWlmIChhZGFwdGVyID09IElUZXJtaW5hdGUuY2xhc3MpIHsKLQkJCXJldHVybiBnZXREZWJ1Z1RhcmdldCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjYW5EaXNjb25uZWN0KCkKLQl7Ci0JCXJldHVybiBnZXREZWJ1Z1RhcmdldCgpLmNhbkRpc2Nvbm5lY3QoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzY29ubmVjdCgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQkJZ2V0RGVidWdUYXJnZXQoKS5kaXNjb25uZWN0KCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRGlzY29ubmVjdGVkKCkKLQl7Ci0JCXJldHVybiBnZXREZWJ1Z1RhcmdldCgpLmlzRGlzY29ubmVjdGVkKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvbW9kZWwvWFNMTGluZUJyZWFrcG9pbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL21vZGVsL1hTTExpbmVCcmVha3BvaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZjU1ODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvbW9kZWwvWFNMTGluZUJyZWFrcG9pbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgQmpvcm4gRnJlZW1hbi1CZW5zb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSUJyZWFrcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5MaW5lQnJlYWtwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZy5NZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFhTTExpbmVCcmVha3BvaW50IGV4dGVuZHMgTGluZUJyZWFrcG9pbnQKLXsKLQlwcml2YXRlIGludCBsaW5lTnVtYmVyOwotCi0JcHVibGljIFhTTExpbmVCcmVha3BvaW50KCkKLQl7Ci0JfQotCi0JcHVibGljIFhTTExpbmVCcmVha3BvaW50KGZpbmFsIElSZXNvdXJjZSByZXNvdXJjZSwgZmluYWwgaW50IGxpbmVOdW1iZXIsIGZpbmFsIGludCBjaGFyU3RhcnQsIGZpbmFsIGludCBjaGFyRW5kKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJdGhpcy5saW5lTnVtYmVyID0gbGluZU51bWJlcjsKLQkJSVdvcmtzcGFjZVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpCi0JCXsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JCQl7Ci0JCQkJSU1hcmtlciBtYXJrZXIgPSByZXNvdXJjZS5jcmVhdGVNYXJrZXIoSVhTTENvbnN0YW50cy5NQVJLRVJfSUQpOwotCQkJCXNldE1hcmtlcihtYXJrZXIpOwotCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSUJyZWFrcG9pbnQuSUQsIGdldE1vZGVsSWRlbnRpZmllcigpKTsKLQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKElCcmVha3BvaW50LkVOQUJMRUQsIEJvb2xlYW4uVFJVRSk7Ci0JCQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UsIE1lc3NhZ2VzLlhTTExpbmVCcmVha3BvaW50XzAgKyByZXNvdXJjZS5nZXROYW1lKCkgKyAiIFtsaW5lOiAiICsgbGluZU51bWJlciArICJdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQotCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5MSU5FX05VTUJFUiwgbGluZU51bWJlcik7Ci0JCQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfU1RBUlQsIG5ldyBJbnRlZ2VyKGNoYXJTdGFydCkpOwotCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX0VORCwgbmV3IEludGVnZXIoY2hhckVuZCkpOwotCi0JCQkJcmVnaXN0ZXIodHJ1ZSk7Ci0JCQl9Ci0JCX07Ci0JCXJ1bihnZXRNYXJrZXJSdWxlKHJlc291cmNlKSwgcnVubmFibGUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlpbnQgbGluZSA9IHN1cGVyLmdldExpbmVOdW1iZXIoKTsKLQkJcmV0dXJuIGxpbmUgPT0gLTEgPyBsaW5lTnVtYmVyIDogbGluZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWdpc3Rlcihib29sZWFuIHJlZ2lzdGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJRGVidWdQbHVnaW4gcGx1Z2luID0gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCQlpZiAocGx1Z2luICE9IG51bGwgJiYgcmVnaXN0ZXIpCi0JCXsKLQkJCXBsdWdpbi5nZXRCcmVha3BvaW50TWFuYWdlcigpLmFkZEJyZWFrcG9pbnQodGhpcyk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlzZXRSZWdpc3RlcmVkKGZhbHNlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TW9kZWxJZGVudGlmaWVyKCkKLQl7Ci0JCXJldHVybiBJWFNMQ29uc3RhbnRzLklEX1hTTF9ERUJVR19NT0RFTDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9tb2RlbC9YU0xTdGFja0ZyYW1lLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9tb2RlbC9YU0xTdGFja0ZyYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMjYwMGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvbW9kZWwvWFNMU3RhY2tGcmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLm1vZGVsOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JUmVnaXN0ZXJHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdGFja0ZyYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVRocmVhZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklWYXJpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZy5MYXVuY2hpbmdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmcuTWVzc2FnZXM7Ci0KLS8qKgotICogWFNMIHN0YWNrIGZyYW1lLgotICovCi1wdWJsaWMgY2xhc3MgWFNMU3RhY2tGcmFtZSBleHRlbmRzIFhTTERlYnVnRWxlbWVudCBpbXBsZW1lbnRzIElTdGFja0ZyYW1lCi17Ci0JcHJpdmF0ZSBmaW5hbCBYU0xUaHJlYWQgeHNsVGhyZWFkOwotCXByaXZhdGUgaW50IGlkOwotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JcHJpdmF0ZSBpbnQgbGluZU51bWJlcjsKLQlwcml2YXRlIFN0cmluZyB4c2xGaWxlTmFtZTsKLQlwcml2YXRlIElWYXJpYWJsZVtdIHZhcmlhYmxlczsKLQotCXB1YmxpYyBYU0xTdGFja0ZyYW1lKFhTTFRocmVhZCB0aHJlYWQsIFN0cmluZyBkYXRhLCBpbnQgaW5kZXgpCi0JewotCQlzdXBlcih0aHJlYWQuZ2V0RGVidWdUYXJnZXQoKSk7Ci0JCXRoaXMueHNsVGhyZWFkID0gdGhyZWFkOwotCQlpbml0KGRhdGEsKElYU0xEZWJ1Z1RhcmdldCkgdGhyZWFkLmdldERlYnVnVGFyZ2V0KCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0KFN0cmluZyBkYXRhLElYU0xEZWJ1Z1RhcmdldCBkZWJ1Z1RhcmdldCkKLQl7Ci0KLQkJU3RyaW5nW10gc3RyaW5ncyA9IGRhdGEuc3BsaXQoIlxcfCIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBmaWxlTmFtZSA9IHN0cmluZ3NbMF07Ci0JCXRyeQotCQl7Ci0JCQlVUkwgdXJsID0gbmV3IFVSTChmaWxlTmFtZSk7Ci0JCQlQYXRoIHAgPSBuZXcgUGF0aCh1cmwuZ2V0RmlsZSgpKTsKLQkJCXhzbEZpbGVOYW1lID0gKG5ldyBQYXRoKGZpbGVOYW1lKSkubGFzdFNlZ21lbnQoKTsKLQotCQkJU3RyaW5nIGlkU3RyaW5nID0gc3RyaW5nc1sxXTsKLQkJCWlkID0gSW50ZWdlci5wYXJzZUludChpZFN0cmluZyk7Ci0JCQlTdHJpbmcgcGMgPSBzdHJpbmdzWzJdOwotCQkJbGluZU51bWJlciA9IEludGVnZXIucGFyc2VJbnQocGMpOwotCQkJU3RyaW5nIHNhZmVuYW1lID0gc3RyaW5nc1szXTsKLQotCQkJaW50IHRoZUluZGV4OwotCQkJd2hpbGUgKCh0aGVJbmRleCA9IHNhZmVuYW1lLmluZGV4T2YoIiVAX1BJUEVfQCUiKSkgIT0gLTEpIC8vJE5PTi1OTFMtMSQKLQkJCXsKLQkJCQlzYWZlbmFtZSA9IHNhZmVuYW1lLnN1YnN0cmluZygwLCB0aGVJbmRleCkgKyAifCIgKyBzYWZlbmFtZS5zdWJzdHJpbmcodGhlSW5kZXggKyAiJUBfUElQRV9AJSIubGVuZ3RoKCksIHNhZmVuYW1lLmxlbmd0aCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0KLQkJCW5hbWUgPSBwLmxhc3RTZWdtZW50KCkgKyAiICIgKyBzYWZlbmFtZTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQl2YXJpYWJsZXMgPSBuZXcgWFNMVmFyaWFibGVbc3RyaW5ncy5sZW5ndGgtNF07Ci0JCQlmb3IgKGludCBpPTA7aTx2YXJpYWJsZXMubGVuZ3RoO2krKykKLQkJCXsKLQkJCQlpbnQgdmFySWQgPSBJbnRlZ2VyLnBhcnNlSW50KHN0cmluZ3NbaSs0XSk7Ci0JCQkJdHJ5Ci0JCQkJewotCQkJCQlYU0xWYXJpYWJsZSB2YXIgPSBkZWJ1Z1RhcmdldC5nZXRWYXJpYWJsZSh2YXJJZCk7Ci0JCQkJCXZhcmlhYmxlc1tpXSA9IHZhcjsKLQkJCQl9Ci0JCQkJY2F0Y2ggKERlYnVnRXhjZXB0aW9uIGUpCi0JCQkJewotCQkJCQlMYXVuY2hpbmdQbHVnaW4ubG9nKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpCi0JCXsKLQkJCUxhdW5jaGluZ1BsdWdpbi5sb2coZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSVRocmVhZCBnZXRUaHJlYWQoKQotCXsKLQkJcmV0dXJuIHhzbFRocmVhZDsKLQl9Ci0KLQlwdWJsaWMgSVZhcmlhYmxlW10gZ2V0VmFyaWFibGVzKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gdmFyaWFibGVzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1ZhcmlhYmxlcygpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIHZhcmlhYmxlcy5sZW5ndGggPiAwOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIGxpbmVOdW1iZXI7Ci0JfQotCi0JcHVibGljIGludCBnZXRDaGFyU3RhcnQoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQl7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldENoYXJFbmQoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQl7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBuYW1lICsgTWVzc2FnZXMuWFNMU3RhY2tGcmFtZV81ICsgbGluZU51bWJlcjsgCi0JfQotCi0JcHVibGljIElSZWdpc3Rlckdyb3VwW10gZ2V0UmVnaXN0ZXJHcm91cHMoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1JlZ2lzdGVyR3JvdXBzKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuU3RlcEludG8oKQotCXsKLQkJcmV0dXJuIGdldFRocmVhZCgpLmNhblN0ZXBJbnRvKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuU3RlcE92ZXIoKQotCXsKLQkJcmV0dXJuIGdldFRocmVhZCgpLmNhblN0ZXBPdmVyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuU3RlcFJldHVybigpCi0JewotCQlyZXR1cm4gZ2V0VGhyZWFkKCkuY2FuU3RlcFJldHVybigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU3RlcHBpbmcoKQotCXsKLQkJcmV0dXJuIGdldFRocmVhZCgpLmlzU3RlcHBpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGVwSW50bygpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQkJZ2V0VGhyZWFkKCkuc3RlcEludG8oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGVwT3ZlcigpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQkJZ2V0VGhyZWFkKCkuc3RlcE92ZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGVwUmV0dXJuKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uCi0JewotCQlnZXRUaHJlYWQoKS5zdGVwUmV0dXJuKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuUmVzdW1lKCkKLQl7Ci0JCXJldHVybiBnZXRUaHJlYWQoKS5jYW5SZXN1bWUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5TdXNwZW5kKCkKLQl7Ci0JCXJldHVybiBnZXRUaHJlYWQoKS5jYW5TdXNwZW5kKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTdXNwZW5kZWQoKQotCXsKLQkJcmV0dXJuIGdldFRocmVhZCgpLmlzU3VzcGVuZGVkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzdW1lKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uCi0JewotCQlnZXRUaHJlYWQoKS5yZXN1bWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdXNwZW5kKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uCi0JewotCQlnZXRUaHJlYWQoKS5zdXNwZW5kKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuVGVybWluYXRlKCkKLQl7Ci0JCXJldHVybiBnZXRUaHJlYWQoKS5jYW5UZXJtaW5hdGUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1Rlcm1pbmF0ZWQoKQotCXsKLQkJcmV0dXJuIGdldFRocmVhZCgpLmlzVGVybWluYXRlZCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlcm1pbmF0ZSgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQkJZ2V0VGhyZWFkKCkudGVybWluYXRlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGZpbGUgdGhpcyBzdGFjayBmcmFtZSBpcyBhc3NvY2lhdGVkIHdpdGguCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTb3VyY2VOYW1lKCkKLQl7Ci0JCXJldHVybiB4c2xGaWxlTmFtZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikKLQl7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBYU0xTdGFja0ZyYW1lKQotCQl7Ci0JCQlYU0xTdGFja0ZyYW1lIHNmID0gKFhTTFN0YWNrRnJhbWUpIG9iajsKLQkJCXJldHVybiBzZi5pZCA9PSBpZDsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpCi0JewotCQlyZXR1cm4gZ2V0U291cmNlTmFtZSgpLmhhc2hDb2RlKCkgKyBpZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGdldElkZW50aWZpZXIoKQotCXsKLQkJcmV0dXJuIGlkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExpbmVOdW1iZXIoaW50IGxpbmVOdW1iZXIpCi0JewotCQl0aGlzLmxpbmVOdW1iZXIgPSBsaW5lTnVtYmVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhcmlhYmxlcyhJVmFyaWFibGVbXSB2YXJpYWJsZXMpCi0JewotCQl0aGlzLnZhcmlhYmxlcyA9IHZhcmlhYmxlczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9tb2RlbC9YU0xUaHJlYWQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL21vZGVsL1hTTFRocmVhZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTJmMTZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL21vZGVsL1hTTFRocmVhZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSURlYnVnVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN0YWNrRnJhbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVGhyZWFkOwotCi1wdWJsaWMgY2xhc3MgWFNMVGhyZWFkIGV4dGVuZHMgWFNMRGVidWdFbGVtZW50IGltcGxlbWVudHMgSVRocmVhZAotewotCi0JLyoqCi0JICogQnJlYWtwb2ludHMgdGhpcyB0aHJlYWQgaXMgc3VzcGVuZGVkIGF0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0JICovCi0JcHJpdmF0ZSBJQnJlYWtwb2ludFtdIGZCcmVha3BvaW50czsKLQotCS8qKgotCSAqIFdoZXRoZXIgdGhpcyB0aHJlYWQgaXMgc3RlcHBpbmcKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZlN0ZXBwaW5nID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IHRocmVhZCBmb3IgdGhlIGdpdmVuIHRhcmdldAotCSAqLwotCXB1YmxpYyBYU0xUaHJlYWQoSURlYnVnVGFyZ2V0IHRhcmdldCkKLQl7Ci0JCXN1cGVyKHRhcmdldCk7Ci0JfQotCi0JcHVibGljIElTdGFja0ZyYW1lW10gZ2V0U3RhY2tGcmFtZXMoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQl7Ci0JCWlmIChpc1N1c3BlbmRlZCgpKQotCQl7Ci0JCQlyZXR1cm4gKChJWFNMRGVidWdUYXJnZXQpIGdldERlYnVnVGFyZ2V0KCkpLmdldFN0YWNrRnJhbWVzKCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlyZXR1cm4gbmV3IElTdGFja0ZyYW1lWzBdOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzU3RhY2tGcmFtZXMoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBpc1N1c3BlbmRlZCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0UHJpb3JpdHkoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQl7Ci0JCXJldHVybiAwOwotCX0KLQotCXB1YmxpYyBJU3RhY2tGcmFtZSBnZXRUb3BTdGFja0ZyYW1lKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uCi0JewotCQlJU3RhY2tGcmFtZVtdIGZyYW1lcyA9IGdldFN0YWNrRnJhbWVzKCk7Ci0JCWlmIChmcmFtZXMubGVuZ3RoID4gMCkKLQkJewotCQkJcmV0dXJuIGZyYW1lc1swXTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQl7Ci0JCXJldHVybiAiVGhyZWFkWzFdIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJQnJlYWtwb2ludFtdIGdldEJyZWFrcG9pbnRzKCkKLQl7Ci0JCWlmIChmQnJlYWtwb2ludHMgPT0gbnVsbCkKLQkJewotCQkJcmV0dXJuIG5ldyBJQnJlYWtwb2ludFswXTsKLQkJfQotCQlyZXR1cm4gZkJyZWFrcG9pbnRzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGJyZWFrcG9pbnRzIHRoaXMgdGhyZWFkIGlzIHN1c3BlbmRlZCBhdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBpZiBub25lLgotCSAqIAotCSAqIEBwYXJhbSBicmVha3BvaW50cwotCSAqICAgICAgICAgICAgdGhlIGJyZWFrcG9pbnRzIHRoaXMgdGhyZWFkIGlzIHN1c3BlbmRlZCBhdCwgb3IKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKiBAc2luY2UgMS4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0QnJlYWtwb2ludHMoSUJyZWFrcG9pbnRbXSBicmVha3BvaW50cykKLQl7Ci0JCWZCcmVha3BvaW50cyA9IGJyZWFrcG9pbnRzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhblJlc3VtZSgpCi0JewotCQlyZXR1cm4gaXNTdXNwZW5kZWQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5TdXNwZW5kKCkKLQl7Ci0JCXJldHVybiAhaXNTdXNwZW5kZWQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1N1c3BlbmRlZCgpCi0JewotCQlyZXR1cm4gZ2V0RGVidWdUYXJnZXQoKS5pc1N1c3BlbmRlZCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc3VtZSgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQkJZ2V0RGVidWdUYXJnZXQoKS5yZXN1bWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdXNwZW5kKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uCi0JewotCQlnZXREZWJ1Z1RhcmdldCgpLnN1c3BlbmQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5TdGVwSW50bygpCi0JewotCQlyZXR1cm4gaXNTdXNwZW5kZWQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5TdGVwT3ZlcigpCi0JewotCQlyZXR1cm4gaXNTdXNwZW5kZWQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5TdGVwUmV0dXJuKCkKLQl7Ci0JCXJldHVybiBpc1N1c3BlbmRlZCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU3RlcHBpbmcoKQotCXsKLQkJcmV0dXJuIGZTdGVwcGluZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGVwSW50bygpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQkJKChJWFNMRGVidWdUYXJnZXQpIGdldERlYnVnVGFyZ2V0KCkpLnN0ZXBJbnRvKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RlcE92ZXIoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQl7Ci0JCSgoSVhTTERlYnVnVGFyZ2V0KSBnZXREZWJ1Z1RhcmdldCgpKS5zdGVwT3ZlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0ZXBSZXR1cm4oKSB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQl7Ci0JCSgoSVhTTERlYnVnVGFyZ2V0KSBnZXREZWJ1Z1RhcmdldCgpKS5zdGVwUmV0dXJuKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuVGVybWluYXRlKCkKLQl7Ci0JCXJldHVybiAhaXNUZXJtaW5hdGVkKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNUZXJtaW5hdGVkKCkKLQl7Ci0JCXJldHVybiBnZXREZWJ1Z1RhcmdldCgpLmlzVGVybWluYXRlZCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlcm1pbmF0ZSgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQkJZ2V0RGVidWdUYXJnZXQoKS50ZXJtaW5hdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2luY2UgMS4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RlcHBpbmcoYm9vbGVhbiBzdGVwcGluZykKLQl7Ci0JCWZTdGVwcGluZyA9IHN0ZXBwaW5nOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL21vZGVsL1hTTFZhbHVlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9tb2RlbC9YU0xWYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTI2ZmFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL21vZGVsL1hTTFZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgRGF2aWQgQ2FydmVyIChTVEFSKSAtIGJ1ZyAyMTQyMzUgLSBOb2RlIExpc3QgZXhwYW5zaW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcubW9kZWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JRGVidWdUYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVmFyaWFibGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBYU0xWYWx1ZSBleHRlbmRzIFhTTERlYnVnRWxlbWVudCBpbXBsZW1lbnRzIElWYWx1ZQotewotCXByaXZhdGUgU3RyaW5nIGZWYWx1ZTsKLQlwcml2YXRlIFN0cmluZyB0eXBlOwotCXByaXZhdGUgYm9vbGVhbiBoYXNWYXJpYWJsZXM7Ci0JcHJpdmF0ZSBOb2RlIGFjdHVhbE5vZGU7Ci0KLQkvKioKLQkgKiBAc2luY2UgMS4wCi0JICovCi0JcHVibGljIFhTTFZhbHVlKElEZWJ1Z1RhcmdldCB0YXJnZXQsIFN0cmluZyB0eXBlLCBOb2RlIG5vZGUpIHsKLQkJc3VwZXIodGFyZ2V0KTsKLQkJYWN0dWFsTm9kZSA9IG5vZGU7Ci0JCVN0cmluZyB2YWx1ZSA9ICIiOwotCQlpZiAobm9kZS5nZXROb2RlVmFsdWUoKSAhPSBudWxsKSB7Ci0JCQl2YWx1ZSA9IG5vZGUuZ2V0Tm9kZVZhbHVlKCk7Ci0JCX0KLQkJaW5pdCh0YXJnZXQsIHR5cGUsIHZhbHVlKTsKLQl9Ci0JcHVibGljIFhTTFZhbHVlKElEZWJ1Z1RhcmdldCB0YXJnZXQsIFN0cmluZyB0eXBlLCBTdHJpbmcgdmFsdWUpCi0JewotCQlzdXBlcih0YXJnZXQpOwotCQlpbml0KHRhcmdldCwgdHlwZSwgdmFsdWUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdChJRGVidWdUYXJnZXQgdGFyZ2V0LCBTdHJpbmcgdHlwZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JCWZWYWx1ZSA9IHZhbHVlOwotCX0KLQkKLQotCi0JcHVibGljIFN0cmluZyBnZXRSZWZlcmVuY2VUeXBlTmFtZSgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZVN0cmluZygpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQkJaWYgKCJzdHJpbmciLmVxdWFscyh0eXBlKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuICInIitmVmFsdWUrIiciOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcmV0dXJuIGZWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FsbG9jYXRlZCgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIElWYXJpYWJsZVtdIGdldFZhcmlhYmxlcygpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQkJTGlzdDxJVmFyaWFibGU+IHZhcmlhYmxlTGlzdCA9IG5ldyBBcnJheUxpc3Q8SVZhcmlhYmxlPigpOwotCQlpZiAoYWN0dWFsTm9kZSAhPSBudWxsKSB7Ci0JCQlpZiAoYWN0dWFsTm9kZS5oYXNBdHRyaWJ1dGVzKCkpIHsKLQkJCQlnZXRBdHRyaWJ1dGVzKHZhcmlhYmxlTGlzdCwgYWN0dWFsTm9kZSk7Ci0JCQl9Ci0JCQl2YXJpYWJsZUxpc3QuYWRkQWxsKGdldE5vZGVMaXN0VmFyaWFibGVzKGFjdHVhbE5vZGUuZ2V0Q2hpbGROb2RlcygpKSk7Ci0JCX0KLQkJaWYgKHR5cGUuZXF1YWxzKCJub2Rlc2V0IikgJiYgIShmVmFsdWUuZXF1YWxzKCI8RU1QVFkgTk9ERVNFVD4iKSkpIHsKLQkJCWNyZWF0ZU5vZGVTZXRWYXJpYWJsZXModmFyaWFibGVMaXN0KTsKLQkJfQotCQlJVmFyaWFibGVbXSB2YXJpYWJsZXMgPSBuZXcgSVZhcmlhYmxlW3ZhcmlhYmxlTGlzdC5zaXplKCldOwotCQl2YXJpYWJsZUxpc3QudG9BcnJheSh2YXJpYWJsZXMpOwotCQlyZXR1cm4gdmFyaWFibGVzOwotCX0KLQlwcml2YXRlIHZvaWQgY3JlYXRlTm9kZVNldFZhcmlhYmxlcyhMaXN0PElWYXJpYWJsZT4gdmFyaWFibGVMaXN0KSB7Ci0JCURvY3VtZW50QnVpbGRlckZhY3RvcnkgYnVpbGRlckZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0JCU5vZGVMaXN0IG5vZGVMaXN0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCURvY3VtZW50QnVpbGRlciBidWlsZGVyID0gYnVpbGRlckZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0JCQlTdHJpbmcgbm9kZVNldCA9ICI8bm9kZXNldD4iICsgZlZhbHVlICsgIjwvbm9kZXNldD4iOwotCQkJSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obm9kZVNldC5nZXRCeXRlcygpKTsKLQkJCURvY3VtZW50IGRvYyA9IGJ1aWxkZXIucGFyc2UoaXMpOwotCQkJTm9kZSBmaXJzdENoaWxkID0gZG9jLmdldEZpcnN0Q2hpbGQoKTsKLQkJCW5vZGVMaXN0ID0gZmlyc3RDaGlsZC5nZXRDaGlsZE5vZGVzKCk7Ci0JCQl2YXJpYWJsZUxpc3QuYWRkQWxsKGdldE5vZGVMaXN0VmFyaWFibGVzKG5vZGVMaXN0KSk7Ci0JCX0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0JcHJpdmF0ZSBMaXN0PElWYXJpYWJsZT4gZ2V0Tm9kZUxpc3RWYXJpYWJsZXMoTm9kZUxpc3Qgbm9kZUxpc3QpIHsKLQkJTGlzdDxJVmFyaWFibGU+IHZhcmlhYmxlTGlzdCA9IG5ldyBBcnJheUxpc3Q8SVZhcmlhYmxlPigpOwotCQlJVmFyaWFibGVbXSByZXR1cm5WYXJzID0gbmV3IElWYXJpYWJsZVtub2RlTGlzdC5nZXRMZW5ndGgoKV07Ci0JCWlmIChub2RlTGlzdCAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVMaXN0LmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlOb2RlIG5vZGUgPSBub2RlTGlzdC5pdGVtKGkpOwotLy8JCQkJaWYgKG5vZGUuaGFzQXR0cmlidXRlcygpKSB7Ci0vLwkJCQkJZ2V0QXR0cmlidXRlcyh2YXJpYWJsZUxpc3QsIG5vZGUpOwotLy8JCQkJfQotCQkJCUlWYXJpYWJsZSB2YXJpYWJsZSA9IG5ldyBOb2RlTGlzdFZhcmlhYmxlKGdldERlYnVnVGFyZ2V0KCksIG5vZGUpOwotCQkJCXZhcmlhYmxlTGlzdC5hZGQodmFyaWFibGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiB2YXJpYWJsZUxpc3Q7Ci0JfQotCXByaXZhdGUgdm9pZCBnZXRBdHRyaWJ1dGVzKExpc3Q8SVZhcmlhYmxlPiB2YXJpYWJsZUxpc3QsIE5vZGUgbm9kZSkgewotCQlOYW1lZE5vZGVNYXAgbm9kZU1hcCA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwotCQlmb3IgKGludCBpdGVtID0gMDsgaXRlbSA8IG5vZGVNYXAuZ2V0TGVuZ3RoKCk7IGl0ZW0rKykgewotCQkJQXR0ciBhdHRyaWJ1dGUgPSAoQXR0cikgbm9kZU1hcC5pdGVtKGl0ZW0pOwotCQkJSVZhcmlhYmxlIHZhcmlhYmxlID0gbmV3IE5vZGVMaXN0VmFyaWFibGUoZ2V0RGVidWdUYXJnZXQoKSwgYXR0cmlidXRlKTsKLQkJCXZhcmlhYmxlTGlzdC5hZGQodmFyaWFibGUpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzVmFyaWFibGVzKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uCi0JewotCQloYXNWYXJpYWJsZXMgPSBmYWxzZTsKLQkJaWYgKGFjdHVhbE5vZGUgIT0gbnVsbCkgewotCQkJaGFzVmFyaWFibGVzID0gYWN0dWFsTm9kZS5oYXNDaGlsZE5vZGVzKCk7Ci0JCX0gZWxzZSAJaWYgKHR5cGUuZXF1YWxzKCJub2Rlc2V0IikpIHsKLQkJCWhhc1ZhcmlhYmxlcyA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQloYXNWYXJpYWJsZXMgPSBmYWxzZTsKLQkJfQotCQlpZiAoZlZhbHVlLmVxdWFscygiPEVNUFRZIE5PREVTRVQ+IikpIHsKLQkJCWhhc1ZhcmlhYmxlcyA9IGZhbHNlOwotCQl9Ci0JCQotCQlyZXR1cm4gaGFzVmFyaWFibGVzOyAKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9tb2RlbC9YU0xWYXJpYWJsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvbW9kZWwvWFNMVmFyaWFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI3YTQ2OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9tb2RlbC9YU0xWYXJpYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklEZWJ1Z1RhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklWYXJpYWJsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotcHVibGljIGNsYXNzIFhTTFZhcmlhYmxlIGV4dGVuZHMgWFNMRGVidWdFbGVtZW50IGltcGxlbWVudHMgSVZhcmlhYmxlCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQUxfU0NPUEUgPSAiTCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUVU5ORUxfU0NPUEUgPSAiVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHTE9CQUxfU0NPUEUgPSAiRyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgZmluYWwgaW50IGlkOwotCXByaXZhdGUgU3RyaW5nIGZOYW1lOwotCXByaXZhdGUgU3RyaW5nIHNjb3BlOwotCXByaXZhdGUgU3RyaW5nIHR5cGU7Ci0JcHJpdmF0ZSBOb2RlTGlzdCBub2RlTGlzdDsKLQotCXB1YmxpYyBYU0xWYXJpYWJsZShJRGVidWdUYXJnZXQgdGFyZ2V0LCBpbnQgaWQpCi0JewotCQlzdXBlcih0YXJnZXQpOwotCQl0aGlzLmlkID0gaWQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRJZCgpCi0JewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JcHVibGljIElWYWx1ZSBnZXRWYWx1ZSgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQkJcmV0dXJuICgoSVhTTERlYnVnVGFyZ2V0KSBnZXREZWJ1Z1RhcmdldCgpKS5nZXRWYXJpYWJsZVZhbHVlKHRoaXMpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKQotCXsKLQkJdGhpcy5mTmFtZSA9IG5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gZk5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRSZWZlcmVuY2VUeXBlTmFtZSgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQkJaWYgKEdMT0JBTF9TQ09QRS5lcXVhbHMoc2NvcGUpKQotCQkJcmV0dXJuICJnbG9iYWwiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiAibG9jYWwiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzVmFsdWVDaGFuZ2VkKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIGV4cHJlc3Npb24pIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShJVmFsdWUgdmFsdWUpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1ZhbHVlTW9kaWZpY2F0aW9uKCkKLQl7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB2ZXJpZnlWYWx1ZShTdHJpbmcgZXhwcmVzc2lvbikgdGhyb3dzIERlYnVnRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdmVyaWZ5VmFsdWUoSVZhbHVlIHZhbHVlKSB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U2NvcGUoU3RyaW5nIHNjb3BlKQotCXsKLQkJdGhpcy5zY29wZSA9IHNjb3BlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2NvcGUoKQotCXsKLQkJcmV0dXJuIHNjb3BlOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5zYXhvbi8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnNheG9uLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMTVhMWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnNheG9uLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy1kZWJ1Z2dlciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnNheG9uLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnNheG9uLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODg0ZWVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5zYXhvbi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC54c2wuc2F4b248L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnNheG9uLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5zYXhvbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjYTlmMzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnNheG9uLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSNUdWUgRmViIDEwIDA1OjI0OjU2IEdNVCAyMDA5Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3M9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ0Rlc2NyaXB0aW9uPXJldHVybl90YWcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuc2F4b24vTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuc2F4b24vTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMmQ5ZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnNheG9uL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LnhzbC5zYXhvbjtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuc2F4b24vU2F4b25BdHRyaWJ1dGVzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuc2F4b24vU2F4b25BdHRyaWJ1dGVzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NGFiMGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnNheG9uL1NheG9uQXR0cmlidXRlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUFMTE9XX0VYVEVSTkFMX0ZVTkNUSU9OUz1odHRwOi8vc2F4b24uc2YubmV0L2ZlYXR1cmUvYWxsb3ctZXh0ZXJuYWwtZnVuY3Rpb25zCi1BTExPV19FWFRFUk5BTF9GVU5DVElPTlMuVFlQRT1ib29sZWFuCi1BTExPV19FWFRFUk5BTF9GVU5DVElPTlMuREVTQz10cnVlIGlmIHRoZSBzdHlsZXNoZWV0IGFsbG93cyBleHRlcm5hbCBmdW5jdGlvbnMgdG8gYmUgY2FsbGVkLiBEZWZhdWx0IGlzIHRydWUuIFRoZSBzZXR0aW5nIGZhbHNlIGlzIHJlY29tbWVuZGVkIGluIGFuIGVudmlyb25tZW50IHdoZXJlIHVudHJ1c3RlZCBzdHlsZXNoZWV0cyBtYXkgYmUgZXhlY3V0ZWQuIFNldHRpbmcgdGhpcyB2YWx1ZSB0byBmYWxzZSAgYWxzbyBkaXNhYmxlcyB1c2VyLWRlZmluZWQgZXh0ZW5zaW9uIGVsZW1lbnRzLCB0b2dldGhlciB3aXRoIHRoZSB3cml0aW5nIG9mIG11bHRpcGxlIG91dHB1dCBmaWxlcywgYWxsIG9mIHdoaWNoIGNhcnJ5IHNpbWlsYXIgc2VjdXJpdHkgcmlza3MuCi0KLVRSQUNFX0VYVEVSTkFMX0ZVTkNUSU9OUz1odHRwOi8vc2F4b24uc2YubmV0L2ZlYXR1cmUvdHJhY2UtZXh0ZXJuYWwtZnVuY3Rpb25zCi1UUkFDRV9FWFRFUk5BTF9GVU5DVElPTlMuVFlQRT1ib29sZWFuCi1UUkFDRV9FWFRFUk5BTF9GVU5DVElPTlMuREVTQz10cnVlIGlmIHRoZSB0cmFjaW5nIG9mIGNhbGxzIHRvIGV4dGVybmFsIEphdmEgbWV0aG9kcyBpcyByZXF1aXJlZC4gRGVmYXVsdCBpcyBmYWxzZS4gVGhpcyBzd2l0Y2ggaXMgdXNlZnVsIHdoZW4gYW5hbHl6aW5nIHdoeSBTYXhvbiBmYWlscyB0byBmaW5kIGEgSmF2YSBtZXRob2QgdG8gbWF0Y2ggYW4gZXh0ZW5zaW9uIGZ1bmN0aW9uIGNhbGwgaW4gdGhlIHN0eWxlc2hlZXQsIG9yIHdoeSBpdCBjaG9vc2VzIG9uZSBtZXRob2Qgb3ZlciBhbm90aGVyIHdoZW4gc2V2ZXJhbCBhcmUgYXZhaWxhYmxlLiBUaGUgdHJhY2Ugb3V0cHV0IGlzIHNlbnQgdG8gU3lzdGVtLmVyci4KLQotVElNSU5HPWh0dHA6Ly9zYXhvbi5zZi5uZXQvZmVhdHVyZS90aW1pbmcKLVRJTUlORy5UWVBFPWJvb2xlYW4KLVRJTUlORy5ERVNDPXRydWUgaWYgYmFzaWMgdGltaW5nIGluZm9ybWF0aW9uIGlzIHRvIGJlIG91dHB1dCB0byB0aGUgc3RhbmRhcmQgZXJyb3Igb3V0cHV0IHN0cmVhbS4KLQotVFJFRV9NT0RFTD1odHRwOi8vc2F4b24uc2YubmV0L2ZlYXR1cmUvdHJlZU1vZGVsCi1UUkVFX01PREVMLlRZUEU9aW50Ci1UUkVFX01PREVMLkRFU0M9QnVpbGRlci5TVEFOREFSRF9UUkVFIG9yIEJ1aWxkZXIuVElOWV9UUkVFLiBTZWxlY3RzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBTYXhvbiB0cmVlIG1vZGVsLiBUaGUgZGVmYXVsdCBpcyBCdWlsZGVyLlRJTllfVFJFRS4KLQotVFJBQ0VfTElTVEVORVI9aHR0cDovL3NheG9uLnNmLm5ldC9mZWF0dXJlL3RyYWNlTGlzdGVuZXIKLVRSQUNFX0xJU1RFTkVSLlRZUEU9b2JqZWN0Ci1UUkFDRV9MSVNURU5FUi5ERVNDPWFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyBuZXQuc2Yuc2F4b24udHJhY2UuVHJhY2VMaXN0ZW5lci4gVGhpcyBvYmplY3Qgd2lsbCBiZSBub3RpZmllZCBvZiBzaWduaWZpY2FudCBldmVudHMgb2NjdXJyaW5nIGR1cmluZyB0aGUgdHJhbnNmb3JtYXRpb24sIGZvciB0cmFjaW5nIG9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4KLQotTElORV9OVU1CRVJJTkc9aHR0cDovL3NheG9uLnNmLm5ldC9mZWF0dXJlL2xpbmVudW1iZXJpbmcKLUxJTkVfTlVNQkVSSU5HLlRZUEU9Ym9vbGVhbgotTElORV9OVU1CRVJJTkcuREVTQz1pbmRpY2F0ZXMgd2hldGhlciBsaW5lIG51bWJlcnMgYXJlIHRvIGJlIG1haW50YWluZWQgZm9yIHRoZSBzb3VyY2UgZG9jdW1lbnQuIFRoaXMgd2lsbCBub3QgYmUgcG9zc2libGUgaWYgdGhlIHNvdXJjZSBkb2N1bWVudCBpcyBzdXBwbGllZCBhcyBhIERPTS4gVGhlIGxpbmUgbnVtYmVycyBhcmUgYWNjZXNzaWJsZSB0aHJvdWdoIHRoZSB0cmFjaW5nIGludGVyZmFjZSwgYW5kIGFsc28gdmlhIHRoZSBzYXhvbjpsaW5lLW51bWJlcigpIGV4dGVuc2lvbiBmdW5jdGlvbi4KLQotUkVDT1ZFUllfUE9MSUNZPWh0dHA6Ly9zYXhvbi5zZi5uZXQvZmVhdHVyZS9yZWNvdmVyeVBvbGljeQotUkVDT1ZFUllfUE9MSUNZLlRZUEU9aW50Ci1SRUNPVkVSWV9QT0xJQ1kuREVTQz1BbiBJbnRlZ2VyLiBJbmRpY2F0ZXMgaG93IGR5bmFtaWMgZXJyb3JzIHNob3VsZCBiZSBoYW5kbGVkLiBPbmUgb2YgdGhlIHZhbHVlcyAoZGVmaW5lZCBhcyBjb25zdGFudHMgaW4gdGhlIENvbnRyb2xsZXIgY2xhc3MpIFJFQ09WRVJfU0lMRU5UTFksIFJFQ09WRVJfV0lUSF9XQVJOSU5HUywgb3IgRE9fTk9UX1JFQ09WRVIpLgotCi1NRVNTQUdFX0VNSVRURVJfQ0xBU1M9aHR0cDovL3NheG9uLnNmLm5ldC9mZWF0dXJlL21lc3NhZ2VFbWl0dGVyQ2xhc3MKLU1FU1NBR0VfRU1JVFRFUl9DTEFTUy5UWVBFPWNsYXNzCi1NRVNTQUdFX0VNSVRURVJfQ0xBU1MuREVTQz1UaGUgZnVsbCBuYW1lIG9mIGEgc2F4b24gZW1pdHRlciBjbGFzcy4gdGhhdCBpbXBsZW1lbnRzIHRoZSBuZXQuc2Yuc2F4b24ub3V0cHV0LkVtaXR0ZXIgaW50ZXJmYWNlOyB0aGUgY2xhc3Mgd2lsbCBiZSB1c2VkIHRvIGZvcm1hdCB0aGUgb3V0cHV0IG9mIHRoZSB4c2w6bWVzc2FnZSBpbnN0cnVjdGlvbi4KLQotU09VUkNFX1BBUlNFUl9DTEFTUz1odHRwOi8vc2F4b24uc2YubmV0L2ZlYXR1cmUvc291cmNlUGFyc2VyQ2xhc3MKLVNPVVJDRV9QQVJTRVJfQ0xBU1MuVFlQRT1jbGFzcwotU09VUkNFX1BBUlNFUl9DTEFTUy5ERVNDPVRoZSBmdWxsIG5hbWUgb2YgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIG9yZy54bWwuc2F4LlhNTFJlYWRlciBpbnRlcmZhY2U7IHRoZSBjbGFzcyB3aWxsIGJlIHVzZWQgdG8gcGFyc2Ugc291cmNlIGRvY3VtZW50cyAodGhhdCBpcywgdGhlIHByaW5jaXBhbCBzb3VyY2UgZG9jdW1lbnQgcGx1cyBhbnkgc2Vjb25kYXJ5IHNvdXJjZSBkb2N1bWVudHMgcmVhZCB1c2luZyB0aGUgZG9jdW1lbnQoKSBmdW5jdGlvbikKLQotU1RZTEVfUEFSU0VSX0NMQVNTPWh0dHA6Ly9zYXhvbi5zZi5uZXQvZmVhdHVyZS9zdHlsZVBhcnNlckNsYXNzCi1TVFlMRV9QQVJTRVJfQ0xBU1MuVFlQRT1jbGFzcwotU1RZTEVfUEFSU0VSX0NMQVNTLkRFU0M9VGhlIGZ1bGwgbmFtZSBvZiBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgb3JnLnhtbC5zYXguWE1MUmVhZGVyIGludGVyZmFjZTsgdGhlIGNsYXNzIHdpbGwgYmUgdXNlZCB0byBwYXJzZSBzdHlsZXNoZWV0IGRvY3VtZW50cyAodGhhdCBpcywgdGhlIHByaW5jaXBhbCBzdHlsZXNoZWV0IG1vZHVsZSBwbHVzIGFueSBzZWNvbmRhcnkgc291cmNlIGRvY3VtZW50cyByZWFkIHVzaW5nIHhzbDppbmNsdWRlIG9yIHhzbDppbXBvcnQpCi0KLU9VVFBVVF9VUklfUkVTT0xWRVI9aHR0cDovL3NheG9uLnNmLm5ldC9mZWF0dXJlL291dHB1dFVSSVJlc29sdmVyCi1PVVRQVVRfVVJJX1JFU09MVkVSLlRZUEU9b2JqZWN0Ci1PVVRQVVRfVVJJX1JFU09MVkVSLkRFU0M9QW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIG5ldC5zZi5zYXhvbi5PdXRwdXRVUklSZXNvbHZlcjsgdGhpcyBvYmplY3Qgd2lsbCBiZSB1c2VkIHRvIHJlc29sdmUgVVJJcyBvZiBzZWNvbmRhcnkgcmVzdWx0IGRvY3VtZW50cyBzcGVjaWZpZWQgaW4gdGhlIGhyZWYgYXR0cmlidXRlIG9mIHRoZSB4c2w6cmVzdWx0LWRvY3VtZW50ICBpbnN0cnVjdGlvbgotCi1EVERfVkFMSURBVElPTj1odHRwOi8vc2F4b24uc2YubmV0L2ZlYXR1cmUvdmFsaWRhdGlvbgotRFREX1ZBTElEQVRJT04uVFlQRT1ib29sZWFuCi1EVERfVkFMSURBVElPTi5ERVNDPUluZGljYXRlcyB3aGV0aGVyIHRoZSBYTUwgcGFyc2VyIHNob3VsZCBiZSBhc2tlZCB0byB2YWxpZGF0ZSBzb3VyY2UgZG9jdW1lbnRzIGFnYWluc3QgdGhlaXIgRFRELiBUaGlzIGFwcGxpZXMgdG8gdGhlIGluaXRpYWwgc291cmNlIGRvY3VtZW50IGFuZCBhbnkgc291cmNlIGRvY3VtZW50cyByZWFkIHVzaW5nIHRoZSBkb2N1bWVudCgpIGZ1bmN0aW9uLCB1bmxlc3MgaGFuZGxlZCBieSBhIHVzZXItd3JpdHRlbiBVUklSZXNvbHZlci4KLQotVkFMSURBVElPTl9XQVJOSU5HUz1odHRwOi8vc2F4b24uc2YubmV0L2ZlYXR1cmUvdmFsaWRhdGlvbi13YXJuaW5ncwotVkFMSURBVElPTl9XQVJOSU5HUy5UWVBFPWJvb2xlYW4KLVZBTElEQVRJT05fV0FSTklOR1MuREVTQz1UaGlzIGRldGVybWluZXMgd2hldGhlciB2YWxpZGF0aW9uIGVycm9ycyBpbiByZXN1bHQgZG9jdW1lbnRzIHNob3VsZCBiZSB0cmVhdGVkIGFzIGZhdGFsLiBCeSBkZWZhdWx0IHRoZXkgYXJlIGZhdGFsOyB3aXRoIHRoaXMgb3B0aW9uIHNldCwgdGhleSBhcmUgdHJlYXRlZCBhcyB3YXJuaW5ncy4KLQotU0NIRU1BX1ZBTElEQVRJT049aHR0cDovL3NheG9uLnNmLm5ldC9mZWF0dXJlL3NjaGVtYS12YWxpZGF0aW9uCi1TQ0hFTUFfVkFMSURBVElPTi5UWVBFPWJvb2xlYW4KLVNDSEVNQV9WQUxJREFUSU9OLkRFU0M9VGhpcyBkZXRlcm1pbmVzIHdoZXRoZXIgc291cmNlIGRvY3VtZW50cyBzaG91bGQgYmUgcGFyc2VkIHdpdGggc2NoZW1hLXZhbGlkYXRpb24gZW5hYmxlZC4KLQotVkVSU0lPTl9XQVJOSU5HPWh0dHA6Ly9zYXhvbi5zZi5uZXQvZmVhdHVyZS92ZXJzaW9uLXdhcm5pbmcKLVZFUlNJT05fV0FSTklORy5UWVBFPWJvb2xlYW4KLVZFUlNJT05fV0FSTklORy5ERVNDPVRoaXMgZGV0ZXJtaW5lcyB3aGV0aGVyIGEgd2FybmluZyBzaG91bGQgYmUgb3V0cHV0IHdoZW4gcnVubmluZyBhbiBYU0xUIDIuMCBwcm9jZXNzb3IgYWdhaW5zdCBhbiBYU0xUIDEuMCBzdHlsZXNoZWV0LiBUaGUgWFNMVCBzcGVjaWZpY2F0aW9uIHJlcXVpcmVzIHRoaXMgdG8gYmUgZG9uZSBieSBkZWZhdWx0LgotCi1OQU1FX1BPT0w9aHR0cDovL3NheG9uLnNmLm5ldC9mZWF0dXJlL25hbWVQb29sCi1OQU1FX1BPT0wuVFlQRT1vYmplY3QKLU5BTUVfUE9PTC5ERVNDPUEgaW5zdGFuY2Ugb2YgY2xhc3MgbmV0LnNmLnNheG9uLm9tLk5hbWVQb29sLiBJbmRpY2F0ZXMgdGhhdCB0aGUgc3VwcGxpZWQgTmFtZVBvb2wgc2hvdWxkIGJlIHVzZWQgYXMgdGhlIHRhcmdldCAocnVuLXRpbWUpIE5hbWVQb29sIGJ5IGFsbCBzdHlsZXNoZWV0cyBjb21waWxlZCAodXNpbmcgbmV3VGVtcGxhdGVzKCkpIGFmdGVyIHRoaXMgY2FsbCBvbiBzZXRBdHRyaWJ1dGUuIE5vcm1hbGx5IGEgc2luZ2xlIHN5c3RlbS1hbGxvY2F0ZWQgTmFtZVBvb2wgaXMgdXNlZCBmb3IgYWxsIHN0eWxlc2hlZXRzIGNvbXBpbGVkIHdoaWxlIHRoZSBKYXZhIFZNIHJlbWFpbnMgbG9hZGVkOyB0aGlzIGF0dHJpYnV0ZSBhbGxvd3MgdXNlciBjb250cm9sIG92ZXIgdGhlIGFsbG9jYXRpb24gb2YgTmFtZVBvb2xzLiBOb3RlIHRoYXQgc291cmNlIHRyZWVzIHVzZWQgYXMgaW5wdXQgdG8gYSB0cmFuc2Zvcm1hdGlvbiBtdXN0IGJlIGJ1aWx0IHVzaW5nIHRoZSBzYW1lIE5hbWVQb29sIHRoYXQgaXMgdXNlZCB3aGVuIHRoZSBzdHlsZXNoZWV0IGlzIGNvbXBpbGVkOiB0aGlzIHdpbGwgaGFwcGVuIGF1dG9tYXRpY2FsbHkgaWYgdGhlIGlucHV0IHRvIGEgdHJhbnNmb3JtYXRpb24gaXMgc3VwcGxpZWQgYXMgYSBTQVhTb3VyY2Ugb3IgU3RyZWFtU291cmNlIGJ1dCBpdCBpcyB1bmRlciB1c2VyIGNvbnRyb2wgaWYgeW91IGJ1aWxkIHRoZSBzb3VyY2UgdHJlZSB5b3Vyc2VsZi4KLQotUkVDT0dOSVpFX1VSSV9RVUVSWV9QQVJBTUVURVJTPWh0dHA6Ly9zYXhvbi5zZi5uZXQvZmVhdHVyZS9yZWNvZ25pemUtdXJpLXF1ZXJ5LXBhcmFtZXRlcnMKLVJFQ09HTklaRV9VUklfUVVFUllfUEFSQU1FVEVSUy5UWVBFPWJvb2xlYW4KLVJFQ09HTklaRV9VUklfUVVFUllfUEFSQU1FVEVSUy5ERVNDPWRldGVybWluZXMgd2hldGhlciBxdWVyeSBwYXJhbWV0ZXJzICh0aGluZ3MgYWZ0ZXIgIj8iKVxuXAotIGluIGEgVVJJIHBhc3NlZCB0byB0aGUgZG9jdW1lbnQoKSBvciBkb2MoKSBmdW5jdGlvbiBhcmUgc3BlY2lhbGx5IHJlY29nbml6ZWQgYnkgdGhlIHN5c3RlbSBkZWZhdWx0IFVSSVJlc29sdmVyLlxuXAotIEFsbG93ZWQgcGFyYW1ldGVycyBpbmNsdWRlLCBmb3IgZXhhbXBsZSB2YWxpZGF0aW9uPXN0cmljdCB0byBwZXJmb3JtIHNjaGVtYSB2YWxpZGF0aW9uLCBhbmQgc3RyaXAtc3BhY2U9eWVzXG5cCi0gdG8gcGVyZm9ybSBzdHJpcHBpbmcgb2YgYWxsIHdoaXRlc3BhY2Utb25seSB0ZXh0IG5vZGVzCi0KLUNPTExBVElPTl9VUklfUkVTT0xWRVI9aHR0cDovL3NheG9uLnNmLm5ldC9mZWF0dXJlL2NvbGxhdGlvbi11cmktcmVzb2x2ZXIKLUNPTExBVElPTl9VUklfUkVTT0xWRVIuVFlQRT1vYmplY3QKLUNPTExBVElPTl9VUklfUkVTT0xWRVIuREVTQz1BIG5ldC5zZi5zYXhvbi5zb3J0LkNvbGxhdGlvblVSSVJlc29sdmVyIHVzZWQgdG8gcmVzb2x2ZSBjb2xsYXRpb24gVVJJcyB1c2VkIGluIHN0eWxlc2hlZXRzIGNvbXBpbGVkIG9yIGV4ZWN1dGVkIHVuZGVyIHRoZVxuXAotIGNvbnRyb2wgb2YgdGhpcyBUcmFuc2Zvcm1lckZhY3RvcnkKLSAKLUNPTExFQ1RJT05fVVJJX1JFU09MVkVSPWh0dHA6Ly9zYXhvbi5zZi5uZXQvZmVhdHVyZS9jb2xsZWN0aW9uLXVyaS1yZXNvbHZlcgotQ09MTEVDVElPTl9VUklfUkVTT0xWRVIuVFlQRT1vYmplY3QKLUNPTExFQ1RJT05fVVJJX1JFU09MVkVSLkRFU0M9QSBuZXQuc2Yuc2F4b24uc29ydC5Db2xsZWN0aW9uVVJJUmVzb2x2ZXIgdXNlZCB0byByZXNvbHZlIGNvbGxlY3Rpb24gVVJJcyB1c2VkIGluIGNhbGxzIG9mIHRoZSBjb2xsZWN0aW9uKCkgZnVuY3Rpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuc2F4b24vU2F4b25PdXRwdXRQcm9wZXJ0aWVzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuc2F4b24vU2F4b25PdXRwdXRQcm9wZXJ0aWVzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NzkwNzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnNheG9uL1NheG9uT3V0cHV0UHJvcGVydGllcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUlOREVOVF9TUEFDRVM9e2h0dHA6Ly9zYXhvbi5zZi5uZXQvfWluZGVudC1zcGFjZXMKLUlOREVOVF9TUEFDRVMuREVTQz0oaW50ZWdlciB2YWx1ZSkuRGVmaW5lcyB0aGUgbnVtYmVyIG9mIHNwYWNlcyB1c2VkIGZvciBpbmRlbnRhdGlvbiBvZiBvdXRwdXQKLQotVU5ERUNMQVJFX05BTUVTUEFDRVM9e2h0dHA6Ly9zYXhvbi5zZi5uZXQvfXVuZGVjbGFyZS1uYW1lc3BhY2VzCi1VTkRFQ0xBUkVfTkFNRVNQQUNFUy5ERVNDPWluY2x1ZGUtY29udGVudC10eXBlID0gInllcyIgfCAibm8iLiBUaGlzIGF0dHJpYnV0ZSBpcyBkZWZpbmVkIGluIFhTTFQgMi4wLiBJbmRpY2F0ZXMgWE1MIDEuMSBuYW1lc3BhY2UgZGVjbGFyYXRpb25zIGFyZSB0byBiZSBvdXRwdXQuCi0KLUNIQVJBQ1RFUl9SRVBSRVNFTlRBVElPTj17aHR0cDovL3NheG9uLnNmLm5ldC99Y2hhcmFjdGVyLXJlcHJlc2VudGF0aW9uCi1DSEFSQUNURVJfUkVQUkVTRU5UQVRJT04uREVTQz0ocmVwMVs7cmVwMl0pLiBJbmRpY2F0ZXMgdGhlIHByZWZlcnJlZCB3YXkgb2YgcmVwcmVzZW50aW5nIG5vbi1BU0NJSSBjaGFyYWN0ZXJzIGluIEhUTUwgYW5kIFhNTCBvdXRwdXQuIHJlcDEgaXMgZm9yIGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIDEyOC0yNTYsIHJlcDIgZm9yIHRob3NlIGFib3ZlIDI1Ni4KLQotTkVYVF9JTl9DSEFJTj17aHR0cDovL3NheG9uLnNmLm5ldC99bmV4dC1pbi1jaGFpbgotTkVYVF9JTl9DSEFJTi5ERVNDPSh1cmkpLiBJbmRpY2F0ZXMgdGhhdCB0aGUgb3V0cHV0IGlzIHRvIGJlIHBpcGVkIGludG8gYW5vdGhlciBYU0xUIHN0eWxlc2hlZXQgdG8gcGVyZm9ybSBhbm90aGVyIHRyYW5zZm9ybWF0aW9uLiBUaGUgYXV4aWxpYXJ5IHByb3BlcnR5IE5FWFRfSU5fQ0hBSU5fQkFTRV9VUkkgcmVjb3JkcyB0aGUgYmFzZSBVUkkgb2YgdGhlIHN0eWxlc2hlZXQgZWxlbWVudCB3aGVyZSB0aGlzIGF0dHJpYnV0ZSB3YXMgZm91bmQuCi0KLVRZUEVfSU5GT1JNQVRJT049e2h0dHA6Ly9zYXhvbi5zZi5uZXQvfXR5cGUtaW5mb3JtYXRpb24KLVRZUEVfSU5GT1JNQVRJT04uREVTQz0obm9uZXxwcmVzZXJ2ZXxzdHJpY3R8bGF4KS4gSW5kaWNhdGVzIHRoZSB2YWx1ZSBvZiB0aGUgdHlwZS1pbmZvcm1hdGlvbiBhdHRyaWJ1dGU6ICJub25lIiwgInByZXNlcnZlIiwgInN0cmljdCIsICJsYXgiCi0KLVJFUVVJUkVfV0VMTF9GT1JNRUQ9e2h0dHA6Ly9zYXhvbi5zZi5uZXQvfXJlcXVpcmUtd2VsbC1mb3JtZWQKLVJFUVVJUkVfV0VMTF9GT1JNRUQuREVTQz0oeWVzfG5vKS4gSW5kaWNhdGVzIHdoZXRoZXIgYSB1c2VyLXN1cHBsaWVkIENvbnRlbnRIYW5kbGVyIHJlcXVpcmVzIHRoZSBzdHJlYW0gb2YgU0FYIGV2ZW50cyB0byBiZSB3ZWxsLWZvcm1lZCAodGhhdCBpcywgdG8gaGF2ZSBhIHNpbmdsZSBlbGVtZW50IG5vZGUgYW5kIG5vIHRleHQgbm9kZXMgYXMgY2hpbGRyZW4gb2YgdGhlIHJvb3QpLiBUaGUgZGVmYXVsdCBpcyAibm8iLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5zYXhvbi9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnNheG9uL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnNheG9uL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5zYXhvbi9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnNheG9uL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NGRkZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnNheG9uL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLWRlYnVnZ2VyLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBTYXhvbkF0dHJpYnV0ZXMucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBTYXhvbk91dHB1dFByb3BlcnRpZXMucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5zYXhvbi9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5zYXhvbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUzODc1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuc2F4b24vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNQcm9wZXJ0aWVzIGZpbGUgZm9yIG9yZy5lY2xpcHNlLndzdC54c2wuc2F4b24KLUJ1bmRsZS1OYW1lLjAgPSBYU0wgU2F4b24gU3VwcG9ydCAoSW5jdWJhdGluZykKLXByb2Nlc3NvclR5cGUubGFiZWwuMCA9IFNheG9uIChYU0xUIDIuMCkKLXByb2Nlc3NvclR5cGUubGFiZWwuMSA9IFNheG9uIChYU0xUIDEuMCkKLUJ1bmRsZS1WZW5kb3IuMCA9IEVjbGlwc2Uub3JnCi10cmFuc2Zvcm1lckZhY3RvcnlTYXhvbjYgPSBTYXhvbiA2Ci10cmFuc2Zvcm1lclNheG9uWFNMVDIgPSBTYXhvbiA3ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnNheG9uL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuc2F4b24vcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJlMGE4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuc2F4b24vcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcucHJvY2Vzc29yVHlwZSI+Ci0gICAgICA8cHJvY2Vzc29yVHlwZQotICAgICAgICAgICAgYXR0cmlidXRlUHJvcGVydGllcz0iU2F4b25BdHRyaWJ1dGVzLnByb3BlcnRpZXMiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5zYXhvbl8xXzAucHJvY2Vzc29yVHlwZSIKLSAgICAgICAgICAgIGxhYmVsPSIlcHJvY2Vzc29yVHlwZS5sYWJlbC4xIgotICAgICAgICAgICAgb3V0cHV0UHJvcGVydGllcz0iU2F4b25PdXRwdXRQcm9wZXJ0aWVzLnByb3BlcnRpZXMiPgotICAgICAgICAgPHRyYW5zZm9ybWVyRmFjdG9yeQotICAgICAgICAgICAgICAgZmFjdG9yeUNsYXNzPSJjb20uaWNsLnNheG9uLlRyYW5zZm9ybWVyRmFjdG9yeUltcGwiCi0gICAgICAgICAgICAgICBuYW1lPSIldHJhbnNmb3JtZXJGYWN0b3J5U2F4b242Ij4KLSAgICAgICAgIDwvdHJhbnNmb3JtZXJGYWN0b3J5PgotICAgICAgPC9wcm9jZXNzb3JUeXBlPgotICAgICAgPHByb2Nlc3NvclR5cGUKLSAgICAgICAgICAgIGF0dHJpYnV0ZVByb3BlcnRpZXM9IlNheG9uQXR0cmlidXRlcy5wcm9wZXJ0aWVzIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2wuc2F4b24ucHJvY2Vzc29yVHlwZSIKLSAgICAgICAgICAgIGxhYmVsPSIlcHJvY2Vzc29yVHlwZS5sYWJlbC4wIgotICAgICAgICAgICAgb3V0cHV0UHJvcGVydGllcz0iU2F4b25PdXRwdXRQcm9wZXJ0aWVzLnByb3BlcnRpZXMiPgotICAgICAgICAgPHRyYW5zZm9ybWVyRmFjdG9yeQotICAgICAgICAgICAgICAgZmFjdG9yeUNsYXNzPSJuZXQuc2Yuc2F4b24uVHJhbnNmb3JtZXJGYWN0b3J5SW1wbCIKLSAgICAgICAgICAgICAgIG5hbWU9IiV0cmFuc2Zvcm1lclNheG9uWFNMVDIiPgotICAgICAgICAgPC90cmFuc2Zvcm1lckZhY3Rvcnk+Ci0gICAgICA8L3Byb2Nlc3NvclR5cGU+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuc2F4b24vc3JjLWRlYnVnZ2VyL1JFQURNRS50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuc2F4b24vc3JjLWRlYnVnZ2VyL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNjNhNTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnNheG9uL3NyYy1kZWJ1Z2dlci9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotSnVzdCBhIHBsYWNlaG9sZGVyIHRvIGVuc3VyZSBzcmMgZm9sZGVyIGFwcGVhcnMuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQxNDAxMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvYXBhY2hlL3hwYXRoLyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSIqKi94c2wvY29yZS8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY2MmQ3ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QueHNsLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuYXBpLnRvb2xzLmFwaUFuYWx5c2lzQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuYXBpLnRvb2xzLmFwaUFuYWx5c2lzTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMxMjE4YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotI1R1ZSBGZWIgMTAgMDU6MzY6MDAgR01UIDIwMDkKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uY29tcGFyaW5nSWRlbnRpY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVhZENvZGU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhdGFsT3B0aW9uYWxFcnJvcj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3M9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdIYXNoQ29kZU1ldGhvZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdEZXNjcmlwdGlvbj1yZXR1cm5fdGFnCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTeW5jaHJvbml6ZWRPbkluaGVyaXRlZE1ldGhvZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvdGVudGlhbE51bGxSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50U3VwZXJpbnRlcmZhY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25FeGVtcHRFeGNlcHRpb25BbmRUaHJvd2FibGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJJbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGU0MDE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotI0ZyaSBTZXAgMDUgMjM6NTg6MzEgR01UIDIwMDgKLWNvbXBpbGVycy5mLnVucmVzb2x2ZWQtZmVhdHVyZXM9MQotY29tcGlsZXJzLmYudW5yZXNvbHZlZC1wbHVnaW5zPTEKLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MQotY29tcGlsZXJzLnAuYnVpbGQ9MQotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5kaXNjb3VyYWdlZC1jbGFzcz0xCi1jb21waWxlcnMucC5pbnRlcm5hbD0xCi1jb21waWxlcnMucC5taXNzaW5nLXBhY2thZ2VzPTIKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0xCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0xCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTEKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0xCi1jb21waWxlcnMucC51bmtub3duLWlkZW50aWZpZXI9MQotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0xCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMucy5jcmVhdGUtZG9jcz1mYWxzZQotY29tcGlsZXJzLnMuZG9jLWZvbGRlcj1kb2MKLWNvbXBpbGVycy5zLm9wZW4tdGFncz0xCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDNlNmM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QueHNsLnVpO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5YU0xVSVBsdWdpbgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjMwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmNvbnNvbGU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmRlYnVnLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy4zLjEwMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjMuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwyLjAuMCkiLAotIG9yZy5hcGFjaGUueGFsYW47YnVuZGxlLXZlcnNpb249IlsyLjcuMSwyLjguMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQ7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWk7YnVuZGxlLXZlcnNpb249IlsxLjAuNDAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmU7YnVuZGxlLXZlcnNpb249IjEuMC4wIiwKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvcjtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjEuMTAzLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5mb3JtcztidW5kbGUtdmVyc2lvbj0iWzMuMy4xMDAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAotIGNvbS5pYm0uaWN1O2J1bmRsZS12ZXJzaW9uPSIzLjguMSIKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLmFjdGlvbnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuY29udGVudG1vZGVsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LmhyZWY7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLmRvdWJsZWNsaWNrO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5lZGl0b3I7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLmhhbmRsZXJzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5wZXJzcGVjdGl2ZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLnN0eWxlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC50ZW1wbGF0ZXM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLnV0aWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLnZhbGlkYXRpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLndpemFyZHM7eC1pbnRlcm5hbDo9dHJ1ZQotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwZTY0YmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgdGVtcGxhdGVzLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHhzbGZpbGVzLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL2ljb25zL2Z1bGwvWFNERmlsZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvaWNvbnMvZnVsbC9YU0RGaWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkwMGYxYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvaWNvbnMvZnVsbC9YU0RGaWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9pY29ucy9mdWxsL2FuY2VzdG9yLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9pY29ucy9mdWxsL2FuY2VzdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk3ZGI4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvaWNvbnMvZnVsbC9hbmNlc3Rvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvaWNvbnMvZnVsbC9kaXJlY3Rpb25hbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvaWNvbnMvZnVsbC9kaXJlY3Rpb25hbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjOTBiYzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL2ljb25zL2Z1bGwvZGlyZWN0aW9uYWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL2ljb25zL2Z1bGwvZmFtaWx5LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9pY29ucy9mdWxsL2ZhbWlseS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5MTdmM2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL2ljb25zL2Z1bGwvZmFtaWx5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9pY29ucy9mdWxsL2ZpZWxkX2RlZmF1bHRfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9pY29ucy9mdWxsL2ZpZWxkX2RlZmF1bHRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkyOWQzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvaWNvbnMvZnVsbC9maWVsZF9kZWZhdWx0X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvaWNvbnMvZnVsbC9mdW5jdGlvbi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvaWNvbnMvZnVsbC9mdW5jdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MWZkNjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL2ljb25zL2Z1bGwvZnVuY3Rpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL2ljb25zL2Z1bGwvaW1wb3J0LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9pY29ucy9mdWxsL2ltcG9ydC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNDRjZTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL2ljb25zL2Z1bGwvaW1wb3J0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9pY29ucy9mdWxsL2ltcG9ydHMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL2ljb25zL2Z1bGwvaW1wb3J0cy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhOTQ3MDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL2ljb25zL2Z1bGwvaW1wb3J0cy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvaWNvbnMvZnVsbC9tb2RlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9pY29ucy9mdWxsL21vZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGExZWExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9pY29ucy9mdWxsL21vZGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL2ljb25zL2Z1bGwvbmV3X3htbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvaWNvbnMvZnVsbC9uZXdfeG1sLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRmYjYyZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvaWNvbnMvZnVsbC9uZXdfeG1sLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9pY29ucy9mdWxsL25ld2R0ZF93aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL2ljb25zL2Z1bGwvbmV3ZHRkX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYjFhNzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL2ljb25zL2Z1bGwvbmV3ZHRkX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvaWNvbnMvZnVsbC9vcGVyYXRpb24uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL2ljb25zL2Z1bGwvb3BlcmF0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU1ZDllMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvaWNvbnMvZnVsbC9vcGVyYXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL2ljb25zL2Z1bGwvb3Zlcl9jby5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvaWNvbnMvZnVsbC9vdmVyX2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM4NzY3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvaWNvbnMvZnVsbC9vdmVyX2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9pY29ucy9mdWxsL3BhY2thZ2Vfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9pY29ucy9mdWxsL3BhY2thZ2Vfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMxYzI4ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvaWNvbnMvZnVsbC9wYWNrYWdlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvaWNvbnMvZnVsbC90ZW1wbGF0ZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvaWNvbnMvZnVsbC90ZW1wbGF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMTI4NjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL2ljb25zL2Z1bGwvdGVtcGxhdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL2ljb25zL2Z1bGwvdmFyaWFibGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL2ljb25zL2Z1bGwvdmFyaWFibGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmQ4M2NiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9pY29ucy9mdWxsL3ZhcmlhYmxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9pY29ucy9mdWxsL3htbF9wZXJzcGVjdGl2ZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvaWNvbnMvZnVsbC94bWxfcGVyc3BlY3RpdmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDM5YjQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9pY29ucy9mdWxsL3htbF9wZXJzcGVjdGl2ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvaWNvbnMvZnVsbC94c2x0X2ZpbGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL2ljb25zL2Z1bGwveHNsdF9maWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIwZWI0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvaWNvbnMvZnVsbC94c2x0X2ZpbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL2ljb25zL2Z1bGwveHNsdF9sYXVuY2guZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL2ljb25zL2Z1bGwveHNsdF9sYXVuY2guZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmUxNWY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9pY29ucy9mdWxsL3hzbHRfbGF1bmNoLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM5ODNiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IE9yYW5nZXZvbHQgKHd3dy5vcmFuZ2V2b2x0LmNvbSkKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgTGFycyBHZXJzbWFubiAod3d3Lm9yYW5nZXZvbHQuY29tKSAtIFhTTCBVSSBzdXBwb3J0Ci0jICAgICBEYXZpZCBDYXJ2ZXIgLSBTVEFSIC0gYnVnIDIxNTEyNiwgMjEzODUzCi0jICAgICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi1wbHVnaW5OYW1lPVhTTCBFZGl0b3IgYW5kIFZhbGlkYXRpb24gKEluY3ViYXRpbmcpCi1wZXJzcGVjdGl2ZU5hbWU9WE1MCi1wYWdlLm5hbWUuMCA9IFhTTAotCi1lZGl0b3JOYW1lID0gWFNMIEVkaXRvcgotd2l6YXJkTmFtZVhTTCA9IFhTTAotd2l6YXJkRGVzY3JpcHRpb25YU0wgPSBDcmVhdGUgYSBuZXcgWFNMIFN0eWxlc2hlZXQKLWNvbnRleHRUeXBlTmV3WFNMID0gTmV3IFhTTAotcGFnZU5hbWVUZW1wbGF0ZXMgPSBUZW1wbGF0ZXMKLXBhZ2VOYW1lVmFsaWRhdGlvbiA9IFZhbGlkYXRpb24KLWNvbW1hbmRPcGVuU2VsZWN0aW9uID0gT3BlbiBTZWxlY3Rpb24KLWNvbW1hbmRUb29sdGlwT3BlblNlbGVjdGlvbiA9IE9wZW4gU2VsZWN0aW9uCi1jb21tYW5kVG9vbHRpcE5ld1hNTEZpbGUgPSBOZXcgWE1MIEZpbGUKLWNvbW1hbmRUb29sdGlwTmV3WE1MRmlsZTIgPSBOZXcgWE1MIEZpbGUKLWNvbW1hbmRUb29sdGlwTmV3WFNERmlsZSA9IE5ldyBYTUwgU2NoZW1hIEZpbGUKLWNvbW1hbmRUb29sdGlwTmV3WFNMRmlsZSA9IE5ldyBYU0wgRmlsZQotdmlld05hbWVTdHlsZXNoZWV0ID0gU3R5bGVzaGVldAotcGFnZVN5bnRheENvbG9yaW5nID0gU3ludGF4IENvbG9yaW5nCi1YU0xfUHJvcGVydHlfdmFsaWRhdGlvbiA9IFhTTFQgVmFsaWRhdGlvbgotCi1zcGVjaWZpY2F0aW9uLmxhYmVsLjAgPSBPdmVycmlkZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYzQ1ODQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjQiPz4KLTxwbHVnaW4+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wZXJzcGVjdGl2ZXMiPgotCQk8cGVyc3BlY3RpdmUgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2wudWkucGVyc3BlY3RpdmUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5wZXJzcGVjdGl2ZS5YTUxQZXJzcGVjdGl2ZUZhY3RvcnkiCi0JCQlpY29uPSIkbmwkL2ljb25zL2Z1bGwveG1sX3BlcnNwZWN0aXZlLmdpZiIgCi0JCQluYW1lPSIlcGVyc3BlY3RpdmVOYW1lIj4KLQkJPC9wZXJzcGVjdGl2ZT4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIj4KLQkJPGVkaXRvciBuYW1lPSIlZWRpdG9yTmFtZSIgCi0JCQlpY29uPSIkbmwkL2ljb25zL2Z1bGwveHNsdF9maWxlLmdpZiIKLQkJCWNvbnRyaWJ1dG9yQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlLlNvdXJjZVBhZ2VBY3Rpb25Db250cmlidXRvciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLmVkaXRvci5YU0xFZGl0b3IiCi0JCQlkZWZhdWx0PSJ0cnVlIgotCQkJZXh0ZW5zaW9ucz0ieHNsLHhzbHQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC51aS5YU0xFZGl0b3IiPgotCQkJPGNvbnRlbnRUeXBlQmluZGluZyBjb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueHNsc291cmNlIiAvPgotCQk8L2VkaXRvcj4KLQk8L2V4dGVuc2lvbj4KLQkKLSAgICA8IS0tIEVkaXRvciBhY3Rpb25zZXRzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvblNldFBhcnRBc3NvY2lhdGlvbnMiPgotCQk8YWN0aW9uU2V0UGFydEFzc29jaWF0aW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2UudWkuZWRpdC50ZXh0LmFjdGlvblNldC5hbm5vdGF0aW9uTmF2aWdhdGlvbiI+Ci0JCQk8cGFydCBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC51aS5YU0xFZGl0b3IiIC8+Ci0JCTwvYWN0aW9uU2V0UGFydEFzc29jaWF0aW9uPgotCQk8YWN0aW9uU2V0UGFydEFzc29jaWF0aW9uIHRhcmdldElEPSJvcmcuZWNsaXBzZS51aS5OYXZpZ2F0ZUFjdGlvblNldCI+Ci0JCQk8cGFydCBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC51aS5YU0xFZGl0b3IiIC8+Ci0JCTwvYWN0aW9uU2V0UGFydEFzc29jaWF0aW9uPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5lZGl0b3JDb25maWd1cmF0aW9uIj4KLQkJPHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhTTCIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhzbHNvdXJjZSI+Ci0JCTwvc291cmNlVmlld2VyQ29uZmlndXJhdGlvbj4KLQkgICAgPGRvdWJsZUNsaWNrU3RyYXRlZ3kKLSAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwuZG91YmxlY2xpY2suWFNMRG91YmxlQ2xpY2tTdHJhdGVneSIKLSAgICAgICAgICAgdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QueHNsLlhTTF9YUEFUSCI+Ci0JICAgIDwvZG91YmxlQ2xpY2tTdHJhdGVneT4KLQkJPHByb3Zpc2lvbmFsRGVmaW5pdGlvbgotCQkJdHlwZT0iYWN0aXZlY29udGV4dHMiCi0JCQl2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCwgb3JnLmVjbGlwc2Uud3N0LnhtbC5uYXZpZ2F0aW9uLCBvcmcuZWNsaXBzZS53c3QueG1sLmNsZWFudXAsIG9yZy5lY2xpcHNlLndzdC54bWwuY29tbWVudHMsIG9yZy5lY2xpcHNlLndzdC54bWwuc2VsZWN0aW9uLCBvcmcuZWNsaXBzZS53c3QueG1sLmRlcGVuZGVuY2llcywgb3JnLmVjbGlwc2Uud3N0LnhtbC5ncmFtbWFyLCBvcmcuZWNsaXBzZS53c3QueG1sLmV4cGFuZCwgb3JnLmVjbGlwc2Uud3N0LnhtbC5vY2N1cnJlbmNlcyIKLSAgICAgICAgCXRhcmdldD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCIgLz4KLSAgICAgICAgPHByb3Zpc2lvbmFsRGVmaW5pdGlvbgotICAgICAgICAgICAgdHlwZT0icHJlZmVyZW5jZXBhZ2VzIgotICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC54c2wudWkucHJlZmVyZW5jZXMuQmFzZVByZWZlcmVuY2VQYWdlLCBvcmcuZWNsaXBzZS53c3QueHNsLnVpLnRlbXBsYXRlLnByZWZlcmVuY2VQYWdlLCBvcmcuZWNsaXBzZS53c3QueHNsLnVpLnByZWZlcmVuY2VzLlZhbGlkYXRpb24sIG9yZy5lY2xpcHNlLndzdC54bWwueHBhdGgudWkuWFBhdGhQcmVmZXJlbmNlUGFnZSwgb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5YUGF0aCIKLSAgICAgICAgICAgIHRhcmdldD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhzbHNvdXJjZSIvPgotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPgotCQk8d2l6YXJkIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3QuWE1MQ2F0ZWdvcnkiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC53aXphcmRzLk5ld1hTTEZpbGVXaXphcmQiCi0JCQlmaW5hbFBlcnNwZWN0aXZlPSJvcmcuZWNsaXBzZS53c3QueHNsLnVpLnBlcnNwZWN0aXZlIiAKLQkJCWljb249IiRubCQvaWNvbnMvZnVsbC94c2x0X2ZpbGUuZ2lmIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwud2l6YXJkcy5OZXdTdHlsZXNoZWV0V2l6YXJkIgotCQkJbmFtZT0iJXdpemFyZE5hbWVYU0wiIAotCQkJcHJlZmVycmVkUGVyc3BlY3RpdmVzPSJvcmcuZWNsaXBzZS53c3QueHNsLnVpLnBlcnNwZWN0aXZlIj4KLQkJCTxkZXNjcmlwdGlvbj4ld2l6YXJkRGVzY3JpcHRpb25YU0w8L2Rlc2NyaXB0aW9uPgotCQkJPHNlbGVjdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIj4KLQkJCTwvc2VsZWN0aW9uPgotCQk8L3dpemFyZD4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8IS0tIFhTTCB0ZW1wbGF0ZXMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZW1wbGF0ZXMiPgotCQk8Y29udGV4dFR5cGUKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlWFNMIgotCQkJaWQ9InhzbF9uZXciIG5hbWU9IiVjb250ZXh0VHlwZU5ld1hTTCI+Ci0JCTwvY29udGV4dFR5cGU+Ci0JCTxpbmNsdWRlIGZpbGU9InRlbXBsYXRlcy9maWxlX3RlbXBsYXRlcy54bWwiIC8+Ci0JPC9leHRlbnNpb24+Ci0KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgotCQk8cGFnZSBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5wcmVmZXJlbmNlcy54bWwiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5NYWluUHJlZmVyZW5jZVBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC51aS5wcmVmZXJlbmNlcy5CYXNlUHJlZmVyZW5jZVBhZ2UiIAotCQkJbmFtZT0iJXBhZ2UubmFtZS4wIiAvPgotCQk8cGFnZSBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnhzbC51aS5wcmVmZXJlbmNlcy5CYXNlUHJlZmVyZW5jZVBhZ2UiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YU0xUZW1wbGF0ZVByZWZlcmVuY2VQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54c2wudWkudGVtcGxhdGUucHJlZmVyZW5jZVBhZ2UiIAotCQkJbmFtZT0iJXBhZ2VOYW1lVGVtcGxhdGVzIj4KLQkJPC9wYWdlPgotCi0JCTxwYWdlIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3QueHNsLnVpLnByZWZlcmVuY2VzLkJhc2VQcmVmZXJlbmNlUGFnZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLnByZWZlcmVuY2VzLlhTTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueHNsLnVpLnByZWZlcmVuY2VzLlZhbGlkYXRpb24iIAotCQkJbmFtZT0iJXBhZ2VOYW1lVmFsaWRhdGlvbiI+Ci0JCTwvcGFnZT4KLQkJPHBhZ2UgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC54c2wudWkucHJlZmVyZW5jZXMuQmFzZVByZWZlcmVuY2VQYWdlIgotCQkgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuWFNMU3ludGF4Q29sb3JpbmdQYWdlIgotCQkgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2wudWkucHJlZmVyZW5jZXMuU3ludGF4Q29sb3JpbmciCi0JCSAgICBuYW1lPSIlcGFnZVN5bnRheENvbG9yaW5nIi8+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zb3VyY2V2YWxpZGF0aW9uIj4KLQkJPHZhbGlkYXRvciBzY29wZT0idG90YWwiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3JGb3JYU0wiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3JGb3JYU0wiPgotCQkJPGNvbnRlbnRUeXBlSWRlbnRpZmllciBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhzbHNvdXJjZSI+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuU1RfREVGQVVMVCIvPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLlhNTF9ERUZBVUxUIi8+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2wuWFNMX1hQQVRIIi8+Ci0JCQk8L2NvbnRlbnRUeXBlSWRlbnRpZmllcj4KLQkJPC92YWxpZGF0b3I+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNvdXJjZXZhbGlkYXRpb24iPgotCQk8dmFsaWRhdG9yIHNjb3BlPSJwYXJ0aWFsIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwudmFsaWRhdGlvbi5YU0xNYXJrdXBWYWxpZGF0b3IiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC52YWxpZGF0b3IubWFya3VwdmFsaWRhdG9yIj4KLQkJCTxjb250ZW50VHlwZUlkZW50aWZpZXIgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS54c2xzb3VyY2UiPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLlNUX0RFRkFVTFQiIC8+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuWE1MX0RFRkFVTFQiIC8+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2wuWFNMX1hQQVRIIiAvPgotCQkJPC9jb250ZW50VHlwZUlkZW50aWZpZXI+Ci0JCTwvdmFsaWRhdG9yPgotCTwvZXh0ZW5zaW9uPgotCQotIDxleHRlbnNpb24KLSAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVFeHRlbnNpb25zIj4KLSAgICA8cGVyc3BlY3RpdmVFeHRlbnNpb24KLSAgICAgICAgICB0YXJnZXRJRD0ib3JnLmVjbGlwc2Uud3N0LnhzbC51aS5wZXJzcGVjdGl2ZSI+Ci0gICAgICAgPG5ld1dpemFyZFNob3J0Y3V0Ci0gICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkcy5OZXdYTUxXaXphcmQiPgotICAgICAgIDwvbmV3V2l6YXJkU2hvcnRjdXQ+Ci0gICAgICAgPG5ld1dpemFyZFNob3J0Y3V0Ci0gICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwud2l6YXJkcy5OZXdTdHlsZXNoZWV0V2l6YXJkIj4KLSAgICAgICA8L25ld1dpemFyZFNob3J0Y3V0PgotICAgICAgIDxuZXdXaXphcmRTaG9ydGN1dAotICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLndpemFyZC5OZXdEVERXaXphcmQiPgotICAgICAgIDwvbmV3V2l6YXJkU2hvcnRjdXQ+Ci0gICAgICAgPG5ld1dpemFyZFNob3J0Y3V0Ci0gICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpIj4KLSAgICAgICA8L25ld1dpemFyZFNob3J0Y3V0PgotICAgICAgIDxuZXdXaXphcmRTaG9ydGN1dAotICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLndpemFyZHMuTmV3WFNEV2l6YXJkIj4KLSAgICAgICA8L25ld1dpemFyZFNob3J0Y3V0PgotICAgIDwvcGVyc3BlY3RpdmVFeHRlbnNpb24+Ci0gICA8L2V4dGVuc2lvbj4KLQkgPGV4dGVuc2lvbgotCSAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLm5hdmlnYXRvckNvbnRlbnQiPgotCSAgICAgICA8Y29tbW9uV2l6YXJkCi0JICAgICAgICAgICAgIHR5cGU9Im5ldyIKLQkgICAgICAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwud2l6YXJkLk5ld0RURFdpemFyZCI+Ci0JICAgICAgICAgIDxlbmFibGVtZW50PjwvZW5hYmxlbWVudD4KLQkgICAgICAgPC9jb21tb25XaXphcmQ+Ci0JICAgICAgIDxjb21tb25XaXphcmQKLQkgICAgICAgICAgICAgdHlwZT0ibmV3IgotCSAgICAgICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC53aXphcmRzLk5ld1hNTFdpemFyZCI+Ci0JICAgICAgICAgIDxlbmFibGVtZW50PgotCSAgICAgICAgICAKLQkgICAgICAgICAgPC9lbmFibGVtZW50PgotCSAgICAgICA8L2NvbW1vbldpemFyZD4KLQkgICAgICAgPGNvbW1vbldpemFyZAotCSAgICAgICAgICAgICB0eXBlPSJuZXciCi0JICAgICAgICAgICAgIHdpemFyZElkPSJvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLndpemFyZHMuTmV3U3R5bGVzaGVldFdpemFyZCI+Ci0JICAgICAgICAgIDxlbmFibGVtZW50PjwvZW5hYmxlbWVudD4KLQkgICAgICAgPC9jb21tb25XaXphcmQ+Ci0JICAgICAgIDxjb21tb25XaXphcmQKLQkgICAgICAgICAgICAgdHlwZT0ibmV3IgotCSAgICAgICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC53aXphcmRzLk5ld1hTRFdpemFyZCI+Ci0JICAgICAgICAgIDxlbmFibGVtZW50PgotCSAgICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0JICAgICAgIDwvY29tbW9uV2l6YXJkPgotCSAgICAgICA8Y29tbW9uV2l6YXJkCi0JICAgICAgICAgICAgIHR5cGU9Im5ldyIKLQkgICAgICAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpIj4KLQkgICAgICAgICAgPGVuYWJsZW1lbnQ+PC9lbmFibGVtZW50PgotCSAgICAgICA8L2NvbW1vbldpemFyZD4KLQkgPC9leHRlbnNpb24+Ci0gIDxleHRlbnNpb24KLSAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzIj4KLSAgICAgPGhhbmRsZXIKLSAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwuaGFuZGxlcnMuT3BlbkRlY2xhcmF0aW9uSGFuZGxlciIKLSAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLm9wZW4uZmlsZS5mcm9tLnNvdXJjZSI+Ci0gICAgIDwvaGFuZGxlcj4KLSAgPC9leHRlbnNpb24+Ci0gIDxleHRlbnNpb24KLSAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm1lbnVzIj4KLSAgICAgPG1lbnVDb250cmlidXRpb24KLSAgICAgICAgICAgbG9jYXRpb25VUkk9InBvcHVwOm9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3IuRWRpdG9yQ29udGV4dD9iZWZvcmU9YWRkaXRpb25zIj4KLSAgICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLm9wZW4uZmlsZS5mcm9tLnNvdXJjZSIKLSAgICAgICAgICAgICAgaWQ9Im9wZW5TZWxlY3Rpb24iCi0gICAgICAgICAgICAgIGxhYmVsPSIlY29tbWFuZE9wZW5TZWxlY3Rpb24iCi0gICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgotICAgICAgICAgICAgICB0b29sdGlwPSIlY29tbWFuZFRvb2x0aXBPcGVuU2VsZWN0aW9uIj4KLSAgICAgICAgICAgPHZpc2libGVXaGVuCi0gICAgICAgICAgICAgICAgIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgotICAgICAgICAgICA8L3Zpc2libGVXaGVuPgotICAgICAgICA8L2NvbW1hbmQ+Ci0gICAgIDwvbWVudUNvbnRyaWJ1dGlvbj4KLSAgICAgPG1lbnVDb250cmlidXRpb24KLSAgICAgICAgICAgICAgbG9jYXRpb25VUkk9InRvb2xiYXI6b3JnLmVjbGlwc2UudWkubWFpbi50b29sYmFyP2FmdGVyPWFkZGl0aW9ucyI+Ci0gICAgICAgIDx0b29sYmFyCi0gICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueHNsLnVpLmRlc2lnbi5OZXdGaWxlVG9vbEJhciI+Ci0gICAgICA8c2VwYXJhdG9yCi0gICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLndzdC54c2wudG9vbGJhci5zZXBhcmF0b3IuMSIKLSAgICAgICAgICAgdmlzaWJsZT0idHJ1ZSI+Ci0gICAgICAgPC9zZXBhcmF0b3I+Ci0gICAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkIgotICAgICAgICAgICAgICBpY29uPSIkbmwkL2ljb25zL2Z1bGwvbmV3X3htbC5naWYiCi0gICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueHNsLnVpLm5ld1hNTEZpbGUiCi0gICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgotICAgICAgICAgICAgICB0b29sdGlwPSIlY29tbWFuZFRvb2x0aXBOZXdYTUxGaWxlIj4KLSAgICAgICAgICAgICA8cGFyYW1ldGVyCi0gICAgICAgICAgICAgICAgICAgbmFtZT0ibmV3V2l6YXJkSWQiCi0gICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkcy5OZXdYTUxXaXphcmQiPgotICAgICAgICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgICAgIDx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KLQkJCTx3aXRoIHZhcmlhYmxlPSJhY3RpdmVXb3JrYmVuY2hXaW5kb3cuYWN0aXZlUGVyc3BlY3RpdmUiPgotCQkJICAgICAgIDxlcXVhbHMgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC54c2wudWkucGVyc3BlY3RpdmUiLz4KLQkJCSAgICA8L3dpdGg+Ci0gICAgICAgICAgIDwvdmlzaWJsZVdoZW4+ICAgICAgICAgCi0gICAgICAgIDwvY29tbWFuZD4KLSAgICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmQiCi0gICAgICAgICAgICAgIGljb249IiRubCQvaWNvbnMvZnVsbC9uZXdkdGRfd2l6LmdpZiIKLSAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2wudWkubmV3RFRERmlsZSIKLSAgICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgIHRvb2x0aXA9IiVjb21tYW5kVG9vbHRpcE5ld1hNTEZpbGUyIj4KLSAgICAgICAgICAgICA8cGFyYW1ldGVyCi0gICAgICAgICAgICAgICAgICAgbmFtZT0ibmV3V2l6YXJkSWQiCi0gICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwud2l6YXJkLk5ld0RURFdpemFyZCI+Ci0gICAgICAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgICAgPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgotCQkJPHdpdGggdmFyaWFibGU9ImFjdGl2ZVdvcmtiZW5jaFdpbmRvdy5hY3RpdmVQZXJzcGVjdGl2ZSI+Ci0JCQkgICAgICAgPGVxdWFscyB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LnhzbC51aS5wZXJzcGVjdGl2ZSIvPgotCQkJICAgIDwvd2l0aD4KLSAgICAgICAgICAgPC92aXNpYmxlV2hlbj4gICAgICAgICAKLSAgICAgICAgPC9jb21tYW5kPgotICAgICAgICA8Y29tbWFuZAotICAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZCIKLSAgICAgICAgICAgICAgaWNvbj0iJG5sJC9pY29ucy9mdWxsL1hTREZpbGUuZ2lmIgotICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC51aS5uZXdYU0RGaWxlIgotICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKLSAgICAgICAgICAgICAgdG9vbHRpcD0iJWNvbW1hbmRUb29sdGlwTmV3WFNERmlsZSI+Ci0gICAgICAgICAgICAgPHBhcmFtZXRlcgotICAgICAgICAgICAgICAgICAgIG5hbWU9Im5ld1dpemFyZElkIgotICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLndpemFyZHMuTmV3WFNEV2l6YXJkIj4KLSAgICAgICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgICA8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+Ci0JCQk8d2l0aCB2YXJpYWJsZT0iYWN0aXZlV29ya2JlbmNoV2luZG93LmFjdGl2ZVBlcnNwZWN0aXZlIj4KLQkJCSAgICAgICA8ZXF1YWxzIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QueHNsLnVpLnBlcnNwZWN0aXZlIi8+Ci0JCQkgICAgPC93aXRoPgotICAgICAgICAgICA8L3Zpc2libGVXaGVuPiAgICAgICAgIAotICAgICAgICA8L2NvbW1hbmQ+ICAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmQiCi0gICAgICAgICAgICAgIGljb249IiRubCQvaWNvbnMvZnVsbC94c2x0X2ZpbGUuZ2lmIgotICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC51aS5uZXdYU0xGaWxlIgotICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKLSAgICAgICAgICAgICAgdG9vbHRpcD0iJWNvbW1hbmRUb29sdGlwTmV3WFNMRmlsZSI+Ci0gICAgICAgICAgICAgPHBhcmFtZXRlcgotICAgICAgICAgICAgICAgICAgIG5hbWU9Im5ld1dpemFyZElkIgotICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLndpemFyZHMuTmV3U3R5bGVzaGVldFdpemFyZCI+Ci0gICAgICAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgICAgPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgotCQkJPHdpdGggdmFyaWFibGU9ImFjdGl2ZVdvcmtiZW5jaFdpbmRvdy5hY3RpdmVQZXJzcGVjdGl2ZSI+Ci0JCQkgICAgICAgPGVxdWFscyB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LnhzbC51aS5wZXJzcGVjdGl2ZSIvPgotCQkJICAgIDwvd2l0aD4KLSAgICAgICAgICAgPC92aXNpYmxlV2hlbj4gICAgICAgICAKLSAgICAgICAgPC9jb21tYW5kPgotICAgICAgPHNlcGFyYXRvcgotICAgICAgICAgICBuYW1lPSJhZGRpdGlvbnMiCi0gICAgICAgICAgIHZpc2libGU9InRydWUiPgotICAgICAgIDwvc2VwYXJhdG9yPgotICAgICAgPC90b29sYmFyPiAKLSAgICAgPC9tZW51Q29udHJpYnV0aW9uPgotICA8L2V4dGVuc2lvbj4KLSAgPGV4dGVuc2lvbgotICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MiPgotICAgICA8dmlldwotICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5TdHlsZXNoZWV0VmlldyIKLSAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2wudWkudmlldy5vdXRsaW5lIgotICAgICAgICAgICBuYW1lPSIldmlld05hbWVTdHlsZXNoZWV0IgotICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnhtbCIKLSAgICAgICAgICAgcmVzdG9yYWJsZT0idHJ1ZSI+Ci0gICAgIDwvdmlldz4KLSAgPC9leHRlbnNpb24+Ci0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hZGFwdGVycyI+CQkKLQkJPGZhY3RvcnkgCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5YU0xNb2RlbEFkYXB0ZXJGYWN0b3J5IiAKLSAgICAgICAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5tb2RlbC5YU0xNb2RlbE9iamVjdCI+Ci0gICAgICAgICAgICA8YWRhcHRlciB0eXBlPSJvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlciIvPgotCQk8L2ZhY3Rvcnk+Ci0gICA8L2V4dGVuc2lvbj4gICAgIAkKLSAgIAotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMuYW5ub3RhdGlvblR5cGVzIj4KLQkJPHR5cGUKLQkJCW5hbWU9Im9yZy5lY2xpcHNlLndzdC54c2wudWkub3ZlcnJpZGUiPgotCQk8L3R5cGU+Ci0JPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycy5tYXJrZXJBbm5vdGF0aW9uU3BlY2lmaWNhdGlvbiI+Ci0JICA8c3BlY2lmaWNhdGlvbgotICAgICAgICAgICAgYW5ub3RhdGlvblR5cGU9Im9yZy5lY2xpcHNlLndzdC54c2wudWkub3ZlcnJpZGUiCi0gICAgICAgICAgICBsYWJlbD0iJXNwZWNpZmljYXRpb24ubGFiZWwuMCIKLSAgICAgICAgICAgIGljb249IiRubCQvaWNvbnMvZnVsbC9vdmVyX2NvLmdpZiIKLQkJCWFubm90YXRpb25JbWFnZVByb3ZpZGVyID0ib3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5lZGl0b3IuT3ZlcnJpZGVJbmRpY2F0b3JJbWFnZVByb3ZpZGVyIgotICAgICAgICAgICAgdGV4dFByZWZlcmVuY2VLZXk9Im92ZXJyaWRlSW5kaWNhdG9yIgotICAgICAgICAgICAgdGV4dFByZWZlcmVuY2VWYWx1ZT0iZmFsc2UiCi0gICAgICAgICAgICBoaWdobGlnaHRQcmVmZXJlbmNlS2V5PSJvdmVycmlkZUluZGljYXRvckhpZ2hsaWdodGluZyIKLSAgICAgICAgICAgIGhpZ2hsaWdodFByZWZlcmVuY2VWYWx1ZT0iZmFsc2UiCi0gICAgICAgICAgICBjb250cmlidXRlc1RvSGVhZGVyPSJmYWxzZSIKLSAgICAgICAgICAgIG92ZXJ2aWV3UnVsZXJQcmVmZXJlbmNlS2V5PSJvdmVycmlkZUluZGljYXRvckluT3ZlcnZpZXdSdWxlciIKLSAgICAgICAgICAgIG92ZXJ2aWV3UnVsZXJQcmVmZXJlbmNlVmFsdWU9ImZhbHNlIgotICAgICAgICAgICAgdmVydGljYWxSdWxlclByZWZlcmVuY2VLZXk9Im92ZXJyaWRlSW5kaWNhdG9ySW5WZXJ0aWNhbFJ1bGVyIgotICAgICAgICAgICAgdmVydGljYWxSdWxlclByZWZlcmVuY2VWYWx1ZT0idHJ1ZSIKLSAgICAgICAgICAgIGNvbG9yUHJlZmVyZW5jZUtleT0ib3ZlcnJpZGVJbmRpY2F0b3JDb2xvciIKLSAgICAgICAgICAgIGNvbG9yUHJlZmVyZW5jZVZhbHVlPSIxODAsMjA3LDIwNSIKLSAgICAgICAgICAgIHByZXNlbnRhdGlvbkxheWVyPSIzIgotICAgICAgICAgICAgc2hvd0luTmV4dFByZXZEcm9wZG93blRvb2xiYXJBY3Rpb25LZXk9InNob3dvdmVycmlkZUluZGljYXRvckluTmV4dFByZXZEcm9wZG93blRvb2xiYXJBY3Rpb24iCi0gICAgICAgICAgICBzaG93SW5OZXh0UHJldkRyb3Bkb3duVG9vbGJhckFjdGlvbj0iZmFsc2UiCi0gICAgICAgICAgICBpc0dvVG9OZXh0TmF2aWdhdGlvblRhcmdldEtleT0iaXNPdmVycmlkZUluZGljYXRvckdvVG9OZXh0TmF2aWdhdGlvblRhcmdldCIKLQkgICAgICAgIGlzR29Ub05leHROYXZpZ2F0aW9uVGFyZ2V0PSJmYWxzZSIKLSAgICAgICAgICAgIGlzR29Ub1ByZXZpb3VzTmF2aWdhdGlvblRhcmdldEtleT0iaXNPdmVycmlkZUluZGljYXRvckdvVG9QcmV2aW91c05hdmlnYXRpb25UYXJnZXQiCi0JICAgICAgICBpc0dvVG9QcmV2aW91c05hdmlnYXRpb25UYXJnZXQ9ImZhbHNlIgotICAgICAgICAgICAgdGV4dFN0eWxlUHJlZmVyZW5jZUtleT0ib3ZlcnJpZGVJbmRpY2F0b3JUZXh0U3R5bGUiCi0gICAgICAgICAgICB0ZXh0U3R5bGVQcmVmZXJlbmNlVmFsdWU9IlNRVUlHR0xFUyI+Ci0JICA8L3NwZWNpZmljYXRpb24+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIj4KLQkJPGluaXRpYWxpemVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YU0xVSVByZWZlcmVuY2VJbml0aWFsaXplciIgLz4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcm9wZXJ0eVBhZ2VzIj4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVYU0xfUHJvcGVydHlfdmFsaWRhdGlvbiIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLnByZWZlcmVuY2VzLlhTTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueHNsLnVpLnByb3BlcnR5UGFnZS5wcm9qZWN0LnZhbGlkYXRpb24iCi0JCQljYXRlZ29yeT0iVmFsaWRhdGlvblByb3BlcnRpZXNQYWdlIj4KLS0JCQk8ZW5hYmxlZFdoZW4+Ci0JCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCQkJCi0JCQkJPC9hZGFwdD4KLQkJCTwvZW5hYmxlZFdoZW4+Ci0JCTwvcGFnZT4JCQotCTwvZXh0ZW5zaW9uPgotIDxleHRlbnNpb24KLSAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIj4KLSAgICA8aW5pdGlhbGl6ZXIKLSAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5QcmVmZXJlbmNlSW5pdGlhbGl6ZXIiPgotICAgIDwvaW5pdGlhbGl6ZXI+Ci0gPC9leHRlbnNpb24+Ci0JCi0gICA8IS0tIGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucXVpY2tGaXhQcm9jZXNzb3IiPgotICAgICAgPHF1aWNrRml4UHJvY2Vzc29yCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5xdWlja2Fzc2lzdC5PdmVycmlkZVF1aWNrQXNzaXN0IgotICAgICAgICAgICAgcHJvYmxlbVR5cGU9Im9yZy5lY2xpcHNlLndzdC54c2wudWkub3ZlcnJpZGUiPgotICAgICAgPC9xdWlja0ZpeFByb2Nlc3Nvcj4KLSAgIDwvZXh0ZW5zaW9uIC0tPgotCQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvTGlzdFdvcmtiZW5jaEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9MaXN0V29ya2JlbmNoQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjVhN2M1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9MaXN0V29ya2JlbmNoQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5tb2RlbC5TdHlsZXNoZWV0OwotCi1wdWJsaWMgY2xhc3MgTGlzdFdvcmtiZW5jaEFkYXB0ZXIgaW1wbGVtZW50cyBJV29ya2JlbmNoQWRhcHRlcgotewotCXByaXZhdGUgT2JqZWN0IHBhcmVudDsKLQlwcml2YXRlIE9iamVjdFtdIGNoaWxkcmVuOwotCXByaXZhdGUgU3RyaW5nIHRleHQ7Ci0JcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3IgaW1hZ2U7Ci0JCi0JcHVibGljIExpc3RXb3JrYmVuY2hBZGFwdGVyKFN0eWxlc2hlZXQgc3R5bGVzaGVldCwgTGlzdCBsaXN0LCBTdHJpbmcgbGFiZWwsIFN0cmluZyBpbWdQYXRoKQotCXsKLQkJcGFyZW50ID0gc3R5bGVzaGVldDsKLQkJaWYgKGxpc3QgIT0gbnVsbCkKLQkJCWNoaWxkcmVuID0gbGlzdC50b0FycmF5KCk7Ci0JCWVsc2UKLQkJCWNoaWxkcmVuID0gbmV3IE9iamVjdFswXTsKLQkJdGV4dCA9IGxhYmVsOwotCQlpZiAoaW1nUGF0aCE9bnVsbCkKLQkJCWltYWdlID0gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKFhTTFVJUGx1Z2luLlBMVUdJTl9JRCwgaW1nUGF0aCk7Ci0JfQotCQotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpCi0JewotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoT2JqZWN0IG8pCi0JewotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8pCi0JewotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG8pCi0JewotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThjYTg5OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhjbHVkZVJlc3VsdFByZWZpeGVzQ29udGVudEFzc2lzdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOb0NvbnRlbnRBc3Npc3RhbmNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhTTFN5bnRheENvbG9yaW5nUGFnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB4c2x0U3R5bGVEb2N1bWVudDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYWluUHJlZmVyZW5jZVBhZ2U7Ci0JCi0Jc3RhdGljIHsKLQkgICBOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczM2Q3ZTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuRGVmYXVsdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JRWNsaXBzZVByZWZlcmVuY2VzOwotCi1wdWJsaWMgY2xhc3MgUHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIKLXsKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkKLQl7Ci0JCUlFY2xpcHNlUHJlZmVyZW5jZXMgbm9kZSA9IG5ldyBEZWZhdWx0U2NvcGUoKS5nZXROb2RlKFhTTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSk7Ci0JCW5vZGUucHV0KFhTTFVJQ29uc3RhbnRzLk5FV19GSUxFX1RFTVBMQVRFX05BTUUsICJvcmcuZWNsaXBzZS53c3QueHNsdC50ZW1wbGF0ZXMueHNsX2Jhc2ljIik7IC8vIGRlZmF1bHQgdG8gdGhlIGJhc2ljIHN0eWxlc2hlZXQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uWFNMLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uWFNMLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNDI3MjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL1N0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhTTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBTVEFSIC0gYnVnIDIxMzg0OSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rRGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0RGVjb3JhdGVkVGV4dEVkaXRvclByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWRQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXI7IC8vIGltcG9ydAotCQkJCQkJCQkJCQkJCQkJCQkJCS8vIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC50ZXh0LnJ1bGVzLlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnRleHQuSVhNTFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25YTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0Lk5vUmVnaW9uQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwudGV4dC5JWFNMUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwudGV4dC5ydWxlcy5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yWFNMOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5YU0xDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwuZWRpdG9yLlhTTEh5cGVybGlua0RldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXJGb3JYU0w7Ci0KLS8qKgotICogU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uWFNMIGltcGxlbWVudHMgY29udGVudCBhc3Npc3RhbmNlIGZvcgotICogYXR0cmlidXRlcyBhbmQgb3RoZXIgWFBhdGggcmVsYXRlZCBmdW5jdGlvbmFsaXR5LgotICogCi0gKiBAYXV0aG9yIGRjYXJ2ZXIKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uWFNMIGV4dGVuZHMKLQkJU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uWE1MIHsKLQotCXByaXZhdGUgU3RyaW5nW10gZkNvbmZpZ3VyZWRDb250ZW50VHlwZXM7Ci0JcHJpdmF0ZSBMaW5lU3R5bGVQcm92aWRlciBmTGluZVN0eWxlUHJvdmlkZXJGb3JYU0w7Ci0vLwlwcml2YXRlIExpbmVTdHlsZVByb3ZpZGVyIGZMaW5lU3R5bGVQcm92aWRlckZvclhNTDsKLQotCS8qKgotCSAqIENvbmZpZ3VyYXRpb24gZm9yIFhTTCBDb250ZW50IFR5cGVzCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhTTCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHByb2Nlc3NvcnMgZm9yIHRoZSBjdXJyZW50IGNvbnRlbnQgdHlwZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXSBnZXRDb250ZW50QXNzaXN0UHJvY2Vzc29ycygKLQkJCUlTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQlJQ29udGVudEFzc2lzdFByb2Nlc3NvcltdIHByb2Nlc3NvcnMgPSBudWxsOwotCi0JCWlmICgocGFydGl0aW9uVHlwZS5lcXVhbHMoSVN0cnVjdHVyZWRQYXJ0aXRpb25zLkRFRkFVTFRfUEFSVElUSU9OKSkKLQkJCQl8fCAocGFydGl0aW9uVHlwZS5lcXVhbHMoSVhNTFBhcnRpdGlvbnMuWE1MX0RFRkFVTFQpKQotCQkJCXx8IChwYXJ0aXRpb25UeXBlLmVxdWFscyhJWFNMUGFydGl0aW9ucy5YU0xfWFBBVEgpKSkgewotCQkJcHJvY2Vzc29ycyA9IG5ldyBJQ29udGVudEFzc2lzdFByb2Nlc3NvcltdIHsgbmV3IFhTTENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKSB9OwotCQl9IGVsc2UgaWYgKHBhcnRpdGlvblR5cGUuZXF1YWxzKElTdHJ1Y3R1cmVkUGFydGl0aW9ucy5VTktOT1dOX1BBUlRJVElPTikpIHsKLQkJCXByb2Nlc3NvcnMgPSBuZXcgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXSB7IG5ldyBOb1JlZ2lvbkNvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKSB9OwotCQl9Ci0JCXJldHVybiBwcm9jZXNzb3JzOwotCX0KLQotCS8qKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5UZXh0U291cmNlVmlld2VyQ29uZmlndXJhdGlvbiNnZXRIeXBlcmxpbmtEZXRlY3RvcnMob3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcikKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSUh5cGVybGlua0RldGVjdG9yW10gZ2V0SHlwZXJsaW5rRGV0ZWN0b3JzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCWlmIChzb3VyY2VWaWV3ZXIgPT0gbnVsbAotCQkJCXx8ICFmUHJlZmVyZW5jZVN0b3JlCi0JCQkJCQkuZ2V0Qm9vbGVhbihBYnN0cmFjdERlY29yYXRlZFRleHRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9IWVBFUkxJTktTX0VOQUJMRUQpKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlIeXBlcmxpbmtEZXRlY3RvcltdIHN1cGVyRGV0ZWN0b3JzID0gc3VwZXIKLQkJCQkuZ2V0SHlwZXJsaW5rRGV0ZWN0b3JzKHNvdXJjZVZpZXdlcik7Ci0JCUlIeXBlcmxpbmtEZXRlY3RvcltdIGFsbERldGVjdG9ycyA9IG5ldyBJSHlwZXJsaW5rRGV0ZWN0b3Jbc3VwZXJEZXRlY3RvcnMubGVuZ3RoICsgMV07Ci0JCWFsbERldGVjdG9yc1swXSA9IG5ldyBYU0xIeXBlcmxpbmtEZXRlY3RvcigpOwotCQlTeXN0ZW0uYXJyYXljb3B5KHN1cGVyRGV0ZWN0b3JzLCAwLCBhbGxEZXRlY3RvcnMsIDEsCi0JCQkJc3VwZXJEZXRlY3RvcnMubGVuZ3RoKTsKLQkJcmV0dXJuIGFsbERldGVjdG9yczsKLQl9Ci0KLQkvKioKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhNTCNnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXIpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZ1tdIGdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJaWYgKGZDb25maWd1cmVkQ29udGVudFR5cGVzID09IG51bGwpIHsKLQkJCVN0cmluZ1tdIHhzbFR5cGVzID0gU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhTTAotCQkJCQkuZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcygpOwotCQkJZkNvbmZpZ3VyZWRDb250ZW50VHlwZXMgPSBuZXcgU3RyaW5nW3hzbFR5cGVzLmxlbmd0aCArIDJdOwotCQkJZkNvbmZpZ3VyZWRDb250ZW50VHlwZXNbMF0gPSBJU3RydWN0dXJlZFBhcnRpdGlvbnMuREVGQVVMVF9QQVJUSVRJT047Ci0JCQlmQ29uZmlndXJlZENvbnRlbnRUeXBlc1sxXSA9IElTdHJ1Y3R1cmVkUGFydGl0aW9ucy5VTktOT1dOX1BBUlRJVElPTjsKLQkJCWludCBpbmRleCA9IDA7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHhzbFR5cGVzLCAwLCBmQ29uZmlndXJlZENvbnRlbnRUeXBlcywgaW5kZXggKz0gMiwKLQkJCQkJeHNsVHlwZXMubGVuZ3RoKTsKLQkJfQotCQlyZXR1cm4gZkNvbmZpZ3VyZWRDb250ZW50VHlwZXM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIExpbmVTdHlsZVByb3ZpZGVyW10gZ2V0TGluZVN0eWxlUHJvdmlkZXJzKAotCQkJSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCUxpbmVTdHlsZVByb3ZpZGVyW10gcHJvdmlkZXJzID0gbnVsbDsKLSAgICAgICAgaWYgKGlzWE1MUGFydGl0aW9uKHBhcnRpdGlvblR5cGUpKSB7Ci0gICAgCQlwcm92aWRlcnMgPSBuZXcgTGluZVN0eWxlUHJvdmlkZXJbXSB7Z2V0TGluZVN0eWxlUHJvdmlkZXJGb3JYU0woKX07Ci0JCX0KLQkJcmV0dXJuIHByb3ZpZGVyczsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNYTUxQYXJ0aXRpb24oU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJcmV0dXJuIHBhcnRpdGlvblR5cGUuZXF1YWxzKElYTUxQYXJ0aXRpb25zLlhNTF9ERUZBVUxUKQotCQkJCXx8IHBhcnRpdGlvblR5cGUuZXF1YWxzKElYTUxQYXJ0aXRpb25zLlhNTF9DREFUQSkKLQkJCQl8fCBwYXJ0aXRpb25UeXBlLmVxdWFscyhJWE1MUGFydGl0aW9ucy5YTUxfQ09NTUVOVCkKLQkJCQl8fCBwYXJ0aXRpb25UeXBlLmVxdWFscyhJWE1MUGFydGl0aW9ucy5YTUxfREVDTEFSQVRJT04pCi0JCQkJfHwgcGFydGl0aW9uVHlwZS5lcXVhbHMoSVhNTFBhcnRpdGlvbnMuWE1MX1BJKQotCQkJCXx8IHBhcnRpdGlvblR5cGUuZXF1YWxzKElYU0xQYXJ0aXRpb25zLlhTTF9YUEFUSCk7Ci0JfQotCQotCXByb3RlY3RlZCBMaW5lU3R5bGVQcm92aWRlciBnZXRMaW5lU3R5bGVQcm92aWRlckZvclhTTCgpIHsKLQkJaWYgKGZMaW5lU3R5bGVQcm92aWRlckZvclhTTCA9PSBudWxsKSB7Ci0JCQlmTGluZVN0eWxlUHJvdmlkZXJGb3JYU0wgPSBuZXcgTGluZVN0eWxlUHJvdmlkZXJGb3JYU0woKTsKLQkJfQotCQlyZXR1cm4gZkxpbmVTdHlsZVByb3ZpZGVyRm9yWFNMOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9TdHlsZXNoZWV0Vmlldy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL1N0eWxlc2hlZXRWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiZjU3NjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL1N0eWxlc2hlZXRWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLkJhc2VXb3JrYmVuY2hDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLlhTTENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLm1vZGVsLlN0eWxlc2hlZXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUubW9kZWwuWFNMTm9kZTsKLQotLyoqCi0gKiAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHlsZXNoZWV0VmlldyBleHRlbmRzIFZpZXdQYXJ0Ci17Ci0JcHJpdmF0ZSBJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3I7Ci0JLy9wcml2YXRlIGJvb2xlYW4gaXNGaXJpbmdTZWxlY3Rpb247Ci0JcHJpdmF0ZSBUcmVlVmlld2VyIHR2OwotCXByaXZhdGUgSVBhcnRMaXN0ZW5lciBwYXJ0TGlzdGVuZXIgPSBuZXcgSVBhcnRMaXN0ZW5lcigpewotCQkKLQkJcHVibGljIHZvaWQgcGFydEFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KQotCQl7Ci0JCQlpZiAocGFydCBpbnN0YW5jZW9mIElFZGl0b3JQYXJ0KQotCQkJewotCQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IChJRWRpdG9yUGFydClwYXJ0OwotCQkJCUlFZGl0b3JJbnB1dCBlZElucHV0ID0gZWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0JCQkJaWYgKGVkSW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KQotCQkJCXsKLQkJCQkJSUZpbGVFZGl0b3JJbnB1dCBlZEZpbGVJbnB1dCA9IChJRmlsZUVkaXRvcklucHV0KWVkSW5wdXQ7Ci0JCQkJCWlmIChYU0xDb3JlLmlzWFNMRmlsZShlZEZpbGVJbnB1dC5nZXRGaWxlKCkpKQotCQkJCQl7Ci0JCQkJCQlhY3RpdmVFZGl0b3IgPSBlZGl0b3I7Ci0JCQkJCQlTdHlsZXNoZWV0TW9kZWwgbW9kZWwgPSBYU0xDb3JlLmdldEluc3RhbmNlKCkuZ2V0U3R5bGVzaGVldChlZEZpbGVJbnB1dC5nZXRGaWxlKCkpOwotCQkJCQkJdHYuc2V0SW5wdXQobW9kZWwuZ2V0U3R5bGVzaGVldCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnQgcGFydCkKLQkJewotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydENsb3NlZChJV29ya2JlbmNoUGFydCBwYXJ0KQotCQl7Ci0JCQlpZiAocGFydCA9PSBhY3RpdmVFZGl0b3IpCi0JCQl7Ci0JCQkJdHYuc2V0SW5wdXQobnVsbCk7Ci0JCQkJYWN0aXZlRWRpdG9yID0gbnVsbDsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnREZWFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KQotCQl7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpCi0JCXsKLQkJfQotCQkKLQl9OyAKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXQoSVZpZXdTaXRlIHNpdGUsIElNZW1lbnRvIG1lbWVudG8pIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbgotCXsKLQkJc3VwZXIuaW5pdChzaXRlLCBtZW1lbnRvKTsKLQkJc2l0ZS5nZXRQYWdlKCkuYWRkUGFydExpc3RlbmVyKHBhcnRMaXN0ZW5lcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotCXsKLQkJZ2V0U2l0ZSgpLmdldFBhZ2UoKS5yZW1vdmVQYXJ0TGlzdGVuZXIocGFydExpc3RlbmVyKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KQotCXsKLQkJVHJlZSB0cmVlID0gbmV3IFRyZWUocGFyZW50LFNXVC5OT05FKTsKLQkJdGhpcy50diA9IG5ldyBUcmVlVmlld2VyKHRyZWUpOwotCQl0di5zZXRDb250ZW50UHJvdmlkZXIobmV3IEJhc2VXb3JrYmVuY2hDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXR2LnNldExhYmVsUHJvdmlkZXIobmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKSk7Ci0JCXR2LmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpewotCi0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLQkJCXsKLQkJCQlpZiAoZ2V0U2l0ZSgpLmdldFBhZ2UoKS5nZXRBY3RpdmVQYXJ0KCkgPT0gU3R5bGVzaGVldFZpZXcudGhpcykKLQkJCQkJaGFuZGxlVHJlZVNlbGVjdGlvbigoSVN0cnVjdHVyZWRTZWxlY3Rpb24pZXZlbnQuZ2V0U2VsZWN0aW9uKCksZmFsc2UpOwotCQkJfQotCQl9KTsKLQkJdHYuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihuZXcgSURvdWJsZUNsaWNrTGlzdGVuZXIoKXsKLQotCQkJcHVibGljIHZvaWQgZG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudCBldmVudCkKLQkJCXsKLQkJCQloYW5kbGVUcmVlU2VsZWN0aW9uKChJU3RydWN0dXJlZFNlbGVjdGlvbilldmVudC5nZXRTZWxlY3Rpb24oKSx0cnVlKTsKLQkJCX0KLQkJCQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVRyZWVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uLCBib29sZWFuIHJldmVhbCkKLQl7Ci0JCWlmIChhY3RpdmVFZGl0b3IgIT0gbnVsbCkKLQkJewotLy8JCQlpc0ZpcmluZ1NlbGVjdGlvbiA9IHRydWU7Ci0JCQlpZiAoc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpIGluc3RhbmNlb2YgWFNMTm9kZSkKLQkJCXsKLQkJCQlYU0xOb2RlIG5vZGUgPSAoWFNMTm9kZSlzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCi0JCQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcilhY3RpdmVFZGl0b3IuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcyk7Ci0JCQkJaWYgKHRleHRFZGl0b3IgIT0gbnVsbCkKLQkJCQl7Ci0JCQkJCS8vaWYgKHJldmVhbCkKLQkJCQkJCXRleHRFZGl0b3Iuc2VsZWN0QW5kUmV2ZWFsKG5vZGUuZ2V0T2Zmc2V0KCksIDApOwotCQkJCQkvL2Vsc2UKLQkJCQkJCS8vIHRleHRFZGl0b3Iuc2V0SGlnaGxpZ2h0UmFuZ2Uobm9kZS5nZXRPZmZzZXQoKSwgMCwgdHJ1ZSk7Ci0JCQkJfQotCQkJfQotLy8JCQlpc0ZpcmluZ1NlbGVjdGlvbiA9IGZhbHNlOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKQotCXsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvWFNMTW9kZWxBZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL1hTTE1vZGVsQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQzNmIzNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvWFNMTW9kZWxBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBYU0xNb2RlbEFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5Ci17Ci0JcHJpdmF0ZSBzdGF0aWMgQ2xhc3NbXSBMSVNUID0gbmV3IENsYXNzW117SVdvcmtiZW5jaEFkYXB0ZXIuY2xhc3N9OwotCXByaXZhdGUgSVdvcmtiZW5jaEFkYXB0ZXIgYWRhcHRlciA9IG5ldyBYU0xXb3JrYmVuY2hBZGFwdGVyKCk7Ci0JCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGVPYmplY3QsIENsYXNzIGFkYXB0ZXJUeXBlKQotCXsKLQkJaWYgKElXb3JrYmVuY2hBZGFwdGVyLmNsYXNzLmVxdWFscyhhZGFwdGVyVHlwZSkpCi0JCQlyZXR1cm4gYWRhcHRlcjsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkKLQl7Ci0JCXJldHVybiBMSVNUOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9YU0xVSUNvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL1hTTFVJQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NjY1NDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL1hTTFVJQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsOwotCi1wdWJsaWMgY2xhc3MgWFNMVUlDb25zdGFudHMKLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURU1QTEFURV9DT05URVhUX1hTTF9ORVcgPSAieHNsX25ldyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0ZJTEVfVEVNUExBVEVfTkFNRSA9ICJORVdfRklMRV9URU1QTEFURV9OQU1FIjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9YU0xVSVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL1hTTFVJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5NzU0Y2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL1hTTFVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5Db250ZXh0VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLnBlcnNpc3RlbmNlLlRlbXBsYXRlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LnRlbXBsYXRlcy5Db250cmlidXRpb25Db250ZXh0VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC50ZW1wbGF0ZXMuQ29udHJpYnV0aW9uVGVtcGxhdGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICovCi1wdWJsaWMgY2xhc3MgWFNMVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQkKLQkvKioKLQkgKiBUaGUgdGVtcGxhdGUgc3RvcmUgZm9yIHRoZSB4c2wgZWRpdG9yLgotCSAqLwotCXByaXZhdGUgVGVtcGxhdGVTdG9yZSBmVGVtcGxhdGVTdG9yZTsKLQotCQotICAgIC8vcHJpdmF0ZSBTY29wZWRQcmVmZXJlbmNlU3RvcmUgcHJlZmVyZW5jZVN0b3JlOwotICAgIAotCS8qKgotCSAqIFRoZSB0ZW1wbGF0ZSBjb250ZXh0IHR5cGUgcmVnaXN0cnkgZm9yIHRoZSB4bWwgZWRpdG9yLgotCSAqLwotCXByaXZhdGUgQ29udHJpYnV0aW9uQ29udGV4dFR5cGVSZWdpc3RyeSBmQ29udGV4dFR5cGVSZWdpc3RyeTsKLQkKLQkvKioKLQkgKiBUaGUgcGx1Z2luIGlkIGZvciB0aGlzIHBsdWdpbi4KLQkgKi8KLQlzdGF0aWMgZmluYWwgcHVibGljIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzbC51aSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBYU0xVSVBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgWFNMVUlQbHVnaW4oKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlwbHVnaW4gPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBYU0xVSVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coRXhjZXB0aW9uIGUpCi0JewotCQlnZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCAwLCAiIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhDb3JlRXhjZXB0aW9uIGUpCi0JewotCQlnZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKGUuZ2V0U3RhdHVzKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRlbXBsYXRlIHN0b3JlIGZvciB0aGUgeHNsIHRlbXBsYXRlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0ZW1wbGF0ZSBzdG9yZSBmb3IgdGhlIHhzbCB0ZW1wbGF0ZXMKLQkgKi8KLQlwdWJsaWMgVGVtcGxhdGVTdG9yZSBnZXRUZW1wbGF0ZVN0b3JlKCkKLQl7Ci0JCWlmIChmVGVtcGxhdGVTdG9yZSA9PSBudWxsKQotCQl7Ci0JCQlmVGVtcGxhdGVTdG9yZSA9IG5ldyBDb250cmlidXRpb25UZW1wbGF0ZVN0b3JlKGdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCksIGdldFByZWZlcmVuY2VTdG9yZSgpLCAib3JnLmVjbGlwc2Uud3N0LnhzbC51aS5jdXN0b21fdGVtcGxhdGVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCXRyeQotCQkJewotCQkJCWZUZW1wbGF0ZVN0b3JlLmxvYWQoKTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKQotCQkJewotCQkJCWxvZyhlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZlRlbXBsYXRlU3RvcmU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGVtcGxhdGUgY29udGV4dCB0eXBlIHJlZ2lzdHJ5IGZvciB0aGUgeHNsIHBsdWdpbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0ZW1wbGF0ZSBjb250ZXh0IHR5cGUgcmVnaXN0cnkgZm9yIHRoZSB4c2wgcGx1Z2luCi0JICovCi0JcHVibGljIENvbnRleHRUeXBlUmVnaXN0cnkgZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKQotCXsKLQkJaWYgKGZDb250ZXh0VHlwZVJlZ2lzdHJ5ID09IG51bGwpCi0JCXsKLQkJCUNvbnRyaWJ1dGlvbkNvbnRleHRUeXBlUmVnaXN0cnkgcmVnaXN0cnkgPSBuZXcgQ29udHJpYnV0aW9uQ29udGV4dFR5cGVSZWdpc3RyeSgpOwotCQkJcmVnaXN0cnkuYWRkQ29udGV4dFR5cGUoInhzbF9uZXciKTsgLy8kTk9OLU5MUy0xJAotCQkJZkNvbnRleHRUeXBlUmVnaXN0cnkgPSByZWdpc3RyeTsKLQkJfQotCQlyZXR1cm4gZkNvbnRleHRUeXBlUmVnaXN0cnk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgRmlsZSBtYWtlRmlsZUZvcihTdHJpbmcgZGlyZWN0b3J5LCBTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoWFNMVUlQbHVnaW4uUExVR0lOX0lEKTsKLQkJVVJMIHVybCA9IGJ1bmRsZS5nZXRFbnRyeSgiLyIpOwotCQlVUkwgbG9jYWxVUkwgPSBGaWxlTG9jYXRvci50b0ZpbGVVUkwodXJsKTsKLQkJU3RyaW5nIGluc3RhbGxQYXRoID0gbG9jYWxVUkwuZ2V0UGF0aCgpOwotCQlTdHJpbmcgdG90YWxEaXJlY3RvcnkgPSBpbnN0YWxsUGF0aCArIGRpcmVjdG9yeTsKLQkJU3RyaW5nIHRvdGFsUGF0aCA9IHRvdGFsRGlyZWN0b3J5ICsgIi8iICsgZmlsZW5hbWU7Ci0JCVVSTCB0b3RhbFVSTCA9IG5ldyBVUkwodXJsLCB0b3RhbFBhdGgpOwotCQkvL1VSTCBmaW5hbHVybCA9IFBsYXRmb3JtLmFzTG9jYWxVUkwodG90YWxVUkwpOwotCQlTdHJpbmcgZmluYWxGaWxlID0gdG90YWxVUkwuZ2V0RmlsZSgpOwotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShmaW5hbEZpbGUpOwotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9YU0xXb3JrYmVuY2hBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvWFNMV29ya2JlbmNoQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjA0ZjIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9YU0xXb3JrYmVuY2hBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLm1vZGVsLkltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUubW9kZWwuSW5jbHVkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUubW9kZWwuU3R5bGVzaGVldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUubW9kZWwuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLm1vZGVsLlZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5tb2RlbC5YU0xNb2RlbE9iamVjdDsKLQotY2xhc3MgWFNMV29ya2JlbmNoQWRhcHRlciBpbXBsZW1lbnRzIElXb3JrYmVuY2hBZGFwdGVyIHsKLQlwcml2YXRlIGZpbmFsIE9iamVjdFtdIEVNUFRZID0gbmV3IE9iamVjdFswXTsKLQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgbykgewotCQlYU0xNb2RlbE9iamVjdCBvYmogPSAoWFNMTW9kZWxPYmplY3QpIG87Ci0JCXN3aXRjaCAob2JqLmdldE1vZGVsVHlwZSgpKSB7Ci0JCWNhc2UgU1RZTEVTSEVFVDoKLQkJCVN0eWxlc2hlZXQgc3R5bGVzaGVldCA9IChTdHlsZXNoZWV0KSBvYmo7Ci0JCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsKLQkJCQkJbmV3IExpc3RXb3JrYmVuY2hBZGFwdGVyKHN0eWxlc2hlZXQsIG51bGwsIHN0eWxlc2hlZXQKLQkJCQkJCQkuZ2V0VmVyc2lvbigpLCAiaWNvbnMvZnVsbC94c2x0X2xhdW5jaC5naWYiKSwKLQkJCQkJbmV3IExpc3RXb3JrYmVuY2hBZGFwdGVyKHN0eWxlc2hlZXQsIHN0eWxlc2hlZXQKLQkJCQkJCQkuZ2V0SW1wb3J0cygpLCAiSW1wb3J0cyIsICJpY29ucy9mdWxsL2ltcG9ydHMuZ2lmIiksCi0JCQkJCW5ldyBMaXN0V29ya2JlbmNoQWRhcHRlcihzdHlsZXNoZWV0LCBzdHlsZXNoZWV0Ci0JCQkJCQkJLmdldEluY2x1ZGVzKCksICJJbmNsdWRlcyIsCi0JCQkJCQkJImljb25zL2Z1bGwvaW1wb3J0cy5naWYiKSwKLQkJCQkJbmV3IExpc3RXb3JrYmVuY2hBZGFwdGVyKHN0eWxlc2hlZXQsIHN0eWxlc2hlZXQKLQkJCQkJCQkuZ2V0R2xvYmFsVmFyaWFibGVzKCksICJWYXJpYWJsZXMiLCBudWxsKSwKLQkJCQkJbmV3IExpc3RXb3JrYmVuY2hBZGFwdGVyKHN0eWxlc2hlZXQsIHN0eWxlc2hlZXQKLQkJCQkJCQkuZ2V0VGVtcGxhdGVzKCksICJUZW1wbGF0ZXMiLCBudWxsKSB9OwotCQl9Ci0JCXJldHVybiBFTVBUWTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCVhTTE1vZGVsT2JqZWN0IG9iaiA9IChYU0xNb2RlbE9iamVjdCkgb2JqZWN0OwotCQlTdHJpbmcgcGF0aCA9IG51bGw7Ci0JCXN3aXRjaCAob2JqLmdldE1vZGVsVHlwZSgpKSB7Ci0JCWNhc2UgU1RZTEVTSEVFVDoKLQkJCXBhdGggPSAiaWNvbnMvZnVsbC94c2x0X2xhdW5jaC5naWYiOwotCQkJYnJlYWs7Ci0JCWNhc2UgSU1QT1JUOgotCQljYXNlIElOQ0xVREU6Ci0JCQlwYXRoID0gImljb25zL2Z1bGwvaW1wb3J0LmdpZiI7Ci0JCQlicmVhazsKLQkJY2FzZSBURU1QTEFURToKLQkJCXBhdGggPSAiaWNvbnMvZnVsbC9tZXRoZGVmX29iai5naWYiOwotCQkJYnJlYWs7Ci0JCWNhc2UgVkFSSUFCTEU6Ci0JCQlwYXRoID0gImljb25zL2Z1bGwvZmllbGRfZGVmYXVsdF9vYmouZ2lmIjsKLQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiBwYXRoID09IG51bGwgPyBudWxsIDogQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKAotCQkJCVhTTFVJUGx1Z2luLlBMVUdJTl9JRCwgcGF0aCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbChPYmplY3QgbykgewotCQlTdHJpbmcgbGFiZWwgPSBudWxsOwotCQlYU0xNb2RlbE9iamVjdCBvYmogPSAoWFNMTW9kZWxPYmplY3QpIG87Ci0JCXN3aXRjaCAob2JqLmdldE1vZGVsVHlwZSgpKSB7Ci0JCWNhc2UgU1RZTEVTSEVFVDoKLQkJCVN0eWxlc2hlZXQgc3R5bGVzaGVldCA9IChTdHlsZXNoZWV0KSBvYmo7Ci0JCQlsYWJlbCA9IHN0eWxlc2hlZXQuZ2V0VmVyc2lvbigpID09IG51bGwgPyAiPyIgOiBzdHlsZXNoZWV0Ci0JCQkJCS5nZXRWZXJzaW9uKCk7Ci0JCQlicmVhazsKLQkJY2FzZSBJTVBPUlQ6Ci0JCQlJbXBvcnQgaW1wID0gKEltcG9ydCkgb2JqOwotCQkJbGFiZWwgPSBpbXAuZ2V0SHJlZigpOwotCQkJYnJlYWs7Ci0JCWNhc2UgSU5DTFVERToKLQkJCUluY2x1ZGUgaW5jID0gKEluY2x1ZGUpIG9iajsKLQkJCWxhYmVsID0gaW5jLmdldEhyZWYoKTsKLQkJCWJyZWFrOwotCQljYXNlIFRFTVBMQVRFOgotCQkJVGVtcGxhdGUgdCA9IChUZW1wbGF0ZSkgb2JqOwotCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJaWYgKHQuZ2V0TmFtZSgpICE9IG51bGwpCi0JCQkJc2IuYXBwZW5kKHQuZ2V0TmFtZSgpKS5hcHBlbmQoIiAiKTsKLQkJCWlmICh0LmdldE1hdGNoKCkgIT0gbnVsbCkKLQkJCQlzYi5hcHBlbmQodC5nZXRNYXRjaCgpKS5hcHBlbmQoIiAiKTsKLQkJCWlmICh0LmdldE1vZGUoKSAhPSBudWxsKQotCQkJCXNiLmFwcGVuZCgiKCIpLmFwcGVuZCh0LmdldE1vZGUoKSkuYXBwZW5kKCIpIik7Ci0JCQlsYWJlbCA9IHNiLnRvU3RyaW5nKCk7Ci0JCQlicmVhazsKLQkJY2FzZSBWQVJJQUJMRToKLQkJCVZhcmlhYmxlIHYgPSAoVmFyaWFibGUpIG9iajsKLQkJCWxhYmVsID0gdi5nZXROYW1lKCk7Ci0JCQlicmVhazsKLQkJfQotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL2FjdGlvbnMvTmV3RFRERmlsZVdpemFyZERlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvYWN0aW9ucy9OZXdEVERGaWxlV2l6YXJkRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdhMmQ1ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvYWN0aW9ucy9OZXdEVERGaWxlV2l6YXJkRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZTsKLQotcHVibGljIGNsYXNzIE5ld0RUREZpbGVXaXphcmREZWxlZ2F0ZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZQotewotCXByaXZhdGUgTmV3V2l6YXJkQWN0aW9uIG9wZW5BY3Rpb247Ci0JcHJpdmF0ZSBJU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpCi0JewotCQl0aGlzLm9wZW5BY3Rpb24gPSBuZXcgTmV3V2l6YXJkQWN0aW9uKCJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLndpemFyZC5OZXdEVERXaXphcmQiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pCi0JewotCQlvcGVuQWN0aW9uLnNldFNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQlvcGVuQWN0aW9uLnJ1bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotCXsKLQkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpCi0JewotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9hY3Rpb25zL05ld1dTRExGaWxlV2l6YXJkRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9hY3Rpb25zL05ld1dTRExGaWxlV2l6YXJkRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q4ZGE3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvYWN0aW9ucy9OZXdXU0RMRmlsZVdpemFyZERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGU7Ci0KLXB1YmxpYyBjbGFzcyBOZXdXU0RMRmlsZVdpemFyZERlbGVnYXRlIGltcGxlbWVudHMgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlCi17Ci0JcHJpdmF0ZSBOZXdXaXphcmRBY3Rpb24gb3BlbkFjdGlvbjsKLQlwcml2YXRlIElTZWxlY3Rpb24gc2VsZWN0aW9uOwotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoV2luZG93IHdpbmRvdykKLQl7Ci0JCXRoaXMub3BlbkFjdGlvbiA9IG5ldyBOZXdXaXphcmRBY3Rpb24oIm9yZy5lY2xpcHNlLndzdC53c2RsLnVpIik7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKQotCXsKLQkJb3BlbkFjdGlvbi5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJb3BlbkFjdGlvbi5ydW4oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikKLQl7Ci0JCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotCXsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvYWN0aW9ucy9OZXdXaXphcmRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9hY3Rpb25zL05ld1dpemFyZEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDJjMmEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9hY3Rpb25zL05ld1dpemFyZEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5JV2l6YXJkRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLlhTTFVJUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgTmV3V2l6YXJkQWN0aW9uIGV4dGVuZHMgQWN0aW9uCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWklOR19XSVpBUkRfV0lEVEggPSA1MDA7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWklOR19XSVpBUkRfSEVJR0hUID0gNTAwOwotCi0JcHJpdmF0ZSBJU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQlwcml2YXRlIFN0cmluZyBpZDsKLQkKLQlwdWJsaWMgTmV3V2l6YXJkQWN0aW9uKFN0cmluZyBpZCkKLQl7Ci0JCXRoaXMuaWQgPSBpZDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBydW4oKQotCXsKLQkJSVdpemFyZERlc2NyaXB0b3IgZGVzYyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0TmV3V2l6YXJkUmVnaXN0cnkoKS5maW5kV2l6YXJkKGlkKTsKLQkJaWYgKGRlc2MgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJdHJ5Ci0JCXsKLQkJCVNoZWxsIHNoZWxsID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpOwotCQkJSVdvcmtiZW5jaFdpemFyZCB3aXphcmQgPSBkZXNjLmNyZWF0ZVdpemFyZCgpOwotCi0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzc2VsID0gbnVsbDsKLQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkJCXsKLQkJCQlzc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJc3NlbCA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCk7Ci0JCQl9Ci0JCQl3aXphcmQuaW5pdChQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLCBzc2VsKTsKLQotCQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coc2hlbGwsIHdpemFyZCk7Ci0JCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRTaXplKE1hdGgubWF4KFNJWklOR19XSVpBUkRfV0lEVEgsIGRpYWxvZy5nZXRTaGVsbCgpLmdldFNpemUoKS54KSwgU0laSU5HX1dJWkFSRF9IRUlHSFQpOwotCQkJLy8gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChkaWFsb2cuZ2V0U2hlbGwoKSxJV29ya2JlbmNoSGVscENvbnRleHRJZHMuTkVXX1dJWkFSRCk7Ci0JCQlkaWFsb2cub3BlbigpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JCXsKLQkJCVhTTFVJUGx1Z2luLmxvZyhlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikKLQl7Ci0JCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9hY3Rpb25zL05ld1hNTEZpbGVXaXphcmREZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL2FjdGlvbnMvTmV3WE1MRmlsZVdpemFyZERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MjMyZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL2FjdGlvbnMvTmV3WE1MRmlsZVdpemFyZERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGU7Ci0KLXB1YmxpYyBjbGFzcyBOZXdYTUxGaWxlV2l6YXJkRGVsZWdhdGUgaW1wbGVtZW50cyBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUKLXsKLQlwcml2YXRlIE5ld1dpemFyZEFjdGlvbiBvcGVuQWN0aW9uOwotCXByaXZhdGUgSVNlbGVjdGlvbiBzZWxlY3Rpb247Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2hXaW5kb3cgd2luZG93KQotCXsKLQkJdGhpcy5vcGVuQWN0aW9uID0gbmV3IE5ld1dpemFyZEFjdGlvbigib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC53aXphcmRzLk5ld1hNTFdpemFyZCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikKLQl7Ci0JCW9wZW5BY3Rpb24uc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCW9wZW5BY3Rpb24ucnVuKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0JewotCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLQl7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL2FjdGlvbnMvTmV3WFNERmlsZVdpemFyZERlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvYWN0aW9ucy9OZXdYU0RGaWxlV2l6YXJkRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUyMWZkYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvYWN0aW9ucy9OZXdYU0RGaWxlV2l6YXJkRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZTsKLQotcHVibGljIGNsYXNzIE5ld1hTREZpbGVXaXphcmREZWxlZ2F0ZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZQotewotCXByaXZhdGUgTmV3V2l6YXJkQWN0aW9uIG9wZW5BY3Rpb247Ci0JcHJpdmF0ZSBJU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpCi0JewotCQl0aGlzLm9wZW5BY3Rpb24gPSBuZXcgTmV3V2l6YXJkQWN0aW9uKCJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLndpemFyZHMuTmV3WFNEV2l6YXJkIik7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKQotCXsKLQkJb3BlbkFjdGlvbi5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJb3BlbkFjdGlvbi5ydW4oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikKLQl7Ci0JCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotCXsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvYWN0aW9ucy9OZXdYU0xGaWxlV2l6YXJkRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9hY3Rpb25zL05ld1hTTEZpbGVXaXphcmREZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTRjYTMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9hY3Rpb25zL05ld1hTTEZpbGVXaXphcmREZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlOwotCi1wdWJsaWMgY2xhc3MgTmV3WFNMRmlsZVdpemFyZERlbGVnYXRlIGltcGxlbWVudHMgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlCi17Ci0JcHJpdmF0ZSBOZXdXaXphcmRBY3Rpb24gb3BlbkFjdGlvbjsKLQlwcml2YXRlIElTZWxlY3Rpb24gc2VsZWN0aW9uOwotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoV2luZG93IHdpbmRvdykKLQl7Ci0JCXRoaXMub3BlbkFjdGlvbiA9IG5ldyBOZXdXaXphcmRBY3Rpb24oIm9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwud2l6YXJkcy5OZXdTdHlsZXNoZWV0V2l6YXJkIik7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKQotCXsKLQkJb3BlbkFjdGlvbi5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJb3BlbkFjdGlvbi5ydW4oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikKLQl7Ci0JCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotCXsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9BYnN0cmFjdFhNTEVsZW1lbnRDb250ZW50QXNzaXN0UmVxdWVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQWJzdHJhY3RYTUxFbGVtZW50Q29udGVudEFzc2lzdFJlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI0OGQ3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9BYnN0cmFjdFhNTEVsZW1lbnRDb250ZW50QXNzaXN0UmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKkNvcHlyaWdodCAoYykgMjAwOSBTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwgYW5kIG90aGVycy4KLSAqQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICphcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKkNvbnRyaWJ1dG9yczoKLSAqICAgIERhdmlkIENhcnZlciAoU1RBUikgIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01OYW1lc3BhY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5YTUxSZWxldmFuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuQ01JbWFnZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuWE1MRWRpdG9yUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFnaW5mby5NYXJrdXBUYWdJbmZvUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC5jb3JlLnV0aWwuWFNMVFhQYXRoSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5jb250ZW50bW9kZWwuWFNMQ29udGVudE1vZGVsR2VuZXJhdG9yOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotLyoqCi0gKiBBZG9wdGVycyBjYW4gZXh0ZW5kIHRoaXMgY2xhc3MgdG8gaW1wbGVtZW50IHRoZWlyIG93biBjb250ZW50IGFzc2lzdGFuY2UgZm9yIEVsZW1lbnQKLSAqIHByb3Bvc2FscyB1c2luZyB0aGUgWE1MIENvbnRlbnQgTW9kZWwuCi0gKiAKLSAqIEBhdXRob3IgRGF2aWQgQ2FydmVyCi0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RYTUxFbGVtZW50Q29udGVudEFzc2lzdFJlcXVlc3QgZXh0ZW5kcyBBYnN0cmFjdFhTTENvbnRlbnRBc3Npc3RSZXF1ZXN0IHsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFhQQVRIX0ZJUlNUX1hTTEFOQ0VTVE9SX05PREUgPSAiYW5jZXN0b3I6OnhzbDoqWzFdIjsKLQlwcm90ZWN0ZWQgTWFya3VwVGFnSW5mb1Byb3ZpZGVyIGluZm9Qcm92aWRlciA9IG51bGw7Ci0JcHJvdGVjdGVkIFhTTENvbnRlbnRNb2RlbEdlbmVyYXRvciBjb250ZW50TW9kZWw7Ci0JCi0JLyoqCi0JICoKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEBwYXJhbSBkb2N1bWVudFJlZ2lvbgotCSAqIEBwYXJhbSBjb21wbGV0aW9uUmVnaW9uCi0JICogQHBhcmFtIGJlZ2luCi0JICogQHBhcmFtIGxlbmd0aAotCSAqIEBwYXJhbSBmaWx0ZXIKLQkgKiBAcGFyYW0gdGV4dFZpZXdlcgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFhNTEVsZW1lbnRDb250ZW50QXNzaXN0UmVxdWVzdChOb2RlIG5vZGUsCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uLAotCQkJSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgaW50IGJlZ2luLCBpbnQgbGVuZ3RoLCBTdHJpbmcgZmlsdGVyLAotCQkJSVRleHRWaWV3ZXIgdGV4dFZpZXdlcikgewotCQlzdXBlcihub2RlLCBkb2N1bWVudFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgYmVnaW4sIGxlbmd0aCwgZmlsdGVyLCB0ZXh0Vmlld2VyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmF0b3I8Q01Ob2RlPiBnZXRBdmFpbGFibGVDb250ZW50Tm9kZXMoSURPTURvY3VtZW50IGRvbURvY3VtZW50LCBOb2RlIGFuY2VzdG9yTm9kZSwgaW50IGluY2x1ZGVPcHRpb25zKSB7Ci0JCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZG9tRG9jdW1lbnQpOwotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBjbUVsZW1lbnREZWMgPSBtb2RlbFF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKChFbGVtZW50KWFuY2VzdG9yTm9kZSk7Ci0JCUxpc3QgPENNTm9kZT4gY21Ob2RlTGlzdCA9IG1vZGVsUXVlcnkuZ2V0QXZhaWxhYmxlQ29udGVudCgoRWxlbWVudClhbmNlc3Rvck5vZGUsIGNtRWxlbWVudERlYywgaW5jbHVkZU9wdGlvbnMpOwotCQlJdGVyYXRvciA8Q01Ob2RlPiBjbU5vZGVJdCA9IGNtTm9kZUxpc3QuaXRlcmF0b3IoKTsKLQkJcmV0dXJuIGNtTm9kZUl0OwotCX0KLQotCXByb3RlY3RlZCBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgY3JlYXRlUHJvcG9zYWwoU3RyaW5nIHByb3Bvc2VkVGV4dCwgU3RyaW5nIGFkZGl0aW9uYWxJbmZvLCBpbnQgb2Zmc2V0LAotCQkJSW1hZ2UgaW1hZ2UsIGludCBzdGFydExlbmd0aCkgewotCQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoCi0JCQkJCQlwcm9wb3NlZFRleHQsIG9mZnNldCwgMCwgc3RhcnRMZW5ndGggKyBwcm9wb3NlZFRleHQubGVuZ3RoKCkgLSBnZXRNYXRjaFN0cmluZygpLmxlbmd0aCgpLCAKLQkJCQkJCWltYWdlLCBwcm9wb3NlZFRleHQsIG51bGwsIGFkZGl0aW9uYWxJbmZvLCAwLCB0cnVlKTsKLQkJCQlyZXR1cm4gcHJvcG9zYWw7Ci0JCQl9Ci0KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0Q01Ob2RlSW1hZ2UoQ01Ob2RlIGNtTm9kZSkgewotCQlJbWFnZSBpbWFnZSA9IENNSW1hZ2VVdGlsLmdldEltYWdlKGNtTm9kZSk7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQlpbWFnZSA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyCi0JCQkJCS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRJbWFnZSgKLQkJCQkJCQlYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfR0VORVJJQyk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVxdWlyZWROYW1lKE5vZGUgb3duZXJOb2RlLCBDTU5vZGUgY21ub2RlKSB7Ci0JCWlmIChvd25lck5vZGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIERPTU5hbWVzcGFjZUhlbHBlci5jb21wdXRlTmFtZShjbW5vZGUsIG93bmVyTm9kZSwgbnVsbCk7Ci0JCX0KLQkJcmV0dXJuIGNtbm9kZS5nZXROb2RlTmFtZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyBjbW5vZGUncyBkb2N1bWVudGF0aW9uIHRvIGRpc3BsYXkgaW4gdGhlIGNvbXBsZXRpb24gcHJvcG9zYWwncwotCSAqIGFkZGl0aW9uYWwgaW5mby4gSWYgbm8gZG9jdW1lbnRhdGlvbiBleGlzdHMgZm9yIGNtbm9kZSwgdHJ5IGRpc3BsYXlpbmcKLQkgKiBwYXJlbnRPck93bmVyJ3MgZG9jdW1lbnRhdGlvbgotCSAqIAotCSAqIFN0cmluZyBhbnkgZG9jdW1lbnRhdGlvbiBpbmZvcm1hdGlvbiB0byBkaXNwbGF5IGZvciBjbW5vZGUuCi0JICogPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm90aGluZyB0byBkaXNwbGF5LgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QWRkaXRpb25hbEluZm8oQ01Ob2RlIHBhcmVudE9yT3duZXIsIENNTm9kZSBjbW5vZGUpIHsKLQkJU3RyaW5nIGFkZGxJbmZvID0gbnVsbDsKLQkKLQkJaWYgKGNtbm9kZSA9PSBudWxsKSB7Ci0JCQlpZiAoRGVidWcuZGlzcGxheVdhcm5pbmdzKSB7Ci0JCQkJbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTnVsbCBkZWNsYXJhdGlvbiEiKS5wcmludFN0YWNrVHJhY2UoKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkKLQkJYWRkbEluZm8gPSBnZXRJbmZvUHJvdmlkZXIoKS5nZXRJbmZvKGNtbm9kZSk7Ci0JCWlmICgoYWRkbEluZm8gPT0gbnVsbCkgJiYgKHBhcmVudE9yT3duZXIgIT0gbnVsbCkpIHsKLQkJCWFkZGxJbmZvID0gZ2V0SW5mb1Byb3ZpZGVyKCkuZ2V0SW5mbyhwYXJlbnRPck93bmVyKTsKLQkJfQotCQlyZXR1cm4gYWRkbEluZm87Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgaW5mb1Byb3ZpZGVyLgotCSAqIAotCSAqIGZJbmZvUHJvdmlkZXIgYW5kIGlmIGZJbmZvUHJvdmlkZXIgd2FzIDxjb2RlPm51bGw8L2NvZGU+IGNyZWF0ZSBhIG5ldwotCSAqIGluc3RhbmNlCi0JICovCi0JcHJvdGVjdGVkIE1hcmt1cFRhZ0luZm9Qcm92aWRlciBnZXRJbmZvUHJvdmlkZXIoKSB7Ci0JCWlmIChpbmZvUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJaW5mb1Byb3ZpZGVyID0gbmV3IE1hcmt1cFRhZ0luZm9Qcm92aWRlcigpOwotCQl9Ci0JCXJldHVybiBpbmZvUHJvdmlkZXI7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYmVnaW5zV2l0aChTdHJpbmcgYVN0cmluZywgU3RyaW5nIHByZWZpeCkgewotCQlpZiAoKGFTdHJpbmcgPT0gbnVsbCkgfHwgKHByZWZpeCA9PSBudWxsKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGFTdHJpbmcudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKHByZWZpeC50b0xvd2VyQ2FzZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayB0byBzZWUgaWYgdGhlIGN1cnJlbnQgcG9zaXRpb24gaXMgaW4gYW4gQXR0cmlidXRlIFJlZ2lvbiBpZiBzbywKLQkgKiByZXR1cm4gdHJ1ZSBvdGhlcndpc2UgZmFsc2UKLQkgKiBAcmV0dXJuIFRydWUgaWYgaW4gYXR0cmlidXRlIHJlZ2lvbiwgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGluQXR0cmlidXRlUmVnaW9uKCkgewotCQlyZXR1cm4gcmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uID4gZG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSArIHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHByb3Bvc2FscyBmb3IgdGhlIFhNTF9UQUdfTkFNRSByZWdpb24uCi0JICogQHBhcmFtIHBvc2l0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVGFnTmFtZVByb3Bvc2FscyhpbnQgcG9zaXRpb24pIHsKLQkKLQkJTm9kZSBhbmNlc3Rvck5vZGUgPSBudWxsOwotCQl0cnkgewotCQkJYW5jZXN0b3JOb2RlID0gWFNMVFhQYXRoSGVscGVyLnNlbGVjdFNpbmdsZU5vZGUoZ2V0Tm9kZSgpLAotCQkJCQlYUEFUSF9GSVJTVF9YU0xBTkNFU1RPUl9OT0RFKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkKLQkJTGlzdDxDTU5vZGU+IGNtbm9kZXMgPSBudWxsOwotCQotCQlpZiAoYW5jZXN0b3JOb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCWNtbm9kZXMgPSBnZXRBdmFpbGFibGVDaGlsZEVsZW1lbnREZWNsYXJhdGlvbnMoCi0JCQkJCShFbGVtZW50KSBhbmNlc3Rvck5vZGUsIDApOwotCQkJSXRlcmF0b3I8Q01Ob2RlPiBub2RlSXRlcmF0b3IgPSBjbW5vZGVzLml0ZXJhdG9yKCk7Ci0JCQkvLyBjaG9wIG9mZiBhbnkgbGVhZGluZyA8J3MgYW5kIHdoaXRlc3BhY2UgZnJvbSB0aGUgbWF0Y2hzdHJpbmcKLQkJCXdoaWxlICgobWF0Y2hTdHJpbmcubGVuZ3RoKCkgPiAwKQotCQkJCQkmJiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShtYXRjaFN0cmluZy5jaGFyQXQoMCkpIHx8IGJlZ2luc1dpdGgoCi0JCQkJCQkJbWF0Y2hTdHJpbmcsICI8IikpKSB7Ci0JCQkJLy8kTk9OLU5MUy0xJAotCQkJCW1hdGNoU3RyaW5nID0gbWF0Y2hTdHJpbmcuc3Vic3RyaW5nKDEpOwotCQkJfQotCQkJaWYgKCFub2RlSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJd2hpbGUgKG5vZGVJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlDTU5vZGUgZWxlbWVudERlY2wgPSBub2RlSXRlcmF0b3IubmV4dCgpOwotCQkJCWlmIChlbGVtZW50RGVjbCAhPSBudWxsKSB7Ci0JCQkJCS8vIG9ubHkgYWRkIHByb3Bvc2FscyBmb3IgdGhlIGNoaWxkIGVsZW1lbnQncyB0aGF0IGJlZ2luCi0JCQkJCS8vIHdpdGggdGhlIG1hdGNoc3RyaW5nCi0JCQkJCVN0cmluZyBwcm9wb3NlZFRleHQgPSBudWxsOwotCQotCQkJCQlwcm9wb3NlZFRleHQgPSBjb250ZW50TW9kZWwuZ2V0UmVxdWlyZWROYW1lKGFuY2VzdG9yTm9kZSwKLQkJCQkJCQllbGVtZW50RGVjbCk7Ci0JCQkJCWludCBjdXJzb3JBZGp1c3RtZW50ID0gcHJvcG9zZWRUZXh0Lmxlbmd0aCgpOwotCQotCQkJCQlpZiAoZWxlbWVudERlY2wgaW5zdGFuY2VvZiBDTUVsZW1lbnREZWNsYXJhdGlvbikgewotCQkJCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pIGVsZW1lbnREZWNsOwotCQkJCQkJaWYgKGVkLmdldENvbnRlbnRUeXBlKCkgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFkpIHsKLQkJCQkJCQlwcm9wb3NlZFRleHQgKz0gY29udGVudE1vZGVsLmdldFN0YXJ0VGFnQ2xvc2UoCi0JCQkJCQkJCQlhbmNlc3Rvck5vZGUsIGVkKTsKLQkJCQkJCQljdXJzb3JBZGp1c3RtZW50ID0gcHJvcG9zZWRUZXh0Lmxlbmd0aCgpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJCQkJY29udGVudE1vZGVsLmdlbmVyYXRlVGFnKGFuY2VzdG9yTm9kZSwgZWQsIHNiKTsKLQkJCQkJCQkvLyBzaW5jZSBpdCdzIGEgbmFtZSBwcm9wb3NhbCwgYXNzdW1lICc8JyBpcwotCQkJCQkJCS8vIGFscmVhZHkgdGhlcmUKLQkJCQkJCQkvLyBvbmx5IHJldHVybiB0aGUgcmVzdCBvZiB0aGUgdGFnCi0JCQkJCQkJcHJvcG9zZWRUZXh0ID0gc2IudG9TdHJpbmcoKS5zdWJzdHJpbmcoMSk7Ci0JCQkJCQkJY3Vyc29yQWRqdXN0bWVudCA9IGdldEN1cnNvclBvc2l0aW9uRm9yUHJvcG9zZWRUZXh0KHByb3Bvc2VkVGV4dCk7Ci0JCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGJlZ2luc1dpdGgocHJvcG9zZWRUZXh0LCBtYXRjaFN0cmluZykpIHsKLQkJCQkJCUltYWdlIGltYWdlID0gQ01JbWFnZVV0aWwuZ2V0SW1hZ2UoZWxlbWVudERlY2wpOwotCQkJCQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCQkJCQlpbWFnZSA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyCi0JCQkJCQkJCQkuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCQkJLmdldEltYWdlKAotCQkJCQkJCQkJCQlYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfR0VORVJJQyk7Ci0JCQkJCQl9Ci0JCQkJCQlTdHJpbmcgcHJvcG9zZWRJbmZvID0gZ2V0QWRkaXRpb25hbEluZm8oCi0JCQkJCQkJCWdldENNRWxlbWVudERlY2xhcmF0aW9uKGdldFBhcmVudCgpKSwgZWxlbWVudERlY2wpOwotCQkJCQkJQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCgKLQkJCQkJCQkJcHJvcG9zZWRUZXh0LCBnZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwKLQkJCQkJCQkJZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgY3Vyc29yQWRqdXN0bWVudCwKLQkJCQkJCQkJaW1hZ2UsIGNvbnRlbnRNb2RlbC5nZXRSZXF1aXJlZE5hbWUoZ2V0UGFyZW50KCksCi0JCQkJCQkJCQkJZWxlbWVudERlY2wpLCBudWxsLCBwcm9wb3NlZEluZm8sCi0JCQkJCQkJCVhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX1RBR19OQU1FKTsKLQkJCQkJCWFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQotCX0KLQotCS8qKiBSZXR1cm5zIGEgbGlzdCBvZiBDTU5vZGVzIHRoYXQgYXJlIGF2YWlsYWJsZSB3aXRoaW4gdGhpcyBwYXJlbnQgY29udGV4dAotCSAqIEdpdmVuIHRoZSBncmFtbWFyIHNob3duIGJlbG93IGFuZCBhIHNuaXBwZXQgb2YgWE1MIGNvZGUgKHdoZXJlIHRoZSAnfCcKLQkgKiBpbmRpY2F0ZWQgdGhlIGN1cnNvciBwb3NpdGlvbikKLQkgKiB0aGUgbGlzdCB3b3VsZCByZXR1cm4gYWxsIG9mIHRoZSBlbGVtZW50IGRlY2xhcmF0aW9ucyB0aGF0IGFyZQotCSAqIHBvdGVudGlhbCBjaGlsZCBlbGVtZW50cyBvZiBGb28uCi0JICoKLQkgKiBncmFtbWFyIDogRm9vIC0+IChBLCBCLCBDKQotCSAqIHNuaXBwZXQgOiA8Rm9vPjxBPnwKLQkgKiByZXN1bHQgOiB7QSwgQiwgQ30KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIGNoaWxkUG9zaXRpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIExpc3Q8Q01Ob2RlPiBnZXRBdmFpbGFibGVDaGlsZEVsZW1lbnREZWNsYXJhdGlvbnMoRWxlbWVudCBwYXJlbnQsCi0JCQlpbnQgY2hpbGRQb3NpdGlvbikgewotCQkJCUxpc3QgbW9kZWxRdWVyeUFjdGlvbnMgPSBnZXRBdmFpbGFibGVDaGlsZHJlbkF0SW5kZXgocGFyZW50LAotCQkJCQkJY2hpbGRQb3NpdGlvbiwgTW9kZWxRdWVyeS5WQUxJRElUWV9OT05FKTsKLQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IG1vZGVsUXVlcnlBY3Rpb25zLml0ZXJhdG9yKCk7Ci0JCQkJTGlzdDxDTU5vZGU+IGNtbm9kZXMgPSBuZXcgVmVjdG9yKCk7Ci0JCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlNb2RlbFF1ZXJ5QWN0aW9uIGFjdGlvbiA9IChNb2RlbFF1ZXJ5QWN0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmICgoY2hpbGRQb3NpdGlvbiA8IDApCi0JCQkJCQkJfHwgKCgoYWN0aW9uLmdldFN0YXJ0SW5kZXgoKSA8PSBjaGlsZFBvc2l0aW9uKSAmJiAoY2hpbGRQb3NpdGlvbiA8PSBhY3Rpb24KLQkJCQkJCQkJCS5nZXRFbmRJbmRleCgpKSkpKSB7Ci0JCQkJCQlDTU5vZGUgYWN0aW9uQ01Ob2RlID0gYWN0aW9uLmdldENNTm9kZSgpOwotCQkJCQkJaWYgKChhY3Rpb25DTU5vZGUgIT0gbnVsbCkgJiYgIWNtbm9kZXMuY29udGFpbnMoYWN0aW9uQ01Ob2RlKSkgewotCQkJCQkJCWNtbm9kZXMuYWRkKGFjdGlvbkNNTm9kZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIGNtbm9kZXM7Ci0JCQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRBdmFpbGFibGVDaGlsZHJlbkF0SW5kZXgoRWxlbWVudCBwYXJlbnQsIGludCBpbmRleCwKLQkJCWludCB2YWxpZGl0eUNoZWNraW5nKSB7Ci0JCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIHBhcmVudERlY2wgPSBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihwYXJlbnQpOwotCQkJCWlmIChwYXJlbnREZWNsICE9IG51bGwpIHsKLQkJCQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShwYXJlbnQKLQkJCQkJCQkuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJCQkJLy8gdGFrZW4gZnJvbSBBY3Rpb25NYW5hZ2VycwotCQkJCQkvLyBpbnQgZWRpdE1vZGUgPSBtb2RlbFF1ZXJ5LmdldEVkaXRNb2RlKCk7Ci0JCQkJCWludCBlZGl0TW9kZSA9IE1vZGVsUXVlcnkuRURJVF9NT0RFX1VOQ09OU1RSQUlORUQ7Ci0JCQkJCWludCBpYyA9IChlZGl0TW9kZSA9PSBNb2RlbFF1ZXJ5LkVESVRfTU9ERV9DT05TVFJBSU5FRF9TVFJJQ1QpID8gTW9kZWxRdWVyeS5JTkNMVURFX0NISUxEX05PREVTCi0JCQkJCQkJfCBNb2RlbFF1ZXJ5LklOQ0xVREVfU0VRVUVOQ0VfR1JPVVBTCi0JCQkJCQkJOiBNb2RlbFF1ZXJ5LklOQ0xVREVfQ0hJTERfTk9ERVM7Ci0JCQkJCW1vZGVsUXVlcnkuZ2V0SW5zZXJ0QWN0aW9ucyhwYXJlbnQsIHBhcmVudERlY2wsIGluZGV4LCBpYywKLQkJCQkJCQl2YWxpZGl0eUNoZWNraW5nLCBsaXN0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGxpc3Q7Ci0JCQl9Ci0KLQlwcm90ZWN0ZWQgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oTm9kZSBub2RlKSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkobm9kZQotCQkJCQkuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJCWlmIChtb2RlbFF1ZXJ5ICE9IG51bGwpIHsKLQkJCQlyZXN1bHQgPSBtb2RlbFF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKChFbGVtZW50KSBub2RlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0RWxlbWVudFBvc2l0aW9uKE5vZGUgY2hpbGQpIHsKLQkJTm9kZSBwYXJlbnQgPSBjaGlsZC5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkKLQkJTm9kZUxpc3QgY2hpbGRyZW4gPSBwYXJlbnQuZ2V0Q2hpbGROb2RlcygpOwotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJaW50IGNvdW50ID0gMDsKLQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlpZiAoY2hpbGRyZW4uaXRlbShpKSA9PSBjaGlsZCkgewotCQkJCXJldHVybiBjb3VudDsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gaWYgKGNoaWxkcmVuLml0ZW0oaSkuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQljb3VudCsrOwotCQkJfQotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIHBvc2l0aW9uIHRoZSBjdXJzb3Igc2hvdWxkIGJlIGluIGFmdGVyIHRoZSBwcm9wb3NhbCBpcwotCSAqIGFwcGxpZWQKLQkgKiAKLQkgKiBAcGFyYW0gcHJvcG9zZWRUZXh0Ci0JICogQHJldHVybiB0aGUgcG9zaXRpb24gdGhlIGN1cnNvciBzaG91bGQgYmUgaW4gYWZ0ZXIgdGhlIHByb3Bvc2FsIGlzCi0JICogICAgICAgICBhcHBsaWVkCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXRDdXJzb3JQb3NpdGlvbkZvclByb3Bvc2VkVGV4dChTdHJpbmcgcHJvcG9zZWRUZXh0KSB7Ci0JCWludCBjdXJzb3JBZGp1c3RtZW50OwotCQljdXJzb3JBZGp1c3RtZW50ID0gcHJvcG9zZWRUZXh0LmluZGV4T2YoIlwiXCIiKSArIDE7IC8vJE5PTi1OTFMtMSQKLQkJLy8gb3RoZXJ3aXNlLCBhZnRlciB0aGUgZmlyc3QgdGFnCi0JCWlmIChjdXJzb3JBZGp1c3RtZW50ID09IDApIHsKLQkJCWN1cnNvckFkanVzdG1lbnQgPSBwcm9wb3NlZFRleHQuaW5kZXhPZignPicpICsgMTsKLQkJfQotCQlpZiAoY3Vyc29yQWRqdXN0bWVudCA9PSAwKSB7Ci0JCQljdXJzb3JBZGp1c3RtZW50ID0gcHJvcG9zZWRUZXh0Lmxlbmd0aCgpICsgMTsKLQkJfQotCQotCQlyZXR1cm4gY3Vyc29yQWRqdXN0bWVudDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVRleHRSZWdpb24gZ2V0TmFtZVJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJdGVyYXRvciByZWdpb25MaXN0ID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChyZWdpb25MaXN0Lmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSByZWdpb25MaXN0Lm5leHQoKTsKLQkJCWlmIChpc05hbWVSZWdpb24ocmVnaW9uKSkgewotCQkJCXJldHVybiByZWdpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHRvIHRoZSBzZWUgaWYgdGhlIGVsZW1lbnQgaXMgaW4gdGhlIGNvcnJlY3QgcmVnaW9uLgotCSAqIEBwYXJhbSByZWdpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOYW1lUmVnaW9uKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCXJldHVybiAoKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpCi0JCQkJfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRUxFTUVOVF9ERUNMX05BTUUpCi0JCQkJfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9OQU1FKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9BVFRMSVNUX0RFQ0xfTkFNRSkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQWJzdHJhY3RYU0xDb250ZW50QXNzaXN0UmVxdWVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQWJzdHJhY3RYU0xDb250ZW50QXNzaXN0UmVxdWVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzdmOGNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0Fic3RyYWN0WFNMQ29udGVudEFzc2lzdFJlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5OYW1lc3BhY2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5OYW1lc3BhY2VUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuUHJvcG9zYWxDb21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5YU0xDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5tb2RlbC5TdHlsZXNoZWV0TW9kZWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotLyoqCi0gKiBBbiBleHRlbnNpb24gb2YgdGhlIFhNTCBDb250ZW50QXNzaXN0UmVxdWVzdCBjbGFzcy4gIFRoaXMgcHJvdmlkZXMKLSAqIGEgYmFzaXMgZm9yIHRoZSBYU0wgY29udGVudCBhc3Npc3RhbmNlLiAgQ2xhc3NlcyBtYXkgc3ViY2xhc3MgdGhpcwotICogY2xhc3MgYW5kIGltcGxlbWVudCBzcGVjaWZpYyBmdW5jdGlvbmFsaXR5LgotICogCi0gKiBAYXV0aG9yIGRjYXJ2ZXIKLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFhTTENvbnRlbnRBc3Npc3RSZXF1ZXN0IGltcGxlbWVudHMgSUNvbnRlbnRBc3Npc3RQcm9wb3NhbFJlcXVlc3QgewotCXByb3RlY3RlZCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uID0gbnVsbDsKLQlwcm90ZWN0ZWQgQXJyYXlMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+IG1hY3JvcyA9IG5ldyBBcnJheUxpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4oKTsKLQlwcm90ZWN0ZWQgU3RyaW5nIG1hdGNoU3RyaW5nOwotCXByb3RlY3RlZCBOb2RlIG5vZGUgPSBudWxsOwotCXByb3RlY3RlZCBBcnJheUxpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4gcHJvcG9zYWxzID0gbmV3IEFycmF5TGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPigpOwotCXByb3RlY3RlZCBJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCXByb3RlY3RlZCBpbnQgcmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uOwotCXByb3RlY3RlZCBpbnQgcmVwbGFjZW1lbnRMZW5ndGg7Ci0JcHJvdGVjdGVkIElUZXh0Vmlld2VyIHRleHRWaWV3ZXIgPSBudWxsOwotCi0KLQkvKioKLQkgKiBIYW5kbGVzIENvbnRlbnQgQXNzaXN0YW5jZSByZXF1ZXN0cyBmb3IgU2VsZWN0IEF0dHJpYnV0ZXMuICBUaGlzIGlzIGNhbGxlZCBhbiBpbnN0YW50aWF0ZWQKLQkgKiB0aHJvdWdoIHRoZSB1c2Ugb2YgdGhlIGNvbXB1dGVQcm9wb3NhbHMgbWV0aG9kIGZyb20gdGhlIFhTTENvbnRlbnRBc3Npc3RQcm9jZXNzb3IuICBJdCB3aWxsCi0JICogY2FsY3VsYXRlIHRoZSBhdmFpbGFibGUgcHJvcG9zYWxzIHRoYXQgYXJlIGF2YWlsYWJsZSBmb3IgdGhlIFhTTCBzZWxlY3QgYXR0cmlidXRlLgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBkb2N1bWVudFJlZ2lvbgotCSAqIEBwYXJhbSBjb21wbGV0aW9uUmVnaW9uCi0JICogQHBhcmFtIGJlZ2luCi0JICogQHBhcmFtIGxlbmd0aAotCSAqIEBwYXJhbSBmaWx0ZXIKLQkgKiBAcGFyYW0gdGV4dFZpZXdlcgotCSAqLwotCQotCXB1YmxpYyBBYnN0cmFjdFhTTENvbnRlbnRBc3Npc3RSZXF1ZXN0KE5vZGUgbm9kZSwKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24sCi0JCQlJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLCBpbnQgYmVnaW4sIGludCBsZW5ndGgsIFN0cmluZyBmaWx0ZXIsCi0JCQlJVGV4dFZpZXdlciB0ZXh0Vmlld2VyKSB7Ci0JCXNldE5vZGUobm9kZSk7Ci0JCXNldERvY3VtZW50UmVnaW9uKGRvY3VtZW50UmVnaW9uKTsKLQkJc2V0UmVnaW9uKGNvbXBsZXRpb25SZWdpb24pOwotCQlzZXRNYXRjaFN0cmluZyhmaWx0ZXIpOwotCQlzZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oYmVnaW4pOwotCQlzZXRSZXBsYWNlbWVudExlbmd0aChsZW5ndGgpOwotCQl0aGlzLnRleHRWaWV3ZXIgPSB0ZXh0Vmlld2VyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIHByb3Bvc2Fscy4gIEltcGxlbWVudGF0aW9ucyBhcmUgdG8gcHJvdmlkZSB0aGUgYXBwcm9wcmlhdGUKLQkgKiBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIHByb3Bvc2FscyB0aGV5IHdvdWxkIGxpa2UgdG8gcmV0dXJuLiAgIFVzZSBvZiB0aGUgZ2V0QWxsQ29tcGxldGlvblByb3Bvc2FscwotCSAqIHNob3VsZCBiZSB1c2VkIHRvIHJldHVybiB0aGUgYWN0dWFsIHByb3Bvc2FscyBmcm9tIHRoaXMgbWV0aG9kLgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgQXJyYXlMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+IGdldENvbXBsZXRpb25Qcm9wb3NhbHMoKTsKLQkKLQlwcm90ZWN0ZWQgQXJyYXlMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+IGdldEFsbENvbXBsZXRpb25Qcm9wb3NhbHMoKSB7Ci0JCUFycmF5TGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPiBhbGxQcm9wb3NhbHMgPSBuZXcgQXJyYXlMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+KCk7Ci0JCWlmICgoZ2V0UHJvcG9zYWxzKCkuc2l6ZSgpID4gMCkgfHwgKGdldE1hY3JvcygpLnNpemUoKSA+IDApKSB7Ci0JCQlhbGxQcm9wb3NhbHMuYWRkQWxsKGdldFByb3Bvc2FscygpKTsKLQkJCWFsbFByb3Bvc2Fscy5hZGRBbGwoZ2V0TWFjcm9zKCkpOwotCQkJYWxsUHJvcG9zYWxzID0gc29ydFByb3Bvc2FscyhhbGxQcm9wb3NhbHMpOwotCQl9Ci0JCXJldHVybiBhbGxQcm9wb3NhbHM7Ci0JfQotCi0JCi0JLyoqCi0JICogQ2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBOb2RlTGlzdCBoYXMgZGF0YQotCSAqIEBwYXJhbSBub2RlcyBBIE5vZGVMaXN0IG9iamVjdAotCSAqIEByZXR1cm4gVHJ1ZSBpZiBoYXMgZGF0YSwgZmFsc2UgaWYgZW1wdHkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNOb2RlcyhOb2RlTGlzdCBub2RlcykgewotCQlyZXR1cm4gbm9kZXMgIT0gbnVsbCAmJiBub2Rlcy5nZXRMZW5ndGgoKSA+IDA7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBjdXJzb3IgcG9zaXRpb24gd2l0aGluIHRoZSBUZXh0IFZpZXdlcgotCSAqIEByZXR1cm4gQW4gaW50IHZhbHVlIGNvbnRhaW5pbmcgdGhlIGN1cnNvciBwb3NpdGlvbgotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0Q3Vyc29yUG9zaXRpb24oKSB7Ci0JCXJldHVybiB0ZXh0Vmlld2VyLmdldFRleHRXaWRnZXQoKS5nZXRDYXJldE9mZnNldCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxOYW1lc3BhY2VJbmZvPiBnZXROYW1lc3BhY2VzKElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJIE5hbWVzcGFjZVRhYmxlIHRhYmxlID0gbmV3IE5hbWVzcGFjZVRhYmxlKGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJIHRhYmxlLnZpc2l0RWxlbWVudChlbGVtZW50KTsKLQkJIAotCQkgQ29sbGVjdGlvbjxOYW1lc3BhY2VJbmZvPiBuYW1lc3BhY2VJbmZvTGlzdCA9ICB0YWJsZS5nZXROYW1lc3BhY2VJbmZvQ29sbGVjdGlvbigpOwotCQkgCi0JCSByZXR1cm4gbmFtZXNwYWNlSW5mb0xpc3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBiYXNlIGxvY2F0aW9uIGZvciB0aGUgSURPTURvY3VtZW50IGZvciB0aGlzIGNsYXNzLiBUaGlzIGlzCi0JICogdXNlZCB0byBwb3B1bGF0ZSBhIG5ldyBQYXRoIGNsYXNzIGZvciByZXRyaWV2aW5nIGFuIElGaWxlIGluc3RhbmNlLgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExvY2F0aW9uKCkgewotCQlJRE9NRG9jdW1lbnQgZG9jdW1lbnQgPSAoSURPTURvY3VtZW50KSBub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJcmV0dXJuIGRvY3VtZW50LmdldE1vZGVsKCkuZ2V0QmFzZUxvY2F0aW9uKCk7CQkKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIG5ld1Byb3Bvc2FsCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTWFjcm8oSUNvbXBsZXRpb25Qcm9wb3NhbCBuZXdQcm9wb3NhbCkgewotCQltYWNyb3MuYWRkKG5ld1Byb3Bvc2FsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wb3NhbChJQ29tcGxldGlvblByb3Bvc2FsIG5ld1Byb3Bvc2FsKSB7Ci0JCXByb3Bvc2Fscy5hZGQobmV3UHJvcG9zYWwpOwotCX0KLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldERvY3VtZW50UmVnaW9uKCkgewotCQlyZXR1cm4gZG9jdW1lbnRSZWdpb247Ci0JfQotCi0JcHJvdGVjdGVkIExpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4gZ2V0TWFjcm9zKCkgewotCQlyZXR1cm4gbWFjcm9zOwotCX0KLQotCXByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIGdldE1hdGNoU3RyaW5nKCkgewotCQlyZXR1cm4gbWF0Y2hTdHJpbmc7Ci0JfQotCi0JcHJvdGVjdGVkIG9yZy53M2MuZG9tLk5vZGUgZ2V0Tm9kZSgpIHsKLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JcHJvdGVjdGVkIG9yZy53M2MuZG9tLk5vZGUgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4gZ2V0UHJvcG9zYWxzKCkgewotCQlyZXR1cm4gcHJvcG9zYWxzOwotCX0KLQotCXByb3RlY3RlZCBJVGV4dFJlZ2lvbiBnZXRSZWdpb24oKSB7Ci0JCXJldHVybiByZWdpb247Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSB7Ci0JCXJldHVybiByZXBsYWNlbWVudEJlZ2luUG9zaXRpb247Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXRSZXBsYWNlbWVudExlbmd0aCgpIHsKLQkJcmV0dXJuIHJlcGxhY2VtZW50TGVuZ3RoOwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0U3RhcnRPZmZzZXQoKSB7Ci0JCWlmICgoZ2V0RG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKSAmJiAoZ2V0UmVnaW9uKCkgIT0gbnVsbCkpIHsKLQkJCXJldHVybiAoKElUZXh0UmVnaW9uQ29sbGVjdGlvbikgZ2V0RG9jdW1lbnRSZWdpb24oKSkuZ2V0U3RhcnRPZmZzZXQoZ2V0UmVnaW9uKCkpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRleHQoKSB7Ci0JCWlmICgoZ2V0RG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKSAmJiAoZ2V0UmVnaW9uKCkgIT0gbnVsbCkpIHsKLQkJCXJldHVybiAoKElUZXh0UmVnaW9uQ29sbGVjdGlvbikgZ2V0RG9jdW1lbnRSZWdpb24oKSkuZ2V0VGV4dChnZXRSZWdpb24oKSk7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIGludCBnZXRUZXh0RW5kT2Zmc2V0KCkgewotCQlpZiAoKGdldERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCkgJiYgKGdldFJlZ2lvbigpICE9IG51bGwpKSB7Ci0JCQlyZXR1cm4gKChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIGdldERvY3VtZW50UmVnaW9uKCkpLmdldFRleHRFbmRPZmZzZXQoZ2V0UmVnaW9uKCkpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbikgewotCQlkb2N1bWVudFJlZ2lvbiA9IHJlZ2lvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYXRjaFN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIG5ld01hdGNoU3RyaW5nKSB7Ci0JCW1hdGNoU3RyaW5nID0gbmV3TWF0Y2hTdHJpbmc7Ci0JfQotCi0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0Tm9kZShvcmcudzNjLmRvbS5Ob2RlIG5ld05vZGUpIHsKLQkJbm9kZSA9IG5ld05vZGU7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRSZWdpb24oSVRleHRSZWdpb24gbmV3UmVnaW9uKSB7Ci0JCXJlZ2lvbiA9IG5ld1JlZ2lvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oaW50IG5ld1JlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbikgewotCQlyZXBsYWNlbWVudEJlZ2luUG9zaXRpb24gPSBuZXdSZXBsYWNlbWVudEJlZ2luUG9zaXRpb247Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRSZXBsYWNlbWVudExlbmd0aChpbnQgbmV3UmVwbGFjZW1lbnRMZW5ndGgpIHsKLQkJcmVwbGFjZW1lbnRMZW5ndGggPSBuZXdSZXBsYWNlbWVudExlbmd0aDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+IHNvcnRQcm9wb3NhbHMoQXJyYXlMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+IHByb3Bvc2Fsc0luKSB7Ci0JCUNvbGxlY3Rpb25zLnNvcnQocHJvcG9zYWxzSW4sIG5ldyBQcm9wb3NhbENvbXBhcmF0b3IoKSk7Ci0JCXJldHVybiBwcm9wb3NhbHNJbjsKLQotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIk5vZGU6ICIgKyBnZXROb2RlKCkgLy8kTk9OLU5MUy0xJAotCQkJCQkrICJcblBhcmVudDogIiArIGdldFBhcmVudCgpIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyAiXG5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb246ICIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0RG9jdW1lbnRSZWdpb24oKS50b1N0cmluZygpKSAvLyROT04tTkxTLTEkCi0JCQkJCSsgIlxuUmVnaW9uOiAiICsgZ2V0UmVnaW9uKCkgLy8kTk9OLU5MUy0xJAotCQkJCQkrICJcbk1hdGNoIHN0cmluZzogJyIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0TWF0Y2hTdHJpbmcoKSkgKyAiJyIgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkJKyAiXG5PZmZzZXRzOiBbIiArIGdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpICsgIi0iICsgKGdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpICsgZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSkgKyAiXVxuIjsgLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIFN0eWxlc2hlZXRNb2RlbCBnZXRTdHlsZXNoZWV0TW9kZWwoKSB7Ci0JCUlGaWxlIGVkaXRvckZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUobmV3IFBhdGgoZ2V0TG9jYXRpb24oKSkpOwotCQlTdHlsZXNoZWV0TW9kZWwgbW9kZWwgPSBYU0xDb3JlLmdldEluc3RhbmNlKCkuZ2V0U3R5bGVzaGVldChlZGl0b3JGaWxlKTsKLQkJcmV0dXJuIG1vZGVsOwotCX0KLQkKLQkJCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DYWxsVGVtcGxhdGVDb250ZW50QXNzaXN0UmVxdWVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ2FsbFRlbXBsYXRlQ29udGVudEFzc2lzdFJlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFhMjBiNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DYWxsVGVtcGxhdGVDb250ZW50QXNzaXN0UmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKkNvcHlyaWdodCAoYykgMjAwOCBTdGFuZGFyZHMgaW4gVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCBhbmQgb3RoZXJzLgotICpBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKmFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICp3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICpodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqQ29udHJpYnV0b3JzOgotICogICAgRGF2aWQgQ2FydmVyIChTVEFSKSAtIGJ1ZyAyNDM1NzUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5YU0xDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5tb2RlbC5TdHlsZXNoZWV0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLm1vZGVsLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5tb2RlbC5YU0xBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC51dGlsLlhTTFBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwudXRpbC5YU0xQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBDYWxsVGVtcGxhdGVDb250ZW50QXNzaXN0YW5jZSBwcm92aWRlcyBjb250ZW50IGFzc2lzdCBwcm9wb3NhbHMgZm9yCi0gKiA8eHNsOmNhbGwtd2l0aD4gdGVtcGxhdGVzLiAgIEl0IHdpbGwgcHJvdmlkZSBhIGxpc3Qgb2YgYWxsIGF2YWlsYWJsZQotICogbmFtZWQgdGVtcGxhdGVzLgotICogCi0gKiBAYXV0aG9yIERhdmlkIENhcnZlcgotICoKLSAqLwotcHVibGljIGNsYXNzIENhbGxUZW1wbGF0ZUNvbnRlbnRBc3Npc3RSZXF1ZXN0IGV4dGVuZHMKLQkJQWJzdHJhY3RYU0xDb250ZW50QXNzaXN0UmVxdWVzdCB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTU9ERSA9ICJtb2RlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FID0gIm5hbWUiOwotCi0JLyoqCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIGRvY3VtZW50UmVnaW9uCi0JICogQHBhcmFtIGNvbXBsZXRpb25SZWdpb24KLQkgKiBAcGFyYW0gYmVnaW4KLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogQHBhcmFtIGZpbHRlcgotCSAqIEBwYXJhbSB0ZXh0Vmlld2VyCi0JICovCi0JcHVibGljIENhbGxUZW1wbGF0ZUNvbnRlbnRBc3Npc3RSZXF1ZXN0KE5vZGUgbm9kZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiwKLQkJCUlUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIGludCBiZWdpbiwgaW50IGxlbmd0aCwgU3RyaW5nIGZpbHRlciwKLQkJCUlUZXh0Vmlld2VyIHRleHRWaWV3ZXIpIHsKLQkJc3VwZXIobm9kZSwgZG9jdW1lbnRSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGJlZ2luLCBsZW5ndGgsCi0JCQkJZmlsdGVyLCB0ZXh0Vmlld2VyKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCQotCS8qKiAKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFJlcXVlc3QjZ2V0Q29tcGxldGlvblByb3Bvc2FscygpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFycmF5TGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPiBnZXRDb21wbGV0aW9uUHJvcG9zYWxzKCkgewotCQlwcm9wb3NhbHMuY2xlYXIoKTsKLQkJCi0JCUlGaWxlIGVkaXRvckZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUobmV3IFBhdGgoZ2V0TG9jYXRpb24oKSkpOwotCQkKLQkJU3R5bGVzaGVldE1vZGVsIG1vZGVsID0gWFNMQ29yZS5nZXRJbnN0YW5jZSgpLmdldFN0eWxlc2hlZXQoZWRpdG9yRmlsZSk7Ci0KLQkJTGlzdDxUZW1wbGF0ZT4gdGVtcGxhdGVzID0gbW9kZWwuZ2V0VGVtcGxhdGVzKCk7Ci0JCQotCQlmb3IgKFRlbXBsYXRlIHRlbXBsYXRlIDogdGVtcGxhdGVzKSB7Ci0JCQlYU0xBdHRyaWJ1dGUgYXR0cmlidXRlID0gdGVtcGxhdGUuZ2V0QXR0cmlidXRlKEFUVFJfTkFNRSk7Ci0JCQlpZiAoYXR0cmlidXRlICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgcHJvcG9zYWxJbmZvID0gZ2V0QWRkaXRpb25hbEluZm8odGVtcGxhdGUpOwotCQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoCi0JCQkJCQlhdHRyaWJ1dGUuZ2V0VmFsdWUoKSwgZ2V0U3RhcnRPZmZzZXQoKSArIDEsIDAsCi0JCQkJCQlhdHRyaWJ1dGUuZ2V0VmFsdWUoKS5sZW5ndGgoKSwgWFNMUGx1Z2luSW1hZ2VIZWxwZXIKLQkJCQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoCi0JCQkJCQkJCQkJWFNMUGx1Z2luSW1hZ2VzLklNR19URU1QTEFURSksIGF0dHJpYnV0ZQotCQkJCQkJCQkuZ2V0VmFsdWUoKSwgbnVsbCwgcHJvcG9zYWxJbmZvLCAwKTsKLQkJCQlhZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGdldEFsbENvbXBsZXRpb25Qcm9wb3NhbHMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBZGRpdGlvbmFsSW5mbyhUZW1wbGF0ZSB0ZW1wbGF0ZSkgewotCQlYU0xBdHRyaWJ1dGUgbmFtZUF0dHJpYnV0ZSA9IHRlbXBsYXRlLmdldEF0dHJpYnV0ZShBVFRSX05BTUUpOwotCQkKLQkJU3RyaW5nIHByb3Bvc2FsSW5mbyA9ICJUZW1wbGF0ZSBOYW1lOiAiICsgbmFtZUF0dHJpYnV0ZS5nZXRWYWx1ZSgpICsKLQkJICAgICAgICAgICAgICAgICAgICAgICJcclxuIiArICJGaWxlOiIgKyB0ZW1wbGF0ZS5nZXRTdHlsZXNoZWV0KCkuZ2V0RmlsZSgpLmdldE5hbWUoKTsKLQkJCi0JCXJldHVybiBwcm9wb3NhbEluZm87Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DdXN0b21Db21wbGV0aW9uUHJvcG9zYWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0N1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2E1ZThhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0N1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbAotCQlpbXBsZW1lbnRzIElDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb240IHsKLQotCS8qKgotCSAqIEBwYXJhbSByZXBsYWNlbWVudFN0cmluZwotCSAqIEBwYXJhbSByZXBsYWNlbWVudE9mZnNldAotCSAqIEBwYXJhbSByZXBsYWNlbWVudExlbmd0aAotCSAqIEBwYXJhbSBjdXJzb3JQb3NpdGlvbgotCSAqIEBwYXJhbSBpbWFnZQotCSAqIEBwYXJhbSBkaXNwbGF5U3RyaW5nCi0JICogQHBhcmFtIGNvbnRleHRJbmZvcm1hdGlvbgotCSAqIEBwYXJhbSBhZGRpdGlvbmFsUHJvcG9zYWxJbmZvCi0JICogQHBhcmFtIHJlbGV2YW5jZQotCSAqLwotCXB1YmxpYyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoU3RyaW5nIHJlcGxhY2VtZW50U3RyaW5nLAotCQkJaW50IHJlcGxhY2VtZW50T2Zmc2V0LCBpbnQgcmVwbGFjZW1lbnRMZW5ndGgsIGludCBjdXJzb3JQb3NpdGlvbiwKLQkJCUltYWdlIGltYWdlLCBTdHJpbmcgZGlzcGxheVN0cmluZywKLQkJCUlDb250ZXh0SW5mb3JtYXRpb24gY29udGV4dEluZm9ybWF0aW9uLAotCQkJU3RyaW5nIGFkZGl0aW9uYWxQcm9wb3NhbEluZm8sIGludCByZWxldmFuY2UpIHsKLQkJc3VwZXIocmVwbGFjZW1lbnRTdHJpbmcsIHJlcGxhY2VtZW50T2Zmc2V0LCByZXBsYWNlbWVudExlbmd0aCwKLQkJCQljdXJzb3JQb3NpdGlvbiwgaW1hZ2UsIGRpc3BsYXlTdHJpbmcsIGNvbnRleHRJbmZvcm1hdGlvbiwKLQkJCQlhZGRpdGlvbmFsUHJvcG9zYWxJbmZvLCByZWxldmFuY2UpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXBsYWNlbWVudFN0cmluZwotCSAqIEBwYXJhbSByZXBsYWNlbWVudE9mZnNldAotCSAqIEBwYXJhbSByZXBsYWNlbWVudExlbmd0aAotCSAqIEBwYXJhbSBjdXJzb3JQb3NpdGlvbgotCSAqIEBwYXJhbSBpbWFnZQotCSAqIEBwYXJhbSBkaXNwbGF5U3RyaW5nCi0JICogQHBhcmFtIGNvbnRleHRJbmZvcm1hdGlvbgotCSAqIEBwYXJhbSBhZGRpdGlvbmFsUHJvcG9zYWxJbmZvCi0JICogQHBhcmFtIHJlbGV2YW5jZQotCSAqIEBwYXJhbSB1cGRhdGVSZXBsYWNlbWVudExlbmd0aE9uVmFsaWRhdGUKLQkgKi8KLQlwdWJsaWMgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKFN0cmluZyByZXBsYWNlbWVudFN0cmluZywKLQkJCWludCByZXBsYWNlbWVudE9mZnNldCwgaW50IHJlcGxhY2VtZW50TGVuZ3RoLCBpbnQgY3Vyc29yUG9zaXRpb24sCi0JCQlJbWFnZSBpbWFnZSwgU3RyaW5nIGRpc3BsYXlTdHJpbmcsCi0JCQlJQ29udGV4dEluZm9ybWF0aW9uIGNvbnRleHRJbmZvcm1hdGlvbiwKLQkJCVN0cmluZyBhZGRpdGlvbmFsUHJvcG9zYWxJbmZvLCBpbnQgcmVsZXZhbmNlLAotCQkJYm9vbGVhbiB1cGRhdGVSZXBsYWNlbWVudExlbmd0aE9uVmFsaWRhdGUpIHsKLQkJc3VwZXIocmVwbGFjZW1lbnRTdHJpbmcsIHJlcGxhY2VtZW50T2Zmc2V0LCByZXBsYWNlbWVudExlbmd0aCwKLQkJCQljdXJzb3JQb3NpdGlvbiwgaW1hZ2UsIGRpc3BsYXlTdHJpbmcsIGNvbnRleHRJbmZvcm1hdGlvbiwKLQkJCQlhZGRpdGlvbmFsUHJvcG9zYWxJbmZvLCByZWxldmFuY2UsCi0JCQkJdXBkYXRlUmVwbGFjZW1lbnRMZW5ndGhPblZhbGlkYXRlKTsKLQl9Ci0KLQkvKiogCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb240I2lzQXV0b0luc2VydGFibGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXV0b0luc2VydGFibGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0V4Y2x1ZGVSZXN1bHRQcmVmaXhlc0NvbnRlbnRBc3Npc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0V4Y2x1ZGVSZXN1bHRQcmVmaXhlc0NvbnRlbnRBc3Npc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE0ZWJhMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9FeGNsdWRlUmVzdWx0UHJlZml4ZXNDb250ZW50QXNzaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqQ29weXJpZ2h0IChjKSAyMDA4IFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCBhbmQgb3RoZXJzLgotICpBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKmFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICp3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICpodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqQ29udHJpYnV0b3JzOgotICogICAgRGF2aWQgQ2FydmVyIChTVEFSKSAtIGJ1ZyAyMzAxMzYgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuTmFtZXNwYWNlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUF0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5YU0xDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC51dGlsLlhTTFBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwudXRpbC5YU0xQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBQcm92aWRlcyBjb250ZW50IGFzc2lzdGFuY2UgZm9yIHhzbCBlbGVtZW50cyB0aGF0IGhhdmUgdGhlCi0gKiBleGNsdWRlLXJlc3VsdC1wcmVmaXhlcyBhdHRyaWJ1dGUuICBUaGlzIHdpbGwgcHJvdmlkZSBhIGxpc3QgCi0gKiBvZiBhbGwga25vd24gcmVzdWx0IHByZWZpeGVzIHRoYXQgYXJlbid0IGN1cnJlbnRseSBpbiB0aGUgYXR0cmlidXRlCi0gKiBsaXN0LiAgVGhpcyBsaXN0IGlzIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3QuICAgVGhlIFhTTCBwcmVmaXggaXMKLSAqIGV4Y2x1ZGVkLgotICogCi0gKiBAYXV0aG9yIGRjYXJ2ZXIKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRXhjbHVkZVJlc3VsdFByZWZpeGVzQ29udGVudEFzc2lzdCBleHRlbmRzIEFic3RyYWN0WFNMQ29udGVudEFzc2lzdFJlcXVlc3QgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWENMVURFX1JFU1VMVF9QUkVGSVhFUyA9ICJleGNsdWRlLXJlc3VsdC1wcmVmaXhlcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVCA9ICIjYWxsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBRERJVElPTkFMX0lORk8gPSBNZXNzYWdlcy5FeGNsdWRlUmVzdWx0UHJlZml4ZXNDb250ZW50QXNzaXN0OwotCXByb3RlY3RlZCBTdHJpbmdbXSB0b2tlbnMgPSBudWxsOwotCi0JLyoqCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcGFyYW0gZG9jdW1lbnRSZWdpb24KLQkgKiBAcGFyYW0gY29tcGxldGlvblJlZ2lvbgotCSAqIEBwYXJhbSBiZWdpbgotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiBAcGFyYW0gZmlsdGVyCi0JICogQHBhcmFtIHRleHRWaWV3ZXIKLQkgKi8KLQlwdWJsaWMgRXhjbHVkZVJlc3VsdFByZWZpeGVzQ29udGVudEFzc2lzdChOb2RlIG5vZGUsCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uLAotCQkJSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgaW50IGJlZ2luLCBpbnQgbGVuZ3RoLCBTdHJpbmcgZmlsdGVyLAotCQkJSVRleHRWaWV3ZXIgdGV4dFZpZXdlcikgewotCQlzdXBlcihub2RlLCBkb2N1bWVudFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgYmVnaW4sIGxlbmd0aCwgZmlsdGVyLCB0ZXh0Vmlld2VyKTsKLQl9Ci0JCi0JLyoqIAotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0UmVxdWVzdCNnZXRDb21wbGV0aW9uUHJvcG9zYWxzKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQXJyYXlMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+IGdldENvbXBsZXRpb25Qcm9wb3NhbHMoKSB7Ci0JCSBwcm9wb3NhbHMuY2xlYXIoKTsKLQkJIAotCQkgSURPTUF0dHIgYXR0ck5vZGUgPSAoSURPTUF0dHIpKChJRE9NRWxlbWVudClnZXROb2RlKCkpLmdldEF0dHJpYnV0ZU5vZGUoRVhDTFVERV9SRVNVTFRfUFJFRklYRVMpOwotCQkgU3RyaW5nIGV4Y2x1ZGVSZXN1bHRQcmVmaXhlcyA9IGF0dHJOb2RlLmdldFZhbHVlKCk7Ci0JCSBpbnQgb2Zmc2V0ID0gZ2V0Q3Vyc29yUG9zaXRpb24oKTsKLQkJIAotCQkgaWYgKGV4Y2x1ZGVSZXN1bHRQcmVmaXhlcyA9PSBudWxsIHx8IGV4Y2x1ZGVSZXN1bHRQcmVmaXhlcy5lcXVhbHMoREVGQVVMVCkpIHsKLQkJCSByZXR1cm4gZ2V0QWxsQ29tcGxldGlvblByb3Bvc2FscygpOwotCQkgfQotCQkgCi0JCSB0b2tlbnMgPSBleGNsdWRlUmVzdWx0UHJlZml4ZXMuc3BsaXQoIlxccyIpOyAvLyROT04tTkxTLTEkCi0JCSBpZiAodG9rZW5zWzBdLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJIEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoCi0JCQkJCQlERUZBVUxULCBvZmZzZXQsIDAsIERFRkFVTFQubGVuZ3RoKCksCi0JCQkJCQlYU0xQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhTTFBsdWdpbkltYWdlcy5JTUdfUFJFRklYKSwKLQkJCQkJCURFRkFVTFQsIG51bGwsIG51bGwsIDApOwotCQkJIGFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJIH0KLQkJIENvbGxlY3Rpb248TmFtZXNwYWNlSW5mbz4gbmFtZXNwYWNlcyA9IHRoaXMuZ2V0TmFtZXNwYWNlcygoSURPTUVsZW1lbnQpbm9kZSk7Ci0JCSBmb3IgKE5hbWVzcGFjZUluZm8gbmFtZXNwYWNlIDogbmFtZXNwYWNlcykgewotCQkJIAotCQkJIGlmIChpbmNsdWRlUHJlZml4KG5hbWVzcGFjZSkpIHsgCi0JCQkJIEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoCi0JCQkJCQkJbmFtZXNwYWNlLnByZWZpeCwgb2Zmc2V0LCAwLCBuYW1lc3BhY2UucHJlZml4Lmxlbmd0aCgpLAotCQkJCQkJCVhTTFBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWFNMUGx1Z2luSW1hZ2VzLklNR19QUkVGSVgpLAotCQkJCQkJCW5hbWVzcGFjZS5wcmVmaXgsIG51bGwsIG5hbWVzcGFjZS51cmksIDApOwotCQkJCSBhZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkgfQotCQkgfQotCQkgCi0JCXJldHVybiBnZXRBbGxDb21wbGV0aW9uUHJvcG9zYWxzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW5jbHVkZVByZWZpeChOYW1lc3BhY2VJbmZvIG5hbWVzcGFjZSkgewotCQlyZXR1cm4gIXByZWZpeEV4aXN0cyhuYW1lc3BhY2UucHJlZml4KSAmJiAhbmFtZXNwYWNlLnByZWZpeC5lcXVhbHMoIiIpICYmICFuYW1lc3BhY2UudXJpLmVxdWFscyhYU0xDb3JlLlhTTF9OQU1FU1BBQ0VfVVJJKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVmaXhFeGlzdHMoU3RyaW5nIHByZWZpeCkgewotCQlpZiAodG9rZW5zID09IG51bGwgfHwgdG9rZW5zLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZm9yIChpbnQgY250ID0gMDsgY250IDwgdG9rZW5zLmxlbmd0aDsgY250KyspIHsKLQkJCWlmIChwcmVmaXguZXF1YWxzKHRva2Vuc1tjbnRdKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9JQ29udGVudEFzc2lzdFByb3Bvc2FsUmVxdWVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSUNvbnRlbnRBc3Npc3RQcm9wb3NhbFJlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI5NGQxYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9JQ29udGVudEFzc2lzdFByb3Bvc2FsUmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci0KLS8qKgotICogUHJvdmlkZXMgY29udGVudCBhc3Npc3RhbmNlIElDb21wbGV0aW9uUHJvcG9zYWxzLgotICogCi0gKiBAYXV0aG9yIERhdmlkIENhcnZlcgotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29udGVudEFzc2lzdFByb3Bvc2FsUmVxdWVzdCB7Ci0KLQkvKioKLQkgKiBDb21wbGV0aW9uIFByb3Bvc2FscyBmb3IgYSBDb250ZW50IEFzc2lzdCBSZXF1ZXN0LgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgQXJyYXlMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+IGdldENvbXBsZXRpb25Qcm9wb3NhbHMoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9OdWxsQ29udGVudEFzc2lzdFJlcXVlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L051bGxDb250ZW50QXNzaXN0UmVxdWVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzhiN2JmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L051bGxDb250ZW50QXNzaXN0UmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqQ29weXJpZ2h0IChjKSAyMDA4IFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCBhbmQgb3RoZXJzLgotICpBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKmFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICp3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICpodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqQ29udHJpYnV0b3JzOgotICogICAgRGF2aWQgQ2FydmVyIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIEFuIGVtcHR5IGNvbnRlbnQgYXNzaXN0IHJlcXVlc3QuCi0gKiBAYXV0aG9yIGRjYXJ2ZXIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBOdWxsQ29udGVudEFzc2lzdFJlcXVlc3QgZXh0ZW5kcyBBYnN0cmFjdFhTTENvbnRlbnRBc3Npc3RSZXF1ZXN0IHsKLQlwcml2YXRlIEFycmF5TGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPiBlbXB0eVByb3Bvc2FscyA9IG5ldyBBcnJheUxpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4oKTsKLQotCS8qKgotCSAqIEEgTlVMTCBDb250ZW50QXNzaXN0UmVxdWVzdCBoYXMgbm8gcHJvcG9zYWxzLgotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIGRvY3VtZW50UmVnaW9uCi0JICogQHBhcmFtIGNvbXBsZXRpb25SZWdpb24KLQkgKiBAcGFyYW0gYmVnaW4KLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogQHBhcmFtIGZpbHRlcgotCSAqIEBwYXJhbSB0ZXh0Vmlld2VyCi0JICovCi0JcHVibGljIE51bGxDb250ZW50QXNzaXN0UmVxdWVzdChOb2RlIG5vZGUsIAotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiwKLQkJCUlUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIGludCBiZWdpbiwgaW50IGxlbmd0aCwgU3RyaW5nIGZpbHRlciwKLQkJCUlUZXh0Vmlld2VyIHRleHRWaWV3ZXIpIHsKLQkJc3VwZXIobm9kZSwgZG9jdW1lbnRSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGJlZ2luLCBsZW5ndGgsCi0JCQkJZmlsdGVyLCB0ZXh0Vmlld2VyKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBBcnJheUxpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4gZ2V0Q29tcGxldGlvblByb3Bvc2FscygpIHsKLQkJcmV0dXJuIGVtcHR5UHJvcG9zYWxzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvU2VsZWN0QXR0cmlidXRlQ29udGVudEFzc2lzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvU2VsZWN0QXR0cmlidXRlQ29udGVudEFzc2lzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmJkNjVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L1NlbGVjdEF0dHJpYnV0ZUNvbnRlbnRBc3Npc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICpDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsIGFuZCBvdGhlcnMuCi0gKkFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKndoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICpDb250cmlidXRvcnM6Ci0gKiAgICBEYXZpZCBDYXJ2ZXIgKFNUQVIpIC0gYnVnIDI0MDE3MCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZyAyNTk1NzUgLSBmaXhlZCByZXBsYWNlbWVudCBpc3N1ZSBhbmQgWFBhdGggdG9rZW5pemVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uIGFkanVzdGVyIGZvciBtYXRjaFN0cmluZy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueHBhdGguY29tcGlsZXIuWFBhdGhQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5DdXN0b21Db21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01BdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLmNvcmUudXRpbC5YU0xUWFBhdGhIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LlhQYXRoVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwueHBhdGgudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVJZHNYUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLlhTTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwudXRpbC5YU0xQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLnV0aWwuWFNMUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgY29udGVudCBhc3Npc3RhbmNlIGZvciB0aGUgWFNMIHNlbGVjdCBhdHRyaWJ1dGUuCi0gKiAKLSAqIEBhdXRob3IgZGNhcnZlcgotICoKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdEF0dHJpYnV0ZUNvbnRlbnRBc3Npc3QgZXh0ZW5kcyBBYnN0cmFjdFhTTENvbnRlbnRBc3Npc3RSZXF1ZXN0IHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFBBVEhfR0xPQkFMX1ZBUklBQkxFUyA9ICIveHNsOnN0eWxlc2hlZXQveHNsOnZhcmlhYmxlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0cmlldmUgYWxsIGdsb2JhbCBwYXJhbWV0ZXJzIGluIHRoZSBzdHlsZXNoZWV0LgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYUEFUSF9HTE9CQUxfUEFSQU1TID0gIi94c2w6c3R5bGVzaGVldC94c2w6cGFyYW0iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBMaW1pdCBzZWxlY3Rpb24gb2YgdmFyaWFibGVzIHRvIHRob3NlIHRoYXQgYXJlIGluIHRoZSBsb2NhbCBzY29wZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFBBVEhfTE9DQUxfVkFSSUFCTEVTID0gImFuY2VzdG9yOjp4c2w6dGVtcGxhdGUvZGVzY2VuZGFudDo6eHNsOnZhcmlhYmxlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogTGltaXQgc2VsZWN0aW9uIG9mIHBhcmFtcyB0byB0aG9zZSB0aGF0IGFyZSBpbiB0aGUgbG9jYWwgc2NvcGUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhQQVRIX0xPQ0FMX1BBUkFNUyA9ICJhbmNlc3Rvcjo6eHNsOnRlbXBsYXRlL2Rlc2NlbmRhbnQ6OnhzbDpwYXJhbSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgWFBhdGhUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IgZlRlbXBsYXRlUHJvY2Vzc29yID0gbnVsbDsKLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBmVGVtcGxhdGVDb250ZXh0cyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBYUEFUSF9MT0NLID0gbmV3IGJ5dGVbMF07Ci0KLQkvKioKLQkgKiBIYW5kbGVzIENvbnRlbnQgQXNzaXN0YW5jZSByZXF1ZXN0cyBmb3IgU2VsZWN0IEF0dHJpYnV0ZXMuICBUaGlzIGlzIGNhbGxlZCBhbiBpbnN0YW50aWF0ZWQKLQkgKiB0aHJvdWdoIHRoZSB1c2Ugb2YgdGhlIGNvbXB1dGVQcm9wb3NhbHMgbWV0aG9kIGZyb20gdGhlIFhTTENvbnRlbnRBc3Npc3RQcm9jZXNzb3IuICBJdCB3aWxsCi0JICogY2FsY3VsYXRlIHRoZSBhdmFpbGFibGUgcHJvcG9zYWxzIHRoYXQgYXJlIGF2YWlsYWJsZSBmb3IgdGhlIFhTTCBzZWxlY3QgYXR0cmlidXRlLgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIGRvY3VtZW50UmVnaW9uCi0JICogQHBhcmFtIGNvbXBsZXRpb25SZWdpb24KLQkgKiBAcGFyYW0gYmVnaW4KLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogQHBhcmFtIGZpbHRlcgotCSAqIEBwYXJhbSB0ZXh0Vmlld2VyCi0JICovCi0JcHVibGljIFNlbGVjdEF0dHJpYnV0ZUNvbnRlbnRBc3Npc3QoTm9kZSBub2RlLAotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiwKLQkJCUlUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIGludCBiZWdpbiwgaW50IGxlbmd0aCwgU3RyaW5nIGZpbHRlciwKLQkJCUlUZXh0Vmlld2VyIHRleHRWaWV3ZXIpIHsKLQkJc3VwZXIobm9kZSwgZG9jdW1lbnRSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGJlZ2luLCBsZW5ndGgsIGZpbHRlciwgdGV4dFZpZXdlcik7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCQotCS8qKiAKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFJlcXVlc3QjZ2V0Q29tcGxldGlvblByb3Bvc2FscygpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFycmF5TGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPiBnZXRDb21wbGV0aW9uUHJvcG9zYWxzKCkgewotCQlwcm9wb3NhbHMuY2xlYXIoKTsKLQkJCi0JCWFkanVzdFhQYXRoU3RhcnQoKTsKLQkJCi0JCWludCBvZmZzZXQgPSBnZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKTsKLQkJSURPTUF0dHIgYXR0ck5vZGUgPSBnZXRBdHRyaWJ1dGUoInNlbGVjdCIpOwotCQkKLQkJdGhpcy5tYXRjaFN0cmluZyA9IGV4dHJhY3RYUGF0aE1hdGNoU3RyaW5nKGF0dHJOb2RlLCBnZXRSZWdpb24oKSwgZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCkpOwotCQkKLQkgICAgYWRkU2VsZWN0UHJvcG9zYWxzKChFbGVtZW50KWdldE5vZGUoKS5nZXRQYXJlbnROb2RlKCksIG9mZnNldCk7Ci0KLQkJcmV0dXJuICBnZXRBbGxDb21wbGV0aW9uUHJvcG9zYWxzKCk7Ci0gICAgfQotCi0KLQlwcml2YXRlIElET01BdHRyIGdldEF0dHJpYnV0ZShTdHJpbmcgYXR0ck5hbWUpIHsKLQkJcmV0dXJuIChJRE9NQXR0cikoKElET01FbGVtZW50KWdldE5vZGUoKSkuZ2V0QXR0cmlidXRlTm9kZShhdHRyTmFtZSk7Ci0JfQotCQotCQotCi0JLyoqCi0JICogIFRoaXMgbmVlZHMgdG8gc2V0dXAgdGhlIGNvbnRlbnQgYXNzaXN0YW5jZSBjb3JyZWN0bHkuIEhlcmUgaXMgd2hhdCBuZWVkcyB0byBoYXBwZW46Ci0JICogIDEuIEFkanVzdCB0aGUgbWF0Y2hTdHJpbmcgKFRoaXMgc2hvdWxkIGhhdmUgYmVlbiBjYWxjdWxhdGVkIGVhcmxpZXIpIAotCSAqICAyLiBHZXQgdGhlIGN1cnJlbnQgdG9rZW5zIG9mZnNldCBwb3NpdGlvbi4udGhpcyB3aWxsIGJlIHRoZSBzdGFydGluZyBvZmZzZXQuCi0JICogIDMuIEdldCB0aGUgcmVwbGFjZW1lbnQgbGVuZ3RoLi4udGhpcyBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0b2tlbiBvZmZzZXQgYW5kIHRoZSBuZXh0IHRva2VuIG9yIGVuZCBvZiB0aGUgc3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRqdXN0WFBhdGhTdGFydCgpIHsKLQkgICAgSURPTUVsZW1lbnQgZWxlbSA9IChJRE9NRWxlbWVudClnZXROb2RlKCk7Ci0JICAgIElET01BdHRyIHhwYXRoTm9kZSA9IChJRE9NQXR0cillbGVtLmdldEF0dHJpYnV0ZU5vZGUoInNlbGVjdCIpOwotCSAgICBpZiAoeHBhdGhOb2RlID09IG51bGwpIHsKLQkgICAgCXJldHVybjsKLQkgICAgfQotCSAgICAKLQkJU3RyaW5nIHhwYXRoU3RyaW5nID0geHBhdGhOb2RlLmdldFZhbHVlKCk7Ci0JCWlmICh4cGF0aFN0cmluZy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWludCBzdGFydE9mZnNldCA9IHhwYXRoTm9kZS5nZXRWYWx1ZVJlZ2lvblN0YXJ0T2Zmc2V0KCk7Ci0JCWludCB0b2tlbk9mZnNldCA9IGdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpIC0geHBhdGhOb2RlLmdldFZhbHVlUmVnaW9uU3RhcnRPZmZzZXQoKTsKLQkJaW50IHRva2VuUG9zaXRpb24gPSBnZXRYUGF0aFNlcGVyYXRvclBvcyh0b2tlbk9mZnNldCAtIDEsIHhwYXRoU3RyaW5nKTsKLQkJaW50IG5ld1N0YXJ0T2Zmc2V0ID0gc3RhcnRPZmZzZXQgKyB0b2tlblBvc2l0aW9uOwotCQkKLQkJcmVwbGFjZW1lbnRMZW5ndGggPSBnZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSAtIHN0YXJ0T2Zmc2V0OwotCX0KLQkJCi0JcHJvdGVjdGVkIFN0cmluZyBleHRyYWN0WFBhdGhNYXRjaFN0cmluZyhJRE9NQXR0ciBub2RlLCBJVGV4dFJlZ2lvbiBhUmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCWlmIChub2RlID09IG51bGwgfHwgbm9kZS5nZXRWYWx1ZSgpLmxlbmd0aCgpID09IDApCXJldHVybiAiIjsKLQkJCi0JCWlmIChtYXRjaFN0cmluZy5sZW5ndGgoKSA8IDEpIHsKLQkJCXJldHVybiBtYXRjaFN0cmluZzsKLQkJfQotCQkKLQkJaW50IGNvbHVtbiA9IG9mZnNldCAtIG5vZGUuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpIC0gMTsKLQkJU3RyaW5nIG5vZGVWYWx1ZSA9IG5vZGUuZ2V0VmFsdWUoKTsKLQotCQlpbnQgc2VwZXJhdG9yUG9zID0gZ2V0WFBhdGhTZXBlcmF0b3JQb3MoY29sdW1uLCBub2RlVmFsdWUpOwotCQkKLQkJaWYgKHNlcGVyYXRvclBvcyA+PSBjb2x1bW4pIHsKLQkJCXJldHVybiAiIjsKLQkJfQotCQkJCQotCQlyZXR1cm4gbm9kZS5nZXRWYWx1ZSgpLnN1YnN0cmluZyhzZXBlcmF0b3JQb3MsIGNvbHVtbik7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgaW50IGdldFhQYXRoU2VwZXJhdG9yUG9zKGludCBjb2x1bW4sIFN0cmluZyBub2RlVmFsdWUpIHsKLQkJY2hhciBbXSBrZXlUb2tlbnMgPSB7ICcvJywgJ1snLCAnXScsICcoJywgJyknLCAnLCcsICcgJ307Ci0JCQotCQlpbnQgc2VwZXJhdG9yUG9zID0gMDsKLQkJCi0JCVN0cmluZyBwb3RlbnRpYWxNYXRjaFN0cmluZyA9IG5vZGVWYWx1ZS5zdWJzdHJpbmcoMCwgY29sdW1uKTsKLQkJCi0JCWZvciAoaW50IGNudCA9IDA7IGNudCA8IGtleVRva2Vucy5sZW5ndGg7IGNudCsrKSB7Ci0JCQlpbnQga2V5UG9zID0gcG90ZW50aWFsTWF0Y2hTdHJpbmcubGFzdEluZGV4T2Yoa2V5VG9rZW5zW2NudF0pOwotCQkJaWYgKGtleVBvcyA+PSAwICYmIGtleVBvcyA8PSBjb2x1bW4gLSAxKSB7Ci0JCQkJc2VwZXJhdG9yUG9zID0ga2V5UG9zICsgMTsKLQkJCX0KLQkJfQotCQkKLQkJaW50IGF4aXNQb3MgPSBub2RlVmFsdWUuaW5kZXhPZigiOjoiKTsKLQkJaWYgKGF4aXNQb3MgPiBzZXBlcmF0b3JQb3MgJiYgYXhpc1BvcyA8PSBjb2x1bW4gLTEpIHsKLQkJCXNlcGVyYXRvclBvcyA9IGF4aXNQb3MgKyAxOwotCQl9Ci0JCXJldHVybiBzZXBlcmF0b3JQb3M7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZWxlY3RQcm9wb3NhbHMoRWxlbWVudCByb290RWxlbWVudCwgaW50IG9mZnNldCkgewotCQkJYWRkQ29udGVudE1vZGVsUHJvcG9zYWxzKG9mZnNldCk7Ci0JCQlhZGRHbG9iYWxQcm9wb3NhbHMocm9vdEVsZW1lbnQsIG9mZnNldCk7Ci0JCQlhZGRMb2NhbFByb3Bvc2FscyhnZXROb2RlKCksIG9mZnNldCk7Ci0JCQlhZGRUZW1wbGF0ZXMoVGVtcGxhdGVDb250ZXh0VHlwZUlkc1hQYXRoLkFYSVMsIG9mZnNldCk7Ci0JCQlhZGRUZW1wbGF0ZXMoVGVtcGxhdGVDb250ZXh0VHlwZUlkc1hQYXRoLlhQQVRILCBvZmZzZXQpOwotCQkJYWRkVGVtcGxhdGVzKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNYUGF0aC5DVVNUT00sIG9mZnNldCk7Ci0JCQlhZGRUZW1wbGF0ZXMoVGVtcGxhdGVDb250ZXh0VHlwZUlkc1hQYXRoLk9QRVJBVE9SLCBvZmZzZXQpOwotCX0KLQotCi0JcHJpdmF0ZSB2b2lkIGFkZENvbnRlbnRNb2RlbFByb3Bvc2FscyhpbnQgb2Zmc2V0KSB7Ci0JCUFic3RyYWN0WE1MRWxlbWVudENvbnRlbnRBc3Npc3RSZXF1ZXN0IHhwYXRoWE1McHJvcG9zYWxzID0KLQkJCW5ldyBYUGF0aEVsZW1lbnRDb250ZW50QXNzaXN0KG5vZGUsIGRvY3VtZW50UmVnaW9uLCBnZXRSZWdpb24oKSwgb2Zmc2V0IC0gZ2V0TWF0Y2hTdHJpbmcoKS5sZW5ndGgoKSwgZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgZ2V0TWF0Y2hTdHJpbmcoKSwgdGV4dFZpZXdlcik7Ci0JCUFycmF5TGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPiB4bWxQcm9wb3NhbHMgPSB4cGF0aFhNTHByb3Bvc2Fscy5nZXRDb21wbGV0aW9uUHJvcG9zYWxzKCk7Ci0JCXByb3Bvc2Fscy5hZGRBbGwoeG1sUHJvcG9zYWxzKTsKLQl9Ci0JCi0JCi0JCi0JLyoqCi0JICogQWRkcyBYUGF0aCByZWxhdGVkIHRlbXBsYXRlcyB0byB0aGUgbGlzdCBvZiBwcm9wb3NhbHMKLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudEFzc2lzdFJlcXVlc3QKLQkgKiBAcGFyYW0gY29udGV4dAotCSAqIEBwYXJhbSBzdGFydE9mZnNldAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFRlbXBsYXRlcyhTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0T2Zmc2V0KSB7Ci0KLQkJaWYgKCFmVGVtcGxhdGVDb250ZXh0cy5jb250YWlucyhjb250ZXh0KSkgewotCQkJZlRlbXBsYXRlQ29udGV4dHMuYWRkKGNvbnRleHQpOwotCQkJCi0JCQlpZiAoZ2V0VGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yKCkgIT0gbnVsbCkgewotCQkJCWdldFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvcigpLnNldENvbnRleHRUeXBlKGNvbnRleHQpOwotCQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMgPSBnZXRUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKQotCQkJCQkJLmNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKHRleHRWaWV3ZXIsIHN0YXJ0T2Zmc2V0KTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3Bvc2Fscy5sZW5ndGg7ICsraSkgewotCQkJCQlJQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gcHJvcG9zYWxzW2ldOwotCQkJCQlpZiAobWF0Y2hTdHJpbmcubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQlpZiAocHJvcG9zYWwuZ2V0RGlzcGxheVN0cmluZygpLnN0YXJ0c1dpdGgobWF0Y2hTdHJpbmcpICkgewotCQkJCQkJCWFkZFByb3Bvc2FsKHByb3Bvc2Fsc1tpXSk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlhZGRQcm9wb3NhbChwcm9wb3NhbHNbaV0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCi0KLQlwcml2YXRlIHZvaWQgYWRkTG9jYWxQcm9wb3NhbHMoTm9kZSB4cGF0aG5vZGUsIGludCBvZmZzZXQpIHsKLQkJYWRkVmFyaWFibGVzUHJvcG9zYWxzKFhQQVRIX0xPQ0FMX1ZBUklBQkxFUywgeHBhdGhub2RlLCBvZmZzZXQpOwotCQlhZGRWYXJpYWJsZXNQcm9wb3NhbHMoWFBBVEhfTE9DQUxfUEFSQU1TLCB4cGF0aG5vZGUsIG9mZnNldCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEdsb2JhbFByb3Bvc2FscyhOb2RlIHhwYXRobm9kZSwgaW50IG9mZnNldCkgewotCQlhZGRWYXJpYWJsZXNQcm9wb3NhbHMoWFBBVEhfR0xPQkFMX1ZBUklBQkxFUywgeHBhdGhub2RlLCBvZmZzZXQpOwotCQlhZGRWYXJpYWJsZXNQcm9wb3NhbHMoWFBBVEhfR0xPQkFMX1BBUkFNUywgeHBhdGhub2RlLCBvZmZzZXQpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgUGFyYW1ldGVyIGFuZCBWYXJpYWJsZXMgYXMgcHJvcG9zYWxzLiBUaGlzCi0JICogaW5mb3JtYXRpb24gaXMgc2VsZWN0ZWQgYmFzZWQgb24gdGhlIFhQYXRoIHN0YXRlbWVudCB0aGF0IGlzIHNlbnQgdG8gaXQKLQkgKiBhbmQgdGhlIGlucHV0IE5vZGUgcGFzc2VkLiBJdCB1c2VzIGEgY3VzdG9tIGNvbXBvc2VyIHRvIFhTTCBWYXJpYWJsZQotCSAqIHByb3Bvc2FsLgotCSAqIAotCSAqIEBwYXJhbSB4cGF0aAotCSAqIEBwYXJhbSB4cGF0aG5vZGUKLQkgKiBAcGFyYW0gY29udGVudEFzc2lzdFJlcXVlc3QKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFZhcmlhYmxlc1Byb3Bvc2FscyhTdHJpbmcgeHBhdGgsIE5vZGUgeHBhdGhub2RlLCBpbnQgb2Zmc2V0KSB7Ci0JCXN5bmNocm9uaXplZCAoWFBBVEhfTE9DSykgewotCQkJdHJ5IHsKLQkJCQlOb2RlTGlzdCBub2RlcyA9IFhTTFRYUGF0aEhlbHBlci5zZWxlY3ROb2RlTGlzdCh4cGF0aG5vZGUsIHhwYXRoKTsKLQkJCQlpbnQgc3RhcnRMZW5ndGggPSBnZXRDdXJzb3JQb3NpdGlvbigpIC0gb2Zmc2V0OwotCi0JCQkJaWYgKGhhc05vZGVzKG5vZGVzKSkgewotCQkJCQlmb3IgKGludCBub2RlY250ID0gMDsgbm9kZWNudCA8IG5vZGVzLmdldExlbmd0aCgpOyBub2RlY250KyspIHsKLQkJCQkJCU5vZGUgbm9kZSA9IG5vZGVzLml0ZW0obm9kZWNudCk7Ci0JCQkJCQkKLQkJCQkJCVN0cmluZyB2YXJpYWJsZU5hbWUgPSAiJCIgKyBub2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oIm5hbWUiKS5nZXROb2RlVmFsdWUoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKAotCQkJCQkJCQl2YXJpYWJsZU5hbWUsIG9mZnNldCwgMCwgc3RhcnRMZW5ndGggKyB2YXJpYWJsZU5hbWUubGVuZ3RoKCksCi0JCQkJCQkJCVhTTFBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWFNMUGx1Z2luSW1hZ2VzLklNR19WQVJJQUJMRVMpLAotCQkJCQkJCQl2YXJpYWJsZU5hbWUsIG51bGwsIG51bGwsIDApOwotCQkJCQkJCi0JCQkJCQlpZiAobWF0Y2hTdHJpbmcubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJaWYgKHByb3Bvc2FsLmdldERpc3BsYXlTdHJpbmcoKS5zdGFydHNXaXRoKG1hdGNoU3RyaW5nKSkgewotCQkJCQkJCQlhZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlhZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0gY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGV4KSB7Ci0JCQkJWFNMVUlQbHVnaW4ubG9nKGV4KTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgWFBhdGhUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IgZ2V0VGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlpZiAoZlRlbXBsYXRlUHJvY2Vzc29yID09IG51bGwpIHsKLQkJCWZUZW1wbGF0ZVByb2Nlc3NvciA9IG5ldyBYUGF0aFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvcigpOwotCQl9Ci0JCXJldHVybiBmVGVtcGxhdGVQcm9jZXNzb3I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvVGVtcGxhdGVNb2RlQXR0cmlidXRlQ29udGVudEFzc2lzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvVGVtcGxhdGVNb2RlQXR0cmlidXRlQ29udGVudEFzc2lzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzMyYjVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L1RlbXBsYXRlTW9kZUF0dHJpYnV0ZUNvbnRlbnRBc3Npc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICpDb3B5cmlnaHQgKGMpIDIwMDggU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsIGFuZCBvdGhlcnMuCi0gKkFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKndoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICpDb250cmlidXRvcnM6Ci0gKiAgICBEYXZpZCBDYXJ2ZXIgKFNUQVIpIC0gYnVnIDI0MzU3OCAgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5DdXN0b21Db21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5tb2RlbC5TdHlsZXNoZWV0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLm1vZGVsLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5tb2RlbC5YU0xBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC51dGlsLlhTTFBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwudXRpbC5YU0xQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBUZW1wbGF0ZU1vZGVBdHRyaWJ1dGVDb250ZW50QXNzaXN0IHByb3ZpZGVzIGNvbnRlbnQgYXNzaXN0YW5jZSBwcm9wb3NhbHMgZm9yCi0gKiA8eHNsOnRlbXBsYXRlcz4gd2l0aCBhIG1vZGUgYXR0cmlidXRlLiAgIEl0IGxvb2tzIGF0IGFsbCB0aGUgbW9kZXMgZGVmaW5lZAotICogd2l0aGluIHRoZSB4c2wgbW9kZWwsIGFuZCBwdWxscyBvdXQgYW55IG1vZGVzIHRoYXQgaGF2ZSBiZWVuIGRlZmluZWQuCi0gKiBAYXV0aG9yIGRjYXJ2ZXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRlbXBsYXRlTW9kZUF0dHJpYnV0ZUNvbnRlbnRBc3Npc3QgZXh0ZW5kcwotCQlBYnN0cmFjdFhTTENvbnRlbnRBc3Npc3RSZXF1ZXN0IHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBjcmVhdGluZyB0aGUgVGVtcGxhdGVNb2RlIENvbnRlbnQgQXNzaXN0YW5jZSBjbGFzcy4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gZG9jdW1lbnRSZWdpb24KLQkgKiBAcGFyYW0gY29tcGxldGlvblJlZ2lvbgotCSAqIEBwYXJhbSBiZWdpbgotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiBAcGFyYW0gZmlsdGVyCi0JICogQHBhcmFtIHRleHRWaWV3ZXIKLQkgKi8KLQlwdWJsaWMgVGVtcGxhdGVNb2RlQXR0cmlidXRlQ29udGVudEFzc2lzdChOb2RlIG5vZGUsCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uLAotCQkJSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgaW50IGJlZ2luLCBpbnQgbGVuZ3RoLCBTdHJpbmcgZmlsdGVyLAotCQkJSVRleHRWaWV3ZXIgdGV4dFZpZXdlcikgewotCQlzdXBlcihub2RlLCBkb2N1bWVudFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgYmVnaW4sIGxlbmd0aCwKLQkJCQlmaWx0ZXIsIHRleHRWaWV3ZXIpOwotCX0KLQotCS8qKgotCSAqIFRoZSBtYWluIG1ldGhvZCB0aGF0IHJldHVybnMgYW4gYXJyYXkgb2YgcHJvcG9zYWxzLiBSZXR1cm5zIHRoZSBhdmFpbGFibGUKLQkgKiBtb2RlcyB0aGF0IGhhdmUgYmVlbiBkZWZpbmVkIGluIHRoZSB7QGxpbmsgU3R5bGVzaGVldE1vZGVsfS4gIElmIG5vIHByb3Bvc2FscwotCSAqIGFyZSBmb3VuZCBpdCByZXR1cm5zIGEgTlVMTCB2YWx1ZS4KLQkgKiBAcmV0dXJuIElDb21wbGV0aW9uUHJvcHNhbFtdIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RSZXF1ZXN0I2dldENvbXBsZXRpb25Qcm9wb3NhbHMoKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBcnJheUxpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4gZ2V0Q29tcGxldGlvblByb3Bvc2FscygpIHsKLQkJcHJvcG9zYWxzLmNsZWFyKCk7Ci0JCQotCQlTdHlsZXNoZWV0TW9kZWwgbW9kZWwgPSBnZXRTdHlsZXNoZWV0TW9kZWwoKTsKLQotCQlhZGRNb2RlUHJvcG9zYWxzKG1vZGVsKTsKLQkJcmV0dXJuIGdldEFsbENvbXBsZXRpb25Qcm9wb3NhbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRNb2RlUHJvcG9zYWxzKFN0eWxlc2hlZXRNb2RlbCBtb2RlbCkgewotCQlMaXN0PFRlbXBsYXRlPiB0ZW1wbGF0ZXMgPSBtb2RlbC5nZXRUZW1wbGF0ZXMoKTsKLQkJQXJyYXlMaXN0PFN0cmluZz4gbW9kZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCi0JCWZvciAoVGVtcGxhdGUgdGVtcGxhdGUgOiB0ZW1wbGF0ZXMpIHsKLQkJCVhTTEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSB0ZW1wbGF0ZS5nZXRBdHRyaWJ1dGUoIm1vZGUiKTsKLQkJCUlET01Ob2RlIHhtbE5vZGUgPSAoSURPTU5vZGUpbm9kZTsKLQotCQkJaWYgKGF0dHJpYnV0ZSAhPSBudWxsICYmIHhtbE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSAhPSB0ZW1wbGF0ZS5nZXRPZmZzZXQoKSkgewotCQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoCi0JCQkJCQlhdHRyaWJ1dGUuZ2V0VmFsdWUoKSwgZ2V0U3RhcnRPZmZzZXQoKSArIDEsIDAsCi0JCQkJCQlhdHRyaWJ1dGUuZ2V0VmFsdWUoKS5sZW5ndGgoKSwgWFNMUGx1Z2luSW1hZ2VIZWxwZXIKLQkJCQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoCi0JCQkJCQkJCQkJWFNMUGx1Z2luSW1hZ2VzLklNR19NT0RFKSwgYXR0cmlidXRlCi0JCQkJCQkJCS5nZXRWYWx1ZSgpLCBudWxsLCBudWxsLCAwKTsKLQkJCQlpZiAobW9kZXMuaW5kZXhPZihhdHRyaWJ1dGUuZ2V0VmFsdWUoKSkgPT0gLTEpIHsKLQkJCQkJcHJvcG9zYWxzLmFkZChwcm9wb3NhbCk7Ci0JCQkJCW1vZGVzLmFkZChhdHRyaWJ1dGUuZ2V0VmFsdWUoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCW1vZGVzLmNsZWFyKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9UZW1wbGF0ZU5hbWVBdHRyaWJ1dGVDb250ZW50QXNzaXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9UZW1wbGF0ZU5hbWVBdHRyaWJ1dGVDb250ZW50QXNzaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMjVhZjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvVGVtcGxhdGVOYW1lQXR0cmlidXRlQ29udGVudEFzc2lzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqQ29weXJpZ2h0IChjKSAyMDA4IFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCBhbmQgb3RoZXJzLgotICpBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKmFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICp3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICpodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqQ29udHJpYnV0b3JzOgotICogICAgRGF2aWQgQ2FydmVyIChTVEFSKSBidWcgMjQzNTc3IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5tb2RlbC5DYWxsVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLm1vZGVsLlN0eWxlc2hlZXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLnV0aWwuWFNMUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC51dGlsLlhTTFBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIFByb3ZpZGVzIGNvbnRlbnQgYXNzaXN0YW5jZSBmb3IgWFNMVCBOYW1lZCBUZW1wbGF0ZXMuICAgSXQgcHJvdmlkZXMgYSBsaXN0Ci0gKiBvZiBhdmFpbGFibGUgY2FsbC10ZW1wbGF0ZSBuYW1lcyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIHVzZWQgd2l0aCBpbiB0aGUKLSAqIHN0eWxlc2hlZXQuCi0gKiAKLSAqIEBhdXRob3IgRGF2aWQgQ2FydmVyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUZW1wbGF0ZU5hbWVBdHRyaWJ1dGVDb250ZW50QXNzaXN0IGV4dGVuZHMgQWJzdHJhY3RYU0xDb250ZW50QXNzaXN0UmVxdWVzdCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FID0gIm5hbWUiOwotCi0JLyoqCi0JICogUHJvdmlkZXMgY29udGVudCBhc3Npc3RhbmNlIGZvciBYU0xUIE5hbWVkIFRlbXBsYXRlcy4gIFdpbGwgcHJvdmlkZSBhIGxpc3QKLQkgKiBvZiBwcm9wb3NhbHMgYmFzZWQgb24gdGhlIGF2YWlsYWJsZSBuYW1lZC10ZW1wbGF0ZXMgaWYgYW55IGFyZSBkZWZpbmVkIGluCi0JICogdGhlIFhTTCBTdHlsZXNoZWV0IG1vZGVsLiAgIE9ubHkgcHJvdmlkZXMgYSBsaXN0IG9mIG5hbWVkIHRlbXBsYXRlcyB0aGF0IGhhdmVuJ3QgYWxyZWFkeQotCSAqIGJlZW4gYWRkZWQgYXMgYSBwcm9wb3NhbC4gIERvZXMgbm90IGNoZWNrIHRvIHNlZSBpZiBpdCdzIGFscmVhZHkgaXMgZGVmaW5lZCBpbiB0aGUgY3VycmVudCBzdHlsZXNoZWV0LgotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIGRvY3VtZW50UmVnaW9uCi0JICogQHBhcmFtIGNvbXBsZXRpb25SZWdpb24KLQkgKiBAcGFyYW0gYmVnaW4KLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogQHBhcmFtIGZpbHRlcgotCSAqIEBwYXJhbSB0ZXh0Vmlld2VyCi0JICovCi0JcHVibGljIFRlbXBsYXRlTmFtZUF0dHJpYnV0ZUNvbnRlbnRBc3Npc3QoTm9kZSBub2RlLAotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiwKLQkJCUlUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIGludCBiZWdpbiwgaW50IGxlbmd0aCwgU3RyaW5nIGZpbHRlciwKLQkJCUlUZXh0Vmlld2VyIHRleHRWaWV3ZXIpIHsKLQkJc3VwZXIobm9kZSwgZG9jdW1lbnRSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGJlZ2luLCBsZW5ndGgsIGZpbHRlciwgdGV4dFZpZXdlcik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkFic3RyYWN0WFNMQ29udGVudEFzc2lzdFJlcXVlc3QjZ2V0Q29tcGxldGlvblByb3Bvc2FscygpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFycmF5TGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPiBnZXRDb21wbGV0aW9uUHJvcG9zYWxzKCkgewotCQlwcm9wb3NhbHMuY2xlYXIoKTsKLQkJCi0JCVN0eWxlc2hlZXRNb2RlbCBtb2RlbCA9IGdldFN0eWxlc2hlZXRNb2RlbCgpOwotCQlMaXN0PENhbGxUZW1wbGF0ZT4gdGVtcGxhdGVzID0gbW9kZWwuZ2V0Q2FsbFRlbXBsYXRlcygpOwotCQkKLQkJZm9yIChDYWxsVGVtcGxhdGUgdGVtcGxhdGUgOiB0ZW1wbGF0ZXMpIHsKLQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IGNyZWF0ZVByb3Bvc2FsKHRlbXBsYXRlKTsKLQkJCWFkZFVuaXF1ZVByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJfQotCQkKLQkJcmV0dXJuIGdldEFsbENvbXBsZXRpb25Qcm9wb3NhbHMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkVW5pcXVlUHJvcG9zYWwoQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsKSB7Ci0JCWlmIChwcm9wb3NhbHMubGFzdEluZGV4T2YocHJvcG9zYWwpID09IC0xKSB7Ci0JCQlpZiAobWF0Y2hTdHJpbmcubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJaWYgKHByb3Bvc2FsLmdldERpc3BsYXlTdHJpbmcoKS5zdGFydHNXaXRoKG1hdGNoU3RyaW5nKSkgewotCQkJCQlhZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlhZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBjcmVhdGVQcm9wb3NhbChDYWxsVGVtcGxhdGUgdGVtcGxhdGUpIHsKLQkJQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCgKLQkJCQl0ZW1wbGF0ZS5nZXRBdHRyaWJ1dGVWYWx1ZShBVFRSX05BTUUpLCBnZXRTdGFydE9mZnNldCgpICsgMSwgMCwKLQkJCQl0ZW1wbGF0ZS5nZXRBdHRyaWJ1dGVWYWx1ZShBVFRSX05BTUUpLmxlbmd0aCgpLCBYU0xQbHVnaW5JbWFnZUhlbHBlcgotCQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoCi0JCQkJCQkJCVhTTFBsdWdpbkltYWdlcy5JTUdfVEVNUExBVEUpLCB0ZW1wbGF0ZQotCQkJCQkJLmdldEF0dHJpYnV0ZVZhbHVlKEFUVFJfTkFNRSksIG51bGwsIG51bGwsIDApOwotCQlyZXR1cm4gcHJvcG9zYWw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9UZXN0QXR0cmlidXRlQ29udGVudEFzc2lzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvVGVzdEF0dHJpYnV0ZUNvbnRlbnRBc3Npc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzlkYmFkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9UZXN0QXR0cmlidXRlQ29udGVudEFzc2lzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqQ29weXJpZ2h0IChjKSAyMDA4IFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCBhbmQgb3RoZXJzLgotICpBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKmFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICp3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICpodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqQ29udHJpYnV0b3JzOgotICogICAgRGF2aWQgQ2FydmVyIChTVEFSKSAtIGJ1ZyAyNDAxNzAgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgY29udGVudCBhc3Npc3RhbmNlIGZvciB0aGUgeHNsIDxlbXBoYXNpcz50ZXN0PC9lbXBoYWlzPiBhdHRyaWJ1dGUuCi0gKiAgCi0gKiBAYXV0aG9yIGRjYXJ2ZXIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0QXR0cmlidXRlQ29udGVudEFzc2lzdCBleHRlbmRzIFNlbGVjdEF0dHJpYnV0ZUNvbnRlbnRBc3Npc3QgewotCi0JcHJpdmF0ZSBTdHJpbmcgQVRUUl9URVNUID0gInRlc3QiOyAvLyROT04tTkxTJAotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciB0aGUgWFNMIGNvbnRlbnQgYXNzaXN0YW5jZSBmb3IgdGhlIHRlc3QgYXR0cmlidXRlLgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIGRvY3VtZW50UmVnaW9uCi0JICogQHBhcmFtIGNvbXBsZXRpb25SZWdpb24KLQkgKiBAcGFyYW0gYmVnaW4KLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogQHBhcmFtIGZpbHRlcgotCSAqIEBwYXJhbSB0ZXh0Vmlld2VyCi0JICovCi0JcHVibGljIFRlc3RBdHRyaWJ1dGVDb250ZW50QXNzaXN0KE5vZGUgbm9kZSwgCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uLAotCQkJSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgaW50IGJlZ2luLCBpbnQgbGVuZ3RoLCBTdHJpbmcgZmlsdGVyLAotCQkJSVRleHRWaWV3ZXIgdGV4dFZpZXdlcikgewotCQlzdXBlcihub2RlLCBkb2N1bWVudFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgYmVnaW4sIGxlbmd0aCwgZmlsdGVyLAotCQkJCXRleHRWaWV3ZXIpOwotCX0KLQkKLQkvKiogCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LlNlbGVjdEF0dHJpYnV0ZUNvbnRlbnRBc3Npc3QjZ2V0Q29tcGxldGlvblByb3Bvc2FscygpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFycmF5TGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPiBnZXRDb21wbGV0aW9uUHJvcG9zYWxzKCkgewotCQkKLQkJYWRqdXN0WFBhdGhTdGFydCgpOwotCQkKLQkJaW50IG9mZnNldCA9IGdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpOwotCQlJRE9NQXR0ciBhdHRyTm9kZSA9IChJRE9NQXR0cikoKElET01FbGVtZW50KWdldE5vZGUoKSkuZ2V0QXR0cmlidXRlTm9kZSgidGVzdCIpOwotCQkKLQkJbWF0Y2hTdHJpbmcgPSBleHRyYWN0WFBhdGhNYXRjaFN0cmluZyhhdHRyTm9kZSwgZ2V0UmVnaW9uKCksIGdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpKTsKLQkJCi0JICAgIGFkZFNlbGVjdFByb3Bvc2FscygoRWxlbWVudClnZXROb2RlKCkuZ2V0UGFyZW50Tm9kZSgpLCBvZmZzZXQpOwotCi0JCXJldHVybiBnZXRBbGxDb21wbGV0aW9uUHJvcG9zYWxzKCk7Ci0gICAgfQotCQotCS8qKgotCSAqICBUaGlzIG5lZWRzIHRvIHNldHVwIHRoZSBjb250ZW50IGFzc2lzdGFuY2UgY29ycmVjdGx5LiBIZXJlIGlzIHdoYXQgbmVlZHMgdG8gaGFwcGVuOgotCSAqICAxLiBBZGp1c3QgdGhlIG1hdGNoU3RyaW5nIChUaGlzIHNob3VsZCBoYXZlIGJlZW4gY2FsY3VsYXRlZCBlYXJsaWVyKSAKLQkgKiAgMi4gR2V0IHRoZSBjdXJyZW50IHRva2VucyBvZmZzZXQgcG9zaXRpb24uLnRoaXMgd2lsbCBiZSB0aGUgc3RhcnRpbmcgb2Zmc2V0LgotCSAqICAzLiBHZXQgdGhlIHJlcGxhY2VtZW50IGxlbmd0aC4uLnRoaXMgaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdG9rZW4gb2Zmc2V0IGFuZCB0aGUgbmV4dCB0b2tlbiBvciBlbmQgb2YgdGhlIHN0cmluZwotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkanVzdFhQYXRoU3RhcnQoKSB7Ci0JICAgIElET01FbGVtZW50IGVsZW0gPSAoSURPTUVsZW1lbnQpZ2V0Tm9kZSgpOwotCSAgICBJRE9NQXR0ciB4cGF0aE5vZGUgPSAoSURPTUF0dHIpZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKEFUVFJfVEVTVCk7Ci0JCQotCQlpZiAoeHBhdGhOb2RlICE9IG51bGwpIHsKLQkJCVN0cmluZyB4cGF0aFN0cmluZyA9IHhwYXRoTm9kZS5nZXRWYWx1ZSgpOwotCQkJaW50IHN0YXJ0T2Zmc2V0ID0geHBhdGhOb2RlLmdldFZhbHVlUmVnaW9uU3RhcnRPZmZzZXQoKTsKLQkJCWludCB0b2tlbk9mZnNldCA9IGdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpIC0geHBhdGhOb2RlLmdldFZhbHVlUmVnaW9uU3RhcnRPZmZzZXQoKTsKLQkJCWludCB0b2tlblBvc2l0aW9uID0gZ2V0WFBhdGhTZXBlcmF0b3JQb3ModG9rZW5PZmZzZXQsIHhwYXRoU3RyaW5nKTsKLQkJCWludCBuZXdTdGFydE9mZnNldCA9IHN0YXJ0T2Zmc2V0ICsgdG9rZW5Qb3NpdGlvbiAtIDE7Ci0JCQkKLQkJCXJlcGxhY2VtZW50TGVuZ3RoID0gZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCkgLSBzdGFydE9mZnNldDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L1hQYXRoRWxlbWVudENvbnRlbnRBc3Npc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L1hQYXRoRWxlbWVudENvbnRlbnRBc3Npc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk5MDhiNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9YUGF0aEVsZW1lbnRDb250ZW50QXNzaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCBhbmQgb3RoZXJzLgotICpBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKmFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICp3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICpodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqQ29udHJpYnV0b3JzOgotICogICAgRGF2aWQgQ2FydmVyIChTVEFSKSAtIGJ1ZyAyNDQ5NzggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBidWcgMjU5NTc1IC0gcmVwbGFjZXMgdGV4dCBpZiBNYXRjaFN0cmluZyBoYXMgYSBsZW5ndGggd2l0aCBYTUwgQ29udGVudCBNb2RlbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wb3NhbHMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5DdXN0b21Db21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLmNvcmUudXRpbC5YU0xUWFBhdGhIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5YU0xVSVBsdWdpbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgWE1MIEVsZW1lbnQgcHJvcG9zYWxzIHdpdGhpbiBYUGF0aCByZWxhdGVkIGl0ZW1zIGxpa2UKLSAqIHNlbGVjdCwgdGVzdCwgYW5kIG1hdGNoIGF0dHJpYnV0ZXMuICBUaGlzIHdpbGwgbGV2ZXJhZ2UgYW4gQ29udGVudE1vZGVsIHRoYXQKLSAqIGhhcyBiZWVuIGxvYWRlZCBhbmQgdHJ5IHRvIHByb3ZpZGUgYWxsIGF2YWlsYWJsZSBYTUwgZWxlbWVudHMgdGhhdCBjb3VsZCBiZSB1c2VkLgotICogSXQgc2hvdWxkIGJlIGVuaGFuY2VkIHRvIGtub3cgdGhlIGVsZW1lbnRzIHRvIGJlIHVzZWQgYmFzZWQgb24gaW5mb3JtYXRpb24gZnJvbQotICogdGhlIFhQYXRoLgotICogCi0gKiBAYXV0aG9yIERhdmlkIENhcnZlcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgWFBhdGhFbGVtZW50Q29udGVudEFzc2lzdCBleHRlbmRzCi0JCUFic3RyYWN0WE1MRWxlbWVudENvbnRlbnRBc3Npc3RSZXF1ZXN0IHsKLQotCS8qKgotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBkb2N1bWVudFJlZ2lvbgotCSAqIEBwYXJhbSBjb21wbGV0aW9uUmVnaW9uCi0JICogQHBhcmFtIGJlZ2luCi0JICogQHBhcmFtIGxlbmd0aAotCSAqIEBwYXJhbSBmaWx0ZXIKLQkgKiBAcGFyYW0gdGV4dFZpZXdlcgotCSAqLwotCXB1YmxpYyBYUGF0aEVsZW1lbnRDb250ZW50QXNzaXN0KE5vZGUgbm9kZSwKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24sCi0JCQlJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLCBpbnQgYmVnaW4sIGludCBsZW5ndGgsIFN0cmluZyBmaWx0ZXIsCi0JCQlJVGV4dFZpZXdlciB0ZXh0Vmlld2VyKSB7Ci0JCXN1cGVyKG5vZGUsIGRvY3VtZW50UmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBiZWdpbiwgbGVuZ3RoLAotCQkJCWZpbHRlciwgdGV4dFZpZXdlcik7Ci0JfQotCi0JLyoqCi0JICogUHJvdmlkZXMgYSBsaXN0IG9mIHBvc3NpYmxlIHByb3Bvc2FscyBmb3IgdGhlIFhNTCBFbGVtZW50cyB3aXRoaW4gdGhlIGN1cnJlbnQKLQkgKiBzY29wZS4gIFRoaXMgbGV2ZXJhZ2VzIHRoZSBDb250ZW50TW9kZWwgdGhhdCB3YXMgbG9hZGVkIGJ5IHRoZSBYTUwgQ2F0YWxvZywgCi0JICogQ3VzdG9tIFJlc29sdmVyLCBvciB0aGUgaW5mZXJyZWQgZ3JhbW1hci4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQXJyYXlMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+IGdldENvbXBsZXRpb25Qcm9wb3NhbHMoKSB7Ci0JCUlET01Eb2N1bWVudCBkb21Eb2N1bWVudCA9IChJRE9NRG9jdW1lbnQpIG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCQkKLQkJZ2V0WFBhdGhYTUxFbGVtZW50UHJvcG9zYWxzKGRvbURvY3VtZW50KTsKLQkJCi0JCQotCQlyZXR1cm4gZ2V0QWxsQ29tcGxldGlvblByb3Bvc2FscygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBnZXRYUGF0aFhNTEVsZW1lbnRQcm9wb3NhbHMoSURPTURvY3VtZW50IGRvbURvY3VtZW50KSB7Ci0JCXRyeSB7Ci0JCQlOb2RlIGFuY2VzdG9yTm9kZSA9IFhTTFRYUGF0aEhlbHBlci5zZWxlY3RTaW5nbGVOb2RlKGdldE5vZGUoKSwKLQkJCQkJWFBBVEhfRklSU1RfWFNMQU5DRVNUT1JfTk9ERSk7Ci0JCQkKLQkJCUl0ZXJhdG9yPENNTm9kZT4gY21Ob2RlSXQgPSBnZXRBdmFpbGFibGVDb250ZW50Tm9kZXMoZG9tRG9jdW1lbnQsCi0JCQkJCWFuY2VzdG9yTm9kZSwgTW9kZWxRdWVyeS5JTkNMVURFX0NISUxEX05PREVTKTsKLQkJCQotCQkJY3JlYXRlWFBhdGhYTUxQcm9wb3NhbHMoYW5jZXN0b3JOb2RlLCBjbU5vZGVJdCk7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlYU0xVSVBsdWdpbi5sb2coZXgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVhQYXRoWE1MUHJvcG9zYWxzKE5vZGUgYW5jZXN0b3JOb2RlLAotCQkJSXRlcmF0b3I8Q01Ob2RlPiBjbU5vZGVJdCkgewotCQl3aGlsZSAoY21Ob2RlSXQuaGFzTmV4dCgpKSB7Ci0JCQlDTU5vZGUgY21Ob2RlID0gY21Ob2RlSXQubmV4dCgpOwotCQkJU3RyaW5nIHByb3Bvc2VkVGV4dCA9IGdldFJlcXVpcmVkTmFtZShhbmNlc3Rvck5vZGUsIGNtTm9kZSk7Ci0JCQlpZiAoIShwcm9wb3NlZFRleHQuY29udGFpbnMoInhzbDoiKSB8fCBwcm9wb3NlZFRleHQuY29udGFpbnMoInhzbHQ6IikpKSB7Ci0JCQkJaW50IG9mZnNldCA9IGdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpOwotCQkJCUltYWdlIGltYWdlID0gZ2V0Q01Ob2RlSW1hZ2UoY21Ob2RlKTsKLQkJCQlpbnQgc3RhcnRMZW5ndGggPSBnZXRDdXJzb3JQb3NpdGlvbigpIC0gb2Zmc2V0OwotCQkJCVN0cmluZyBhZGRpdGlvbmFsSW5mbyA9IGdldEluZm9Qcm92aWRlcigpLmdldEluZm8oY21Ob2RlKTsKLQkJCQkKLQkJCQlpZiAobWF0Y2hTdHJpbmcubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCWlmIChwcm9wb3NlZFRleHQuc3RhcnRzV2l0aChtYXRjaFN0cmluZykpIHsKLQkJCQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IGNyZWF0ZVByb3Bvc2FsKAotCQkJCQkJCQlwcm9wb3NlZFRleHQsIGFkZGl0aW9uYWxJbmZvLCBvZmZzZXQsIGltYWdlLCBzdGFydExlbmd0aCk7Ci0JCQkJCQlhZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBjcmVhdGVQcm9wb3NhbCgKLQkJCQkJCQlwcm9wb3NlZFRleHQsIGFkZGl0aW9uYWxJbmZvLCBvZmZzZXQsIGltYWdlLCBzdGFydExlbmd0aCk7Ci0JCQkJCWFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJCQl9CQkJCQkKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvWFNMQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvWFNMQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2U4NDBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L1hTTENvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRGF2aWQgQ2FydmVyIC0gU1RBUiAtIGJ1ZyAyMTM4NDkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBTVEFSIC0gYnVnIDIzMDk1OCAtIHJlZmFjdG9yZWQgdG8gZml4IGJ1ZyB3aXRoIGdldHRpbmcKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBET00gRG9jdW1lbnQgZm9yIHRoZSBjdXJyZW50IGVkaXRvcgotICogICAgIERhdmlkIENhcnZlciAtIFNUQVIgLSBidWcgMjQwMTcwIC0gcmVmYWN0b3JlZCBjb2RlIHRvIGhlbHAgd2l0aCBuYXJyb3dpbmcgb2YKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgYW5kIGVhc2llciBtYWludGVuYW5jZS4KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5BYnN0cmFjdENvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LlhNTENvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLlhTTENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIFRoZSBYU0wgQ29udGVudCBBc3Npc3QgUHJvY2Vzc29yIHByb3ZpZGVzIGNvbnRlbnQgYXNzaXN0YW5jZSBmb3IgdmFyaW91cwotICogYXR0cmlidXRlcyB2YWx1ZXMgd2l0aGluIHRoZSBYU0wgRWRpdG9yLiBUaGlzIGluY2x1ZGVzIHN1cHBvcnQgZm9yIHhwYXRocyBvbgotICogc2VsZWN0IHN0YXRlbWVudHMgYXMgd2VsbCBhcyBvbiB0ZXN0IGFuZCBtYXRjaCBhdHRyaWJ1dGVzLgotICogCi0gKiBAYXV0aG9yIERhdmlkIENhcnZlcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgWFNMQ29udGVudEFzc2lzdFByb2Nlc3NvciBpbXBsZW1lbnRzIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIHsKLQotCXByaXZhdGUgU3RyaW5nIGVycm9yTWVzc2FnZSA9ICIiOwotCXByaXZhdGUgSVRleHRWaWV3ZXIgdGV4dFZpZXdlciA9IG51bGw7Ci0JcHJpdmF0ZSBBcnJheUxpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4geHNsUHJvcG9zYWxzOwotCXByaXZhdGUgQXJyYXlMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+IGFkZGl0aW9uYWxQcm9wb3NhbHM7Ci0JcHJpdmF0ZSBJbmRleGVkUmVnaW9uIHRyZWVOb2RlOwotCXByaXZhdGUgTm9kZSBub2RlOwotCXByaXZhdGUgSURPTU5vZGUgeG1sTm9kZTsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb247Ci0JcHJpdmF0ZSBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uOwotCXByaXZhdGUgU3RyaW5nIG1hdGNoU3RyaW5nOwotCXByaXZhdGUgaW50IGN1cnNvclBvc2l0aW9uOwotCi0JLyoqCi0JICogUHJvdmlkZXMgYW4gWFNMIENvbnRlbnQgQXNzaXN0IFByb2Nlc3NvciBjbGFzcyB0aGF0IGlzIFhTTCBhd2FyZSBhbmQgWE1MCi0JICogYXdhcmUuCi0JICovCi0JcHVibGljIFhTTENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKSB7Ci0JCXN1cGVyKCk7Ci0JCXhzbFByb3Bvc2FscyA9IG5ldyBBcnJheUxpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4oKTsKLQkJYWRkaXRpb25hbFByb3Bvc2FscyA9IG5ldyBBcnJheUxpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4oKTsKLQl9Ci0KLQkvKioKLQkgKiBDT05URU5UIEFTU0lTVCBTVEFSVFMgSEVSRQotCSAqIAotCSAqIFJldHVybiBhIGxpc3Qgb2YgcHJvcG9zZWQgY29kZSBjb21wbGV0aW9ucyBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkCi0JICogbG9jYXRpb24gd2l0aGluIHRoZSBkb2N1bWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBjdXJyZW50IGN1cnNvcgotCSAqIHBvc2l0aW9uIHdpdGhpbiB0aGUgdGV4dC1lZGl0b3IgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dFZpZXdlcgotCSAqIEBwYXJhbSBkb2N1bWVudFBvc2l0aW9uCi0JICogICAgICAgICAgICAtIHRoZSBjdXJzb3IgbG9jYXRpb24gd2l0aGluIHRoZSBkb2N1bWVudAotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgSUNvbXBsZXRpb25Qcm9wb3NhbAotCSAqLwotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoCi0JCQlJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBpbnQgZG9jdW1lbnRQb3NpdGlvbikgewotCQlpbml0aWFsaXplUHJvcG9zYWxWYXJpYWJsZXModGV4dFZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0KLQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHhtbFByb3Bvc2FscyA9IGdldFhNTFByb3Bvc2FscygpOwotCi0JCWFkZGl0aW9uYWxQcm9wb3NhbHMgPSBnZXRBZGRpdGlvbmFsWFNMRWxlbWVudFByb3Bvc2FscygpOwotCi0JCXhzbFByb3Bvc2FscyA9IGdldFhTTE5hbWVzcGFjZVByb3Bvc2FscygpOwotCi0JCUFycmF5TGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPiBwcm9wb3NhbExpc3QgPSBuZXcgQXJyYXlMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+KCk7Ci0JCWFkZFByb3Bvc2Fscyh4bWxQcm9wb3NhbHMsIHByb3Bvc2FsTGlzdCk7Ci0JCXByb3Bvc2FsTGlzdC5hZGRBbGwoYWRkaXRpb25hbFByb3Bvc2Fscyk7Ci0JCXByb3Bvc2FsTGlzdC5hZGRBbGwoeHNsUHJvcG9zYWxzKTsKLQotCQlJQ29tcGxldGlvblByb3Bvc2FsW10gY29tYmluZWRQcm9wb3NhbHMgPSBjb21iaW5lUHJvcG9zYWxzKHByb3Bvc2FsTGlzdCk7Ci0KLQkJaWYgKGNvbWJpbmVkUHJvcG9zYWxzID09IG51bGwgfHwgY29tYmluZWRQcm9wb3NhbHMubGVuZ3RoID09IDApIHsKLQkJCXNldEVycm9yTWVzc2FnZShNZXNzYWdlcy5Ob0NvbnRlbnRBc3Npc3RhbmNlKTsKLQkJfQotCi0JCXJldHVybiBjb21iaW5lZFByb3Bvc2FsczsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGV4dFZpZXdlcgotCSAqIEBwYXJhbSBkb2N1bWVudFBvc2l0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVQcm9wb3NhbFZhcmlhYmxlcyhJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLAotCQkJaW50IGRvY3VtZW50UG9zaXRpb24pIHsKLQkJdGhpcy50ZXh0Vmlld2VyID0gdGV4dFZpZXdlcjsKLQkJY3Vyc29yUG9zaXRpb24gPSBkb2N1bWVudFBvc2l0aW9uOwotCQl0cmVlTm9kZSA9IENvbnRlbnRBc3Npc3RVdGlscy5nZXROb2RlQXQodGV4dFZpZXdlciwgY3Vyc29yUG9zaXRpb24pOwotCQlub2RlID0gZ2V0QWN0dWFsRE9NTm9kZSgoTm9kZSkgdHJlZU5vZGUpOwotCQl4bWxOb2RlID0gKElET01Ob2RlKSBub2RlOwotCQlzZFJlZ2lvbiA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQljb21wbGV0aW9uUmVnaW9uID0gZ2V0Q29tcGxldGlvblJlZ2lvbihjdXJzb3JQb3NpdGlvbiwgbm9kZSk7Ci0JCW1hdGNoU3RyaW5nID0gZ2V0TWF0Y2hTdHJpbmcoc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGN1cnNvclBvc2l0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIEFycmF5TGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPiBnZXRYU0xOYW1lc3BhY2VQcm9wb3NhbHMoKSB7Ci0JCWlmIChYU0xDb3JlLmlzWFNMTmFtZXNwYWNlKHhtbE5vZGUpKSB7Ci0JCQlYU0xDb250ZW50QXNzaXN0UmVxdWVzdEZhY3RvcnkgcmVxdWVzdEZhY3RvcnkgPSBuZXcgWFNMQ29udGVudEFzc2lzdFJlcXVlc3RGYWN0b3J5KAotCQkJCQl0ZXh0Vmlld2VyLCBjdXJzb3JQb3NpdGlvbiwgeG1sTm9kZSwgc2RSZWdpb24sCi0JCQkJCWNvbXBsZXRpb25SZWdpb24sIG1hdGNoU3RyaW5nKTsKLQotCQkJSUNvbnRlbnRBc3Npc3RQcm9wb3NhbFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QgPSByZXF1ZXN0RmFjdG9yeQotCQkJCQkuZ2V0Q29udGVudEFzc2lzdFJlcXVlc3QoKTsKLQkJCXhzbFByb3Bvc2FscyA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldENvbXBsZXRpb25Qcm9wb3NhbHMoKTsKLQkJfQotCQlyZXR1cm4geHNsUHJvcG9zYWxzOwotCX0KLQotCXByaXZhdGUgQXJyYXlMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+IGdldEFkZGl0aW9uYWxYU0xFbGVtZW50UHJvcG9zYWxzKCkgewotCQlpZiAoIVhTTENvcmUuaXNYU0xOYW1lc3BhY2UoeG1sTm9kZSkpIHsKLQkJCWFkZGl0aW9uYWxQcm9wb3NhbHMgPSBuZXcgWFNMRWxlbWVudENvbnRlbnRBc3Npc3RSZXF1ZXN0KHhtbE5vZGUsCi0JCQkJCXNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBjdXJzb3JQb3NpdGlvbiwgMCwgbWF0Y2hTdHJpbmcsCi0JCQkJCXRleHRWaWV3ZXIpLmdldENvbXBsZXRpb25Qcm9wb3NhbHMoKTsKLQkJfQotCQlyZXR1cm4gYWRkaXRpb25hbFByb3Bvc2FsczsKLQl9Ci0KLQlwcml2YXRlIElDb21wbGV0aW9uUHJvcG9zYWxbXSBnZXRYTUxQcm9wb3NhbHMoKSB7Ci0JCUFic3RyYWN0Q29udGVudEFzc2lzdFByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgWE1MQ29udGVudEFzc2lzdFByb2Nlc3NvcigpOwotCi0JCUlDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWxzW10gPSBwcm9jZXNzb3IuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoCi0JCQkJdGV4dFZpZXdlciwgY3Vyc29yUG9zaXRpb24pOwotCQlyZXR1cm4gcHJvcG9zYWxzOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRQcm9wb3NhbHMoSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHByb3Bvc2FscywKLQkJCUFycmF5TGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPiBwcm9wb3NhbExpc3QpIHsKLQkJaWYgKHByb3Bvc2FscyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBjbnQgPSAwOyBjbnQgPCBwcm9wb3NhbHMubGVuZ3RoOyBjbnQrKykgewotCQkJCXByb3Bvc2FsTGlzdC5hZGQocHJvcG9zYWxzW2NudF0pOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGxldGlvblByb3Bvc2FsW10gY29tYmluZVByb3Bvc2FscygKLQkJCUFycmF5TGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPiBwcm9wb3NhbExpc3QpIHsKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNvbWJpbmVkUHJvcG9zYWxzID0gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbcHJvcG9zYWxMaXN0Ci0JCQkJLnNpemUoKV07Ci0JCXByb3Bvc2FsTGlzdC50b0FycmF5KGNvbWJpbmVkUHJvcG9zYWxzKTsKLQkJcmV0dXJuIGNvbWJpbmVkUHJvcG9zYWxzOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBub2RlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgTm9kZSBnZXRBY3R1YWxET01Ob2RlKE5vZGUgbm9kZSkgewotCQl3aGlsZSAoKG5vZGUgIT0gbnVsbCkgJiYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkKLQkJCQkmJiAobm9kZS5nZXRQYXJlbnROb2RlKCkgIT0gbnVsbCkpIHsKLQkJCW5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBTdHJ1Y3R1cmVkVGV4dFZpZXdlciBtdXN0IGJlIHNldCBiZWZvcmUgdXNpbmcgdGhpcy4KLQkgKiAKLQkgKiBAcGFyYW0gcG9zCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXJldHVybiBDb250ZW50QXNzaXN0VXRpbHMuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHRleHRWaWV3ZXIsCi0JCQkJY3Vyc29yUG9zaXRpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVnaW9uIHdob3NlIGNvbnRlbnQncyByZXF1aXJlIGNvbXBsZXRpb24uIFRoaXMgaXMgc29tZXRoaW5nCi0JICogb2YgYSBtaXNub21lciBhcyBzb21ldGltZXMgdGhlIHVzZXIgd2FudHMgdG8gYmUgcHJvbXB0ZWQgZm9yIGNvbnRlbnRzIG9mCi0JICogYSBub24tZXhpc3RlbnQgSVRleHRSZWdpb24sIHN1Y2ggYXMgZm9yIGVudW1lcmF0ZWQgYXR0cmlidXRlIHZhbHVlcwotCSAqIGZvbGxvd2luZyBhbiAnPScgc2lnbi4KLQkgKiAKLQkgKiBDb3BpZWQgZnJvbSBBYnN0cmFjdENvbnRlbnRBc3Npc3QgUHJvY2Vzc29yLgotCSAqLwotCXByb3RlY3RlZCBJVGV4dFJlZ2lvbiBnZXRDb21wbGV0aW9uUmVnaW9uKGludCBkb2N1bWVudFBvc2l0aW9uLCBOb2RlIGRvbW5vZGUpIHsKLQkJaWYgKGRvbW5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQlpbnQgb2Zmc2V0ID0gZG9jdW1lbnRQb3NpdGlvbjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG51bGw7Ci0JCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIGRvbW5vZGU7Ci0KLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCWlmIChub2RlLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExlbmd0aCgpID09IDApIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCUlUZXh0UmVnaW9uIHJlc3VsdCA9IG5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkKLQkJCQkJLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCkKLQkJCQkJLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQl3aGlsZSAocmVzdWx0ID09IG51bGwpIHsKLQkJCQlvZmZzZXQtLTsKLQkJCQlyZXN1bHQgPSBub2RlLmdldFN0cnVjdHVyZWREb2N1bWVudCgpCi0JCQkJCQkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KQotCQkJCQkJLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFRhZyA9IG5vZGUKLQkJCQkuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRUYWcgPSBub2RlCi0JCQkJLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCi0JCWlmICgoc3RhcnRUYWcgIT0gbnVsbCkgJiYgKHN0YXJ0VGFnLmdldFN0YXJ0T2Zmc2V0KCkgPD0gb2Zmc2V0KQotCQkJCSYmIChvZmZzZXQgPCBzdGFydFRhZy5nZXRTdGFydE9mZnNldCgpICsgc3RhcnRUYWcuZ2V0TGVuZ3RoKCkpKSB7Ci0JCQlmbGF0Tm9kZSA9IHN0YXJ0VGFnOwotCQl9IGVsc2UgaWYgKChlbmRUYWcgIT0gbnVsbCkgJiYgKGVuZFRhZy5nZXRTdGFydE9mZnNldCgpIDw9IG9mZnNldCkKLQkJCQkmJiAob2Zmc2V0IDwgZW5kVGFnLmdldFN0YXJ0T2Zmc2V0KCkgKyBlbmRUYWcuZ2V0TGVuZ3RoKCkpKSB7Ci0JCQlmbGF0Tm9kZSA9IGVuZFRhZzsKLQkJfQotCi0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQlyZWdpb24gPSBnZXRDb21wbGV0aW9uUmVnaW9uKG9mZnNldCwgZmxhdE5vZGUpOwotCQl9IGVsc2UgewotCQkJZmxhdE5vZGUgPSBub2RlLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KAotCQkJCQlvZmZzZXQpOwotCQkJaWYgKChmbGF0Tm9kZS5nZXRTdGFydE9mZnNldCgpIDw9IGRvY3VtZW50UG9zaXRpb24pCi0JCQkJCSYmIChmbGF0Tm9kZS5nZXRFbmRPZmZzZXQoKSA+PSBkb2N1bWVudFBvc2l0aW9uKSkgewotCQkJCWlmICgob2Zmc2V0ID09IGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KCkpCi0JCQkJCQkmJiAoZmxhdE5vZGUuZ2V0UHJldmlvdXMoKSAhPSBudWxsKQotCQkJCQkJJiYgKCgoZmxhdE5vZGUKLQkJCQkJCQkJLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGRvY3VtZW50UG9zaXRpb24pICE9IG51bGwpICYmIChmbGF0Tm9kZQotCQkJCQkJCQkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZG9jdW1lbnRQb3NpdGlvbikKLQkJCQkJCQkJLmdldFR5cGUoKSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UKSkKLQkJCQkJCQkJfHwgKGZsYXROb2RlLmdldFByZXZpb3VzKCkuZ2V0TGFzdFJlZ2lvbigpCi0JCQkJCQkJCQkJLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTikgfHwgKGZsYXROb2RlCi0JCQkJCQkJCS5nZXRQcmV2aW91cygpLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOKSkpIHsKLQkJCQkJcmVnaW9uID0gZmxhdE5vZGUuZ2V0UHJldmlvdXMoKS5nZXRMYXN0UmVnaW9uKCk7Ci0JCQkJfSBlbHNlIGlmIChmbGF0Tm9kZS5nZXRFbmRPZmZzZXQoKSA9PSBkb2N1bWVudFBvc2l0aW9uKSB7Ci0JCQkJCXJlZ2lvbiA9IGZsYXROb2RlLmdldExhc3RSZWdpb24oKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZWdpb24gPSBmbGF0Tm9kZS5nZXRGaXJzdFJlZ2lvbigpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJcmVnaW9uID0gZmxhdE5vZGUuZ2V0TGFzdFJlZ2lvbigpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlZ2lvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVRleHRSZWdpb24gZ2V0Q29tcGxldGlvblJlZ2lvbihpbnQgb2Zmc2V0LAotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBzZFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbikgPT0gb2Zmc2V0KSB7Ci0JCQkvLyBUaGUgb2Zmc2V0IGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJlZ2lvbgotCQkJaWYgKChzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChyZWdpb24pID09IHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpCi0JCQkJCSYmIChzZFJlZ2lvbi5nZXRQcmV2aW91cygpICE9IG51bGwpCi0JCQkJCSYmICghc2RSZWdpb24uZ2V0UHJldmlvdXMoKS5pc0VuZGVkKCkpKSB7Ci0JCQkJcmVnaW9uID0gc2RSZWdpb24uZ2V0UHJldmlvdXMoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgKLQkJCQkJCW9mZnNldCAtIDEpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBJcyB0aGVyZSBubyBzZXBhcmF0aW5nIHdoaXRlc3BhY2UgZnJvbSB0aGUgcHJldmlvdXMgcmVnaW9uPwotCQkJCS8vIElmIG5vdCwKLQkJCQkvLyB0aGVuIHRoYXQgcmVnaW9uIGlzIHRoZSBpbXBvcnRhbnQgb25lCi0JCQkJSVRleHRSZWdpb24gcHJldmlvdXNSZWdpb24gPSBzZFJlZ2lvbgotCQkJCQkJLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCAtIDEpOwotCQkJCWlmICgocHJldmlvdXNSZWdpb24gIT0gbnVsbCkKLQkJCQkJCSYmIChwcmV2aW91c1JlZ2lvbiAhPSByZWdpb24pCi0JCQkJCQkmJiAocHJldmlvdXNSZWdpb24uZ2V0VGV4dExlbmd0aCgpID09IHByZXZpb3VzUmVnaW9uCi0JCQkJCQkJCS5nZXRMZW5ndGgoKSkpIHsKLQkJCQkJcmVnaW9uID0gcHJldmlvdXNSZWdpb247Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJLy8gVGhlIG9mZnNldCBpcyBOT1QgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVnaW9uCi0JCQlpZiAob2Zmc2V0ID4gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQocmVnaW9uKQotCQkJCQkrIHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkpIHsKLQkJCQkvLyBJcyB0aGUgb2Zmc2V0IHdpdGhpbiB0aGUgd2hpdGVzcGFjZSBhZnRlciB0aGUgdGV4dCBpbiB0aGlzCi0JCQkJLy8gcmVnaW9uPwotCQkJCS8vIElmIHNvLCB1c2UgdGhlIG5leHQgcmVnaW9uCi0JCQkJSVRleHRSZWdpb24gbmV4dFJlZ2lvbiA9IHNkUmVnaW9uCi0JCQkJCQkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoc2RSZWdpb24KLQkJCQkJCQkJLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbikKLQkJCQkJCQkJKyByZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCWlmIChuZXh0UmVnaW9uICE9IG51bGwpIHsKLQkJCQkJcmVnaW9uID0gbmV4dFJlZ2lvbjsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vIElzIHRoZSBvZmZzZXQgd2l0aGluIHRoZSBpbXBvcnRhbnQgdGV4dCBmb3IgdGhpcyByZWdpb24/Ci0JCQkJLy8gSWYgc28sIHRoZW4gd2UndmUgYWxyZWFkeSBnb3QgdGhlIHJpZ2h0IG9uZS4KLQkJCX0KLQkJfQotCi0JCS8vIHZhbGlkIFdISVRFX1NQQUNFIHJlZ2lvbiBoYW5kbGVyICgjMTc5OTI0KQotCQlpZiAoKHJlZ2lvbiAhPSBudWxsKQotCQkJCSYmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuV0hJVEVfU1BBQ0UpKSB7Ci0JCQlJVGV4dFJlZ2lvbiBwcmV2aW91c1JlZ2lvbiA9IHNkUmVnaW9uCi0JCQkJCS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChyZWdpb24pIC0gMSk7Ci0JCQlpZiAocHJldmlvdXNSZWdpb24gIT0gbnVsbCkgewotCQkJCXJlZ2lvbiA9IHByZXZpb3VzUmVnaW9uOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlZ2lvbjsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRNYXRjaFN0cmluZyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudCwKLQkJCUlUZXh0UmVnaW9uIGFSZWdpb24sIGludCBvZmZzZXQpIHsKLQkJU3RyaW5nIG1hdGNoU3RyaW5nID0gIiI7Ci0JCQotCQlpZiAoaXNOb3RNYXRjaFN0cmluZ1JlZ2lvbihwYXJlbnQsIGFSZWdpb24sIG9mZnNldCkpIHsKLQkJCXJldHVybiBtYXRjaFN0cmluZzsgCi0JCX0KLQotCQlpZiAoaGFzTWF0Y2hTdHJpbmcocGFyZW50LCBhUmVnaW9uLCBvZmZzZXQpKSB7Ci0JCQltYXRjaFN0cmluZyA9IGV4dHJhY3RNYXRjaFN0cmluZyhwYXJlbnQsIGFSZWdpb24sIG9mZnNldCk7Ci0JCX0KLQkJcmV0dXJuIG1hdGNoU3RyaW5nOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc05vdE1hdGNoU3RyaW5nUmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBJVGV4dFJlZ2lvbiBhUmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCWlmIChhUmVnaW9uID09IG51bGwgfHwgcGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJCi0JCVN0cmluZyByZWdpb25UeXBlID0gYVJlZ2lvbi5nZXRUeXBlKCk7Ci0JCWludCB0b3RhbFJlZ2lvbk9mZnNldCA9IHBhcmVudC5nZXRTdGFydE9mZnNldChhUmVnaW9uKQotCQkJCSsgYVJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JCXJldHVybiAoaXNDbG9zZVJlZ2lvbihhUmVnaW9uKQotCQkJCXx8IGhhc05vTWF0Y2hTdHJpbmcob2Zmc2V0LCByZWdpb25UeXBlLCB0b3RhbFJlZ2lvbk9mZnNldCkpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0Nsb3NlUmVnaW9uKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCXJldHVybiAoKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfQ0xPU0UpCi0JCQkJfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKQotCQkJCXx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkKLQkJCQl8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9DTE9TRSkKLQkJCQl8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX0NMT1NFKQotCQkJCXx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0FUVExJU1RfREVDTF9DTE9TRSkKLQkJCQl8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTEVNRU5UX0RFQ0xfQ0xPU0UpCi0JCQkJfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9ERUNMQVJBVElPTl9DTE9TRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfREVDTEFSQVRJT05fQ0xPU0UpKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaGFzTWF0Y2hTdHJpbmcoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsCi0JCQlJVGV4dFJlZ2lvbiBhUmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiAocGFyZW50LmdldFRleHQoYVJlZ2lvbikubGVuZ3RoKCkgPiAwKQotCQkJCSYmIChwYXJlbnQuZ2V0U3RhcnRPZmZzZXQoYVJlZ2lvbikgPCBvZmZzZXQpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBoYXNOb01hdGNoU3RyaW5nKGludCBvZmZzZXQsIFN0cmluZyByZWdpb25UeXBlLAotCQkJaW50IHRvdGFsUmVnaW9uT2Zmc2V0KSB7Ci0JCXJldHVybiByZWdpb25UeXBlLmVxdWFscyhET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UKQotCQkJCXx8IHJlZ2lvblR5cGUuZXF1YWxzKERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKQotCQkJCXx8IHJlZ2lvblR5cGUuZXF1YWxzKERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKQotCQkJCXx8IG9mZnNldCA+IHRvdGFsUmVnaW9uT2Zmc2V0OwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGV4dHJhY3RNYXRjaFN0cmluZyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudCwKLQkJCUlUZXh0UmVnaW9uIGFSZWdpb24sIGludCBvZmZzZXQpIHsKLQkJU3RyaW5nIG1hdGNoU3RyaW5nOwotCQltYXRjaFN0cmluZyA9IHBhcmVudC5nZXRUZXh0KGFSZWdpb24pLnN1YnN0cmluZygwLAotCQkJCW9mZnNldCAtIHBhcmVudC5nZXRTdGFydE9mZnNldChhUmVnaW9uKSk7Ci0JCWlmIChtYXRjaFN0cmluZy5zdGFydHNXaXRoKCJcIiIpKSB7Ci0JCQltYXRjaFN0cmluZyA9IG1hdGNoU3RyaW5nLnN1YnN0cmluZygxKTsKLQkJfQotCQlyZXR1cm4gbWF0Y2hTdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yI2NvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24ob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgSUNvbnRleHRJbmZvcm1hdGlvbltdIGNvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24oSVRleHRWaWV3ZXIgdmlld2VyLAotCQkJaW50IG9mZnNldCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXJzIHdoaWNoIHdoZW4gZW50ZXJlZCBieSB0aGUgdXNlciBzaG91bGQKLQkgKiBhdXRvbWF0aWNhbGx5IHRyaWdnZXIgdGhlIHByZXNlbnRhdGlvbiBvZiBwb3NzaWJsZSBjb21wbGV0aW9ucy4KLQkgKiAKLQkgKiB0aGUgYXV0byBhY3RpdmF0aW9uIGNoYXJhY3RlcnMgZm9yIGNvbXBsZXRpb24gcHJvcG9zYWwgb3IKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBhdXRvIGFjdGl2YXRpb24gaXMgZGVzaXJlZAotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgYWN0aXZhdGlvbiBjaGFyYWN0ZXJzCi0JICovCi0JcHVibGljIGNoYXJbXSBnZXRDb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKSB7Ci0JCWNoYXJbXSBjb21wbGV0aW9uUHJvcG9zYWxzID0geyAnIicsICdcJycsICc6JywgJ1snLCAneycsICc8JyB9OwotCi0JCXJldHVybiBjb21wbGV0aW9uUHJvcG9zYWxzOwotCX0KLQotCS8qKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvciNnZXRDb250ZXh0SW5mb3JtYXRpb25BdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKQotCSAqLwotCXB1YmxpYyBjaGFyW10gZ2V0Q29udGV4dEluZm9ybWF0aW9uQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IjZ2V0Q29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKCkKLQkgKi8KLQlwdWJsaWMgSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciBnZXRDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvciNnZXRFcnJvck1lc3NhZ2UoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotCQlyZXR1cm4gZXJyb3JNZXNzYWdlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGVycm9yIG1lc3NhZ2UgZm9yIHdoeSBjb250ZW50IGFzc2lzdGFuY2UgZGlkbid0IGNvbXBsZXRlLgotCSAqIAotCSAqIEBwYXJhbSBlcnJvck1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFcnJvck1lc3NhZ2UoU3RyaW5nIGVycm9yTWVzc2FnZSkgewotCQl0aGlzLmVycm9yTWVzc2FnZSA9IGVycm9yTWVzc2FnZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L1hTTENvbnRlbnRBc3Npc3RSZXF1ZXN0RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvWFNMQ29udGVudEFzc2lzdFJlcXVlc3RGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlNjc3ZmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvWFNMQ29udGVudEFzc2lzdFJlcXVlc3RGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqQ29weXJpZ2h0IChjKSAyMDA4IFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCBhbmQgb3RoZXJzLgotICpBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKmFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICp3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICpodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqQ29udHJpYnV0b3JzOgotICogICAgRGF2aWQgQ2FydmVyIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5ocmVmLkhyZWZDb250ZW50QXNzaXN0UmVxdWVzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogQSBGYWN0b3J5IHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBDb250ZW50IEFzc2lzdCBSZXF1ZXN0IGNsYXNzIGlzIG5lZWRlZCBhbmQKLSAqIHJldHVybnMgdGhlIGFwcHJvcHJpYXRlIGNsYXNzLgotICogCi0gKiBAYXV0aG9yIERhdmlkIENhcnZlcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgWFNMQ29udGVudEFzc2lzdFJlcXVlc3RGYWN0b3J5IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9TRUxFQ1QgPSAic2VsZWN0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1RFU1QgPSAidGVzdCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9NQVRDSCA9ICJtYXRjaCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9FWENMVURFX1JFU1VMVF9QUkVGSVhFUyA9ICJleGNsdWRlLXJlc3VsdC1wcmVmaXhlcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9NT0RFID0gIm1vZGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fVEVNUExBVEUgPSAidGVtcGxhdGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fQVBQTFlURU1QTEFURVMgPSAiYXBwbHktdGVtcGxhdGVzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0FQUExZX0lNUE9SVFMgPSAiYXBwbHktaW1wb3J0cyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9IUkVGID0gImhyZWYiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fQ0FMTFRFTVBMQVRFID0gImNhbGwtdGVtcGxhdGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgSVRleHRWaWV3ZXIgdGV4dFZpZXdlcjsKLQlwcml2YXRlIGludCBkb2N1bWVudFBvc2l0aW9uOwotCXByaXZhdGUgSURPTU5vZGUgeG1sTm9kZTsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb247Ci0JcHJpdmF0ZSBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uOwotCXByaXZhdGUgU3RyaW5nIG1hdGNoU3RyaW5nOwotCQotCi0JLyoqCi0JICogQHBhcmFtIHRleHRWaWV3ZXIKLQkgKiBAcGFyYW0gZG9jdW1lbnRQb3NpdGlvbgotCSAqIEBwYXJhbSB4bWxOb2RlCi0JICogQHBhcmFtIHNkUmVnaW9uCi0JICogQHBhcmFtIGNvbXBsZXRpb25SZWdpb24KLQkgKiBAcGFyYW0gbWF0Y2hTdHJpbmcKLQkgKi8KLQlwdWJsaWMgWFNMQ29udGVudEFzc2lzdFJlcXVlc3RGYWN0b3J5KElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIGludCBkb2N1bWVudFBvc2l0aW9uLCBJRE9NTm9kZSB4bWxOb2RlLAotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiwgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwKLQkJCVN0cmluZyBtYXRjaFN0cmluZykgewotCQl0aGlzLnRleHRWaWV3ZXIgPSB0ZXh0Vmlld2VyOwotCQl0aGlzLmRvY3VtZW50UG9zaXRpb24gPSBkb2N1bWVudFBvc2l0aW9uOwotCQl0aGlzLnhtbE5vZGUgPSB4bWxOb2RlOwotCQl0aGlzLnNkUmVnaW9uID0gc2RSZWdpb247Ci0JCXRoaXMuY29tcGxldGlvblJlZ2lvbiA9IGNvbXBsZXRpb25SZWdpb247Ci0JCXRoaXMubWF0Y2hTdHJpbmcgPSBtYXRjaFN0cmluZzsKLQl9Ci0JLyoqCi0JICogR2V0IHRoZSBhcHByb3ByaWF0ZSBjb250ZW50IGFzc2lzdCByZXF1ZXN0IGNsYXNzIGZvciB0aGUgWFNMIHJlcXVlc3QuCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb3Bvc2FsUmVxdWVzdCBnZXRDb250ZW50QXNzaXN0UmVxdWVzdCgpIHsKLQkJTmFtZWROb2RlTWFwIG5vZGVNYXAgPSB4bWxOb2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJSURPTUVsZW1lbnQgZWxlbWVudCA9IChJRE9NRWxlbWVudCkgeG1sTm9kZTsKLQkJSUNvbnRlbnRBc3Npc3RQcm9wb3NhbFJlcXVlc3QgcHJvcG9zYWwgPSBjb21tb25BdHRyaWJ1dGVQcm9wb3NhbHMobm9kZU1hcCk7Ci0JCQotCQlpZiAocHJvcG9zYWwgaW5zdGFuY2VvZiBOdWxsQ29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJCWlmIChpc0VsZW1lbnRQcm9wb3NhbChlbGVtZW50KSkgewotCQkJCXByb3Bvc2FsID0gZ2V0RWxlbWVudFByb3Bvc2Fscyhub2RlTWFwLCBlbGVtZW50KTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBwcm9wb3NhbDsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGlzRWxlbWVudFByb3Bvc2FsKElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIGxvY2FsTmFtZSA9IGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCk7Ci0JCXJldHVybiBsb2NhbE5hbWUuZXF1YWxzKEVMRU1fVEVNUExBVEUpIHx8Ci0JCSAgICAgICBsb2NhbE5hbWUuZXF1YWxzKEVMRU1fQVBQTFlURU1QTEFURVMpIHx8Ci0JCSAgICAgICBsb2NhbE5hbWUuZXF1YWxzKEVMRU1fQ0FMTFRFTVBMQVRFKTsKLQl9Ci0JCi0KLQlwcml2YXRlIElDb250ZW50QXNzaXN0UHJvcG9zYWxSZXF1ZXN0IGdldEVsZW1lbnRQcm9wb3NhbHMoTmFtZWROb2RlTWFwIG5vZGVNYXAsIElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKEVMRU1fVEVNUExBVEUpKSB7Ci0JCQlyZXR1cm4gZ2V0VGVtcGxhdGVQcm9wb3NhbHMobm9kZU1hcCk7Ci0JCX0KLQotCQlpZiAoZWxlbWVudC5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoRUxFTV9BUFBMWVRFTVBMQVRFUykKLQkJCQl8fCBlbGVtZW50LmdldExvY2FsTmFtZSgpLmVxdWFscyhFTEVNX0FQUExZX0lNUE9SVFMpKSB7Ci0JCQlpZiAoaGFzQXR0cmlidXRlQXRUZXh0UmVnaW9uKEFUVFJfTU9ERSwgbm9kZU1hcCwgY29tcGxldGlvblJlZ2lvbikpIHsKLQkJCQlyZXR1cm4gbmV3IFRlbXBsYXRlTW9kZUF0dHJpYnV0ZUNvbnRlbnRBc3Npc3QoeG1sTm9kZSwKLQkJCQkJCXNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLAotCQkJCQkJbWF0Y2hTdHJpbmcsIHRleHRWaWV3ZXIpOwotCQkJfQotCi0JCX0KLQotCQlpZiAoZWxlbWVudC5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoRUxFTV9DQUxMVEVNUExBVEUpKSB7Ci0JCQlpZiAoaGFzQXR0cmlidXRlQXRUZXh0UmVnaW9uKEFUVFJfTkFNRSwgbm9kZU1hcCwgY29tcGxldGlvblJlZ2lvbikpIHsKLQkJCQlyZXR1cm4gbmV3IENhbGxUZW1wbGF0ZUNvbnRlbnRBc3Npc3RSZXF1ZXN0KHhtbE5vZGUsIHNkUmVnaW9uLAotCQkJCQkJY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgbWF0Y2hTdHJpbmcsCi0JCQkJCQl0ZXh0Vmlld2VyKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG5ldyBOdWxsQ29udGVudEFzc2lzdFJlcXVlc3QoeG1sTm9kZSwgc2RSZWdpb24sCi0JCQkJY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgbWF0Y2hTdHJpbmcsIHRleHRWaWV3ZXIpOwkJCi0JCQotCX0KLQkKLQlwcml2YXRlIElDb250ZW50QXNzaXN0UHJvcG9zYWxSZXF1ZXN0IGdldFRlbXBsYXRlUHJvcG9zYWxzKE5hbWVkTm9kZU1hcCBub2RlTWFwKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVBdFRleHRSZWdpb24oQVRUUl9NT0RFLCBub2RlTWFwLCBjb21wbGV0aW9uUmVnaW9uKSkgewotCQkJcmV0dXJuIG5ldyBUZW1wbGF0ZU1vZGVBdHRyaWJ1dGVDb250ZW50QXNzaXN0KHhtbE5vZGUsCi0JCQkJCXNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLAotCQkJCQltYXRjaFN0cmluZywgdGV4dFZpZXdlcik7Ci0JCX0KLQkJCi0JCWlmIChoYXNBdHRyaWJ1dGVBdFRleHRSZWdpb24oQVRUUl9OQU1FLCBub2RlTWFwLCBjb21wbGV0aW9uUmVnaW9uKSkgewotCQkJcmV0dXJuIG5ldyBUZW1wbGF0ZU5hbWVBdHRyaWJ1dGVDb250ZW50QXNzaXN0KCB4bWxOb2RlLAotCQkJCQlzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwKLQkJCQkJbWF0Y2hTdHJpbmcsIHRleHRWaWV3ZXIpOyAgICAgICAgCi0JCX0KLQkJCi0JCXJldHVybiBuZXcgTnVsbENvbnRlbnRBc3Npc3RSZXF1ZXN0KHhtbE5vZGUsIHNkUmVnaW9uLAotCQkJCWNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24sIDAsIG1hdGNoU3RyaW5nLCB0ZXh0Vmlld2VyKTsJCQotCQkKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29udGVudEFzc2lzdFByb3Bvc2FsUmVxdWVzdCBjb21tb25BdHRyaWJ1dGVQcm9wb3NhbHMoCi0JCQlOYW1lZE5vZGVNYXAgbm9kZU1hcCkgewotCQlpZiAoaGFzQXR0cmlidXRlQXRUZXh0UmVnaW9uKEFUVFJfU0VMRUNULCBub2RlTWFwLAotCQkJCWNvbXBsZXRpb25SZWdpb24pKSB7Ci0JCQlyZXR1cm4gbmV3IFNlbGVjdEF0dHJpYnV0ZUNvbnRlbnRBc3Npc3QoeG1sTm9kZSwgc2RSZWdpb24sCi0JCQkJCWNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24sIDAsIG1hdGNoU3RyaW5nLAotCQkJCQl0ZXh0Vmlld2VyKTsKLQkJfQotCi0JCWlmIChoYXNBdHRyaWJ1dGVBdFRleHRSZWdpb24oQVRUUl9NQVRDSCwgbm9kZU1hcCwgY29tcGxldGlvblJlZ2lvbikpIHsKLQkJCXJldHVybiBuZXcgU2VsZWN0QXR0cmlidXRlQ29udGVudEFzc2lzdCh4bWxOb2RlLCBzZFJlZ2lvbiwKLQkJCQkJY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgbWF0Y2hTdHJpbmcsCi0JCQkJCXRleHRWaWV3ZXIpOwotCQl9Ci0KLQkJaWYgKGhhc0F0dHJpYnV0ZUF0VGV4dFJlZ2lvbihBVFRSX1RFU1QsIG5vZGVNYXAsIGNvbXBsZXRpb25SZWdpb24pKSB7Ci0JCQlyZXR1cm4gbmV3IFRlc3RBdHRyaWJ1dGVDb250ZW50QXNzaXN0KHhtbE5vZGUsIHNkUmVnaW9uLAotCQkJCQljb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLCBtYXRjaFN0cmluZywKLQkJCQkJdGV4dFZpZXdlcik7Ci0JCX0KLQotCQlpZiAoaGFzQXR0cmlidXRlQXRUZXh0UmVnaW9uKEFUVFJfRVhDTFVERV9SRVNVTFRfUFJFRklYRVMsCi0JCQkJbm9kZU1hcCwgY29tcGxldGlvblJlZ2lvbikpIHsKLQkJCXJldHVybiBuZXcgRXhjbHVkZVJlc3VsdFByZWZpeGVzQ29udGVudEFzc2lzdCh4bWxOb2RlLCBzZFJlZ2lvbiwKLQkJCQkJY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgbWF0Y2hTdHJpbmcsCi0JCQkJCXRleHRWaWV3ZXIpOwotCQl9Ci0KLQkJaWYgKGhhc0F0dHJpYnV0ZUF0VGV4dFJlZ2lvbihBVFRSX0hSRUYsIG5vZGVNYXAsIGNvbXBsZXRpb25SZWdpb24pKSB7Ci0JCQlyZXR1cm4gbmV3IEhyZWZDb250ZW50QXNzaXN0UmVxdWVzdCh4bWxOb2RlLCBzZFJlZ2lvbiwKLQkJCQkJY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgbWF0Y2hTdHJpbmcsCi0JCQkJCXRleHRWaWV3ZXIpOwotCQl9Ci0KLQotCQlyZXR1cm4gbmV3IE51bGxDb250ZW50QXNzaXN0UmVxdWVzdCh4bWxOb2RlLCBzZFJlZ2lvbiwKLQkJCQljb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLCBtYXRjaFN0cmluZywgdGV4dFZpZXdlcik7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzQXR0cmlidXRlQXRUZXh0UmVnaW9uKFN0cmluZyBhdHRyTmFtZSwKLQkJCU5hbWVkTm9kZU1hcCBub2RlTWFwLCBJVGV4dFJlZ2lvbiBhUmVnaW9uKSB7Ci0JCUlET01BdHRyIGF0dHJOb2RlID0gKElET01BdHRyKSBub2RlTWFwLmdldE5hbWVkSXRlbShhdHRyTmFtZSk7Ci0JCXJldHVybiBhdHRyTm9kZSAhPSBudWxsICYmIGF0dHJOb2RlLmdldFZhbHVlUmVnaW9uKCkgIT0gbnVsbAotCQkJCSYmIGF0dHJOb2RlLmdldFZhbHVlUmVnaW9uKCkuZ2V0U3RhcnQoKSA9PSBhUmVnaW9uLmdldFN0YXJ0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvWFNMRWxlbWVudENvbnRlbnRBc3Npc3RSZXF1ZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9YU0xFbGVtZW50Q29udGVudEFzc2lzdFJlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE1N2UyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9YU0xFbGVtZW50Q29udGVudEFzc2lzdFJlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICpDb3B5cmlnaHQgKGMpIDIwMDggU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsIGFuZCBvdGhlcnMuCi0gKkFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKndoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICpDb250cmlidXRvcnM6Ci0gKiAgICBEYXZpZCBDYXJ2ZXIgKFNUQVIpIC0gYnVnIDI0NDk3OCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZyAyNjM4NDMgLSBGaXggbnVsbCBwb2ludGVyIGV4Y2VwdGlvbiBvbiByZWdpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuY29udGVudG1vZGVsLlhTTENvbnRlbnRNb2RlbEdlbmVyYXRvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotIAotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgY29udGVudCBhc3Npc3RhbmNlIHByb3Bvc2FscyBvdXRzaWRlIG9mIHRoZSBYU0wgbmFtZXNwYWNlLiAgTm9ybWFsCi0gKiBYTUwgZWRpdG9yIGNvbnRlbnQgYXNzaXN0YW5jZSBvbmx5IHByb3ZpZGVzIHByb3Bvc2FscyBmb3IgaXRlbXMgd2l0aGluIHRoZSBzYW1lIG5hbWVzcGFjZQotICogb3IgaWYgYW4gZWxlbWVudCBoYXMgY2hpbGRyZW4gZWxlbWVudHMuICAgVGhpcyBjbGFzcyBleHRlbmRzIHRoaXMgZnVuY3Rpb25hbGl0eSBieSBjaGVja2luZwotICogZm9yIHRoZSBmaXJzdCBYU0wgYW5jZXN0b3IgYW5kIHVzZXMgdGhhdCB0byBkZXRlcm1pbmUgd2hhdCBwcm9wb3NhbHMgc2hvdWxkIGJlCi0gKiBwcm92aWRlZCBpbiB0aGUgd2F5IG9mIHhzbCBlbGVtZW50cy4KLSAqIAotICogQGF1dGhvciBEYXZpZCBDYXJ2ZXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFhTTEVsZW1lbnRDb250ZW50QXNzaXN0UmVxdWVzdCBleHRlbmRzCi0JCUFic3RyYWN0WE1MRWxlbWVudENvbnRlbnRBc3Npc3RSZXF1ZXN0IHsKLQotCS8qKgotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBkb2N1bWVudFJlZ2lvbgotCSAqIEBwYXJhbSBjb21wbGV0aW9uUmVnaW9uCi0JICogQHBhcmFtIGJlZ2luCi0JICogQHBhcmFtIGxlbmd0aAotCSAqIEBwYXJhbSBmaWx0ZXIKLQkgKiBAcGFyYW0gdGV4dFZpZXdlcgotCSAqLwotCXB1YmxpYyBYU0xFbGVtZW50Q29udGVudEFzc2lzdFJlcXVlc3QoTm9kZSBub2RlLAotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiwKLQkJCUlUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIGludCBiZWdpbiwgaW50IGxlbmd0aCwgU3RyaW5nIGZpbHRlciwKLQkJCUlUZXh0Vmlld2VyIHRleHRWaWV3ZXIpIHsKLQkJc3VwZXIobm9kZSwgZG9jdW1lbnRSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGJlZ2luLCBsZW5ndGgsCi0JCQkJZmlsdGVyLCB0ZXh0Vmlld2VyKTsKLQkJY29udGVudE1vZGVsID0gbmV3IFhTTENvbnRlbnRNb2RlbEdlbmVyYXRvcigpOwotCX0KLQotCi0JLyoqCi0JICogQ2FsY3VsYXRlIHByb3Bvc2FscyBmb3Igb3BlbiBjb250ZW50IHJlZ2lvbnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29tcHV0ZVRhZ09wZW5Qcm9wb3NhbHMoKSB7Ci0KLQkJaWYgKHJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbiA9PSBkb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChyZWdpb24pKSB7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJLy8gYXQgdGhlIHN0YXJ0IG9mIGFuIGV4aXN0aW5nIHRhZywgcmlnaHQgYmVmb3JlIHRoZSAnPCcKLQkJCQljb21wdXRlVGFnTmFtZVByb3Bvc2FscygpOwotCQkJfQotCQl9IGVsc2UgewotCQkJLy8gd2l0aGluIHRoZSB3aGl0ZSBzcGFjZQotCQkJSVRleHRSZWdpb24gbmFtZSA9IGdldE5hbWVSZWdpb24oKChJRE9NTm9kZSkgbm9kZSkKLQkJCQkJLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpOwotCQkJaWYgKChuYW1lICE9IG51bGwpCi0JCQkJCSYmICgoZG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQobmFtZSkgPD0gcmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKSAmJiAoZG9jdW1lbnRSZWdpb24KLQkJCQkJCQkuZ2V0RW5kT2Zmc2V0KG5hbWUpID49IHJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbikpKSB7Ci0JCQkJLy8gcmVwbGFjZSB0aGUgZXhpc3RpbmcgbmFtZQotCQkJCXJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbiA9IGRvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KG5hbWUpOwotCQkJCXJlcGxhY2VtZW50TGVuZ3RoID0gbmFtZS5nZXRUZXh0TGVuZ3RoKCk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIGluc2VydCBhIHZhbGlkIG5ldyBuYW1lLCBvciBwb3NzaWJseSBhbiBlbmQgdGFnCi0JCQkJLy8gYWRkRW5kVGFnUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJCQlzZXRSZXBsYWNlbWVudExlbmd0aCgwKTsKLQkJCX0KLQkJCWFkZFRhZ05hbWVQcm9wb3NhbHMoZ2V0RWxlbWVudFBvc2l0aW9uKG5vZGUpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByb3ZpZGVzIGEgbGlzdCBvZiBwb3NzaWJsZSBwcm9wb3NhbHMgZm9yIHRoZSBYU0wgRWxlbWVudHMgd2l0aGluIHRoZSBjdXJyZW50Ci0JICogc2NvcGUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFycmF5TGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPiBnZXRDb21wbGV0aW9uUHJvcG9zYWxzKCkgewotCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBuZXcgQXJyYXlMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+KCk7Ci0JCX0KLQkJCi0JCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSB7Ci0JCQljb21wdXRlVGFnT3BlblByb3Bvc2FscygpOwotCQl9IGVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHsKLQkJCWNvbXB1dGVUYWdOYW1lUHJvcG9zYWxzKCk7Ci0JCX0KLQkJcmV0dXJuIGdldEFsbENvbXBsZXRpb25Qcm9wb3NhbHMoKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogQ2FsY3VsYXRlcyB0aGUgcHJvcG9zYWxzIGZvciB0aGUgWE1MIFRhZyBOYW1lIFJlZ2lvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb21wdXRlVGFnTmFtZVByb3Bvc2FscygpIHsKLQkJLy8gY29tcGxldGluZyB0aGUgKmZpcnN0KiB0YWcgaW4gIjx0YWduYW1lMSB8PHRhZ25hbWUyIgotCQkKLQkJLy8gSWdub3JlIGF0dHJpYnV0ZXMKLQkJaWYgKGluQXR0cmlidXRlUmVnaW9uKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJYWRkVGFnTmFtZVByb3Bvc2Fscyh0aGlzLmdldEVsZW1lbnRQb3NpdGlvbihub2RlKSk7Ci0JCS8vIGFkZEVuZFRhZ05hbWVQcm9wb3NhbHMoKTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvY29udGVudG1vZGVsL1hTTENvbnRlbnRNb2RlbEdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvY29udGVudG1vZGVsL1hTTENvbnRlbnRNb2RlbEdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ZjNlNjNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L2NvbnRlbnRtb2RlbC9YU0xDb250ZW50TW9kZWxHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRGF2aWQgQ2FydmVyIChTVEFSKSAtIGJ1ZyAyNDQ5NzggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gYmFzZWQgb24KLSAqICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3NpdC5YTUxDb250ZW50TW9kZWxHZW5lcmF0b3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuY29udGVudG1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5BYnN0cmFjdENvbnRlbnRNb2RlbEdlbmVyYXRvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLS8qKgotICogVGhpcyBwcm92aWRlcyB0aGUgQ29udGVudE1vZGVsIGJhc2VkIG9mZiB0aGUgWFNMIHhtbCBzY2hlbWEgZ3JhbW1hcnMgYW5kIG90aGVyCi0gKiBncmFtbWFycyBwcm92aWRlZCBieSB0aGUgeG1sIGVkaXRvci4KLSAqIAotICogQHNpbmNlIDEuMQotICoKLSAqLwotcHVibGljIGNsYXNzIFhTTENvbnRlbnRNb2RlbEdlbmVyYXRvciBleHRlbmRzIEFic3RyYWN0Q29udGVudE1vZGVsR2VuZXJhdG9yIHsKLQotCi0JLyoqCi0JICogWFNMQ29udGVudE1vZGVsR2VuZXJhdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFhTTENvbnRlbnRNb2RlbEdlbmVyYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKiogCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkFic3RyYWN0Q29udGVudE1vZGVsR2VuZXJhdG9yI2dlbmVyYXRlQXR0cmlidXRlKG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiwgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcikKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBnZW5lcmF0ZUF0dHJpYnV0ZShDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsLCBTdHJpbmdCdWZmZXIgYnVmZmVyKSB7Ci0JCWlmICgoYXR0ckRlY2wgPT0gbnVsbCkgfHwgKGJ1ZmZlciA9PSBudWxsKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWludCB1c2FnZSA9IGF0dHJEZWNsLmdldFVzYWdlKCk7Ci0JCWlmICh1c2FnZSA9PSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJCWdlbmVyYXRlUmVxdWlyZWRBdHRyaWJ1dGUobnVsbCwgYXR0ckRlY2wsIGJ1ZmZlcik7IC8vIHRvZG8gcGFzcwotCQkJLy8gb3duZXJOb2RlIGFzCi0JCQkvLyAxc3QgcGFyYW0KLQkJfQotCQlyZXR1cm47Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVFbmRUYWcoU3RyaW5nIHRhZ05hbWUsIE5vZGUgcGFyZW50Tm9kZSwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wsIFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKLQkJaWYgKGVsZW1lbnREZWNsID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoZWxlbWVudERlY2wuZ2V0Q29udGVudFR5cGUoKSAhPSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWSkgewotCQkJYnVmZmVyLmFwcGVuZCgiPC8iICsgdGFnTmFtZSArICI+Iik7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm47Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG93bmVyTm9kZQotCSAqIEBwYXJhbSBhdHRyRGVjbAotCSAqIEBwYXJhbSBidWZmZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBnZW5lcmF0ZVJlcXVpcmVkQXR0cmlidXRlKE5vZGUgb3duZXJOb2RlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsLCBTdHJpbmdCdWZmZXIgYnVmZmVyKSB7Ci0JCWlmICgoYXR0ckRlY2wgPT0gbnVsbCkgfHwgKGJ1ZmZlciA9PSBudWxsKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gYXR0cmlidXRlIG5hbWUKLQkJU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBnZXRSZXF1aXJlZE5hbWUob3duZXJOb2RlLCBhdHRyRGVjbCk7Ci0JCUNNRGF0YVR5cGUgYXR0clR5cGUgPSBhdHRyRGVjbC5nZXRBdHRyVHlwZSgpOwotCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gbnVsbDsKLQkJLy8gPSBzaWduCi0JCWJ1ZmZlci5hcHBlbmQoYXR0cmlidXRlTmFtZSArICI9Iik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gYXR0cmlidXRlIHZhbHVlCi0JCWlmIChhdHRyVHlwZSAhPSBudWxsKSB7Ci0JCQkvLyBpbnNlcnQgYW55IHZhbHVlIHRoYXQgaXMgaW1wbGllZAotCQkJaWYgKChhdHRyVHlwZS5nZXRJbXBsaWVkVmFsdWVLaW5kKCkgIT0gQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX05PTkUpICYmIChhdHRyVHlwZS5nZXRJbXBsaWVkVmFsdWUoKSAhPSBudWxsKSkgewotCQkJCWRlZmF1bHRWYWx1ZSA9IGF0dHJUeXBlLmdldEltcGxpZWRWYWx1ZSgpOwotCQkJfQotCQkJLy8gb3RoZXJ3aXNlLCBpZiBhbiBlbnVtZXJhdGVkIGxpc3Qgb2YgdmFsdWVzIGV4aXN0cywgdXNlIHRoZQotCQkJLy8gZmlyc3QgdmFsdWUKLQkJCWVsc2UgaWYgKChhdHRyVHlwZS5nZXRFbnVtZXJhdGVkVmFsdWVzKCkgIT0gbnVsbCkgJiYgKGF0dHJUeXBlLmdldEVudW1lcmF0ZWRWYWx1ZXMoKS5sZW5ndGggPiAwKSkgewotCQkJCWRlZmF1bHRWYWx1ZSA9IGF0dHJUeXBlLmdldEVudW1lcmF0ZWRWYWx1ZXMoKVswXTsKLQkJCX0KLQkJfQotCQkKLQkJY2hhciBhdHRyUXVvdGUgPSAnXCInOwotCQkvLyBGb3VuZCBhIGRvdWJsZSBxdW90ZSwgd3JhcCB0aGUgYXR0cmlidXRlIGluIHNpbmdsZSBxdW90ZXMKLQkJaWYoZGVmYXVsdFZhbHVlICE9IG51bGwgJiYgZGVmYXVsdFZhbHVlLmluZGV4T2YoYXR0clF1b3RlKSA+PSAwKSB7Ci0JCQlhdHRyUXVvdGUgPSAnXCcnOwotCQl9Ci0JCQotCQlidWZmZXIuYXBwZW5kKGF0dHJRdW90ZSk7Ci0JCWJ1ZmZlci5hcHBlbmQoKChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgPyBkZWZhdWx0VmFsdWUgOiAiIikpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoYXR0clF1b3RlKTsKLQkJcmV0dXJuOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlU3RhcnRUYWcoU3RyaW5nIHRhZ05hbWUsIE5vZGUgcGFyZW50Tm9kZSwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wsIFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKLQkJaWYgKChlbGVtZW50RGVjbCA9PSBudWxsKSB8fCAoYnVmZmVyID09IG51bGwpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYnVmZmVyLmFwcGVuZCgiPCIgKyB0YWdOYW1lKTsvLyROT04tTkxTLTEkCi0JCWdlbmVyYXRlQXR0cmlidXRlcyhlbGVtZW50RGVjbCwgYnVmZmVyKTsKLQkJYnVmZmVyLmFwcGVuZChnZXRTdGFydFRhZ0Nsb3NlKHBhcmVudE5vZGUsIGVsZW1lbnREZWNsKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiogCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkFic3RyYWN0Q29udGVudE1vZGVsR2VuZXJhdG9yI2dldE1pbmltYWxTdGFydFRhZ0xlbmd0aChvcmcudzNjLmRvbS5Ob2RlLCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZ2V0TWluaW1hbFN0YXJ0VGFnTGVuZ3RoKE5vZGUgbm9kZSwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wpIHsKLQkJaWYgKGVsZW1lbnREZWNsID09IG51bGwpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWlmIChyZXF1aXJlc0F0dHJpYnV0ZXMoZWxlbWVudERlY2wpKSB7Ci0JCQlyZXR1cm4gZ2V0UmVxdWlyZWROYW1lKG5vZGUsIGVsZW1lbnREZWNsKS5sZW5ndGgoKSArIDI7IC8vIDwgKwotCQkJLy8gbmFtZSArCi0JCQkvLyBzcGFjZQotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIDEgKyBnZXRSZXF1aXJlZE5hbWUobm9kZSwgZWxlbWVudERlY2wpLmxlbmd0aCgpICsgZ2V0U3RhcnRUYWdDbG9zZShub2RlLCBlbGVtZW50RGVjbCkubGVuZ3RoKCk7IC8vIDwgKwotCQkJLy8gbmFtZQotCQkJLy8gKwotCQkJLy8gYXBwcm9wcmlhdGUKLQkJCS8vIGNsb3NlCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE90aGVyQ2xvc2UoTm9kZSBub3RBVGFnTm9kZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiogCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkFic3RyYWN0Q29udGVudE1vZGVsR2VuZXJhdG9yI2dldFN0YXJ0VGFnQ2xvc2Uob3JnLnczYy5kb20uTm9kZSwgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbikKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFN0YXJ0VGFnQ2xvc2UoTm9kZSBwYXJlbnROb2RlLCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCkgewotCQlTdHJpbmcgb3RoZXIgPSBnZXRPdGhlckNsb3NlKHBhcmVudE5vZGUpOwotCQlpZiAob3RoZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIG90aGVyOwotCQl9Ci0JCWlmIChlbGVtZW50RGVjbCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIj4iOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoZWxlbWVudERlY2wuZ2V0Q29udGVudFR5cGUoKSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWSkgewotCQkJcmV0dXJuICIvPiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gIj4iOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvaHJlZi9IcmVmQ29udGVudEFzc2lzdFJlcXVlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L2hyZWYvSHJlZkNvbnRlbnRBc3Npc3RSZXF1ZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZGZmYjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvaHJlZi9IcmVmQ29udGVudEFzc2lzdFJlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuaHJlZjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuWFNMQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLlhTTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5BYnN0cmFjdFhTTENvbnRlbnRBc3Npc3RSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwudXRpbC5YU0xQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLnV0aWwuWFNMUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogPHA+VGhpcyBwcm92aWRlcyBjb250ZW50IGFzc2lzdGFuY2UgcHJvcG9zYWxzIGZvciBocmVmIGF0dHJpYnV0ZXMgd2l0aCBhIG1vZGUgYXR0cmlidXRlLjwvcD4KLSAqIDxwPkNvbnRlbnQgYXNzaXN0YW5jZSBpcyByZXN0cmljdGVkIHRvIGZpbGVzIHdpdGggdGhlIFhTTCBjb250ZW50IHR5cGUgdGhhdCBhcmUgaW4gdGhlIHNhbWUgcHJvamVjdCBhcyB0aGUgZmlsZSBjdXJyZW50bHkgCi0gKiBiZWluZyBlZGl0ZWQuIFRoaXMgaXMgYmVjYXVzZSBwcm9qZWN0cyBpbiB0aGUgd29ya3NwYWNlIGNhbiBoYXZlIGNvbXBsZXRlbHkgZGlmZmVyZW50IHBoeXNpY2FsIGZpbGUgbG9jYXRpb25zLCBsZWFkaW5nIHRvIAotICogY29uZnVzaW9uIGluIHJlbGF0aXZlIGZpbGUgcGF0aHMgYWNyb3NzIHByb2plY3RzLiBTaW1pbGFybHksIG5vIGNvbnRlbnQgYXNzaXN0YW5jZSBpcyBnaXZlbiBmb3IgZmlsZXMgZXh0ZXJuYWwgdG8gdGhlIHdvcmtzcGFjZS4gCi0gKiBTdWNoIGZpbGVzIHNob3VsZCBiZSBhc3NpZ25lZCBhbiBhYnNvbHV0ZSAnZmlsZTovLy8nIFVSTC48L3A+Ci0gKiAKLSAqIEBhdXRob3IgRG91ZyBTYXRjaHdlbGwKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEhyZWZDb250ZW50QXNzaXN0UmVxdWVzdCBleHRlbmRzIEFic3RyYWN0WFNMQ29udGVudEFzc2lzdFJlcXVlc3QKLXsKLQlwcml2YXRlIExpc3Q8SVBhdGg+IHBhdGhMaXN0ID0gbmV3IEFycmF5TGlzdDxJUGF0aD4oKTsKLQotCXByaXZhdGUgZmluYWwgY2xhc3MgWFNMRmlsZVJlc291cmNlVmlzaXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZVZpc2l0b3IKLQl7Ci0JCXByaXZhdGUgZmluYWwgU3RyaW5nIHByZWNlZGluZ1RleHQ7Ci0JCXByaXZhdGUgZmluYWwgSUZpbGUgZWRpdG9yRmlsZTsKLQotCQlwcml2YXRlIFhTTEZpbGVSZXNvdXJjZVZpc2l0b3IoSUZpbGUgZWRpdG9yRmlsZSwgU3RyaW5nIHByZWNlZGluZ1RleHQpCi0JCXsKLQkJCXRoaXMucHJlY2VkaW5nVGV4dCA9IHByZWNlZGluZ1RleHQ7Ci0JCQl0aGlzLmVkaXRvckZpbGUgPSBlZGl0b3JGaWxlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCQl7Ci0JCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKQotCQkJewotCQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpcmVzb3VyY2U7Ci0JCQkJaWYgKFhTTENvcmUuaXNYU0xGaWxlKGZpbGUpICYmICFmaWxlLmVxdWFscyhlZGl0b3JGaWxlKSkKLQkJCQl7Ci0JCQkJCUlQYXRoIHBhdGggPSBnZXRSZWxhdGl2ZVBhdGgoZWRpdG9yRmlsZSwgZmlsZSk7Ci0JCQkJCWlmIChwYXRoLnRvU3RyaW5nKCkuc3RhcnRzV2l0aChwcmVjZWRpbmdUZXh0KSkKLQkJCQkJewotCQkJCQkJcGF0aExpc3QuYWRkKHBhdGgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgY3JlYXRpbmcgdGhlIEhyZWZDb250ZW50QXNzaXN0UmVxdWVzdCBjbGFzcy4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gZG9jdW1lbnRSZWdpb24KLQkgKiBAcGFyYW0gY29tcGxldGlvblJlZ2lvbgotCSAqIEBwYXJhbSBiZWdpbgotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiBAcGFyYW0gZmlsdGVyCi0JICogQHBhcmFtIHRleHRWaWV3ZXIKLQkgKi8KLQlwdWJsaWMgSHJlZkNvbnRlbnRBc3Npc3RSZXF1ZXN0KE5vZGUgbm9kZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiwgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgaW50IGJlZ2luLCBpbnQgbGVuZ3RoLCBTdHJpbmcgZmlsdGVyLCBJVGV4dFZpZXdlciB0ZXh0Vmlld2VyKQotCXsKLQkJc3VwZXIobm9kZSwgZG9jdW1lbnRSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGJlZ2luLCBsZW5ndGgsIGZpbHRlciwgdGV4dFZpZXdlcik7Ci0JfQotCi0JLyoqCi0JICogVGhlIG1haW4gbWV0aG9kIHRoYXQgcmV0dXJucyBhbiBhcnJheSBvZiBwcm9wb3NhbHMuIFJldHVybnMgcmVsYXRpdmUgcGF0aHMgdG8gZmlsZXMgaW4gdGhlIGN1cnJlbnQgcHJvamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIElDb21wbGV0aW9uUHJvcG9zYWxbXSAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0UmVxdWVzdCNnZXRDb21wbGV0aW9uUHJvcG9zYWxzKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQXJyYXlMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+IGdldENvbXBsZXRpb25Qcm9wb3NhbHMoKQotCXsKLQkJcGF0aExpc3QuY2xlYXIoKTsKLQkJcHJvcG9zYWxzLmNsZWFyKCk7Ci0JCQotCQl0cnkKLQkJewotCQkJU3RyaW5nIHRleHQgPSBnZXRUZXh0KCk7Ci0JCQlTdHJpbmcgcHJlY2VkaW5nVGV4dDsKLQkJCQotCQkJaW50IGxlbmd0aCA9IGdldEN1cnNvclBvc2l0aW9uKCktZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCWlmIChsZW5ndGggPiAwICYmIHRleHQubGVuZ3RoKCkgPiBsZW5ndGggKyAxKQotCQkJCXByZWNlZGluZ1RleHQgPSB0ZXh0LnN1YnN0cmluZygxLGxlbmd0aCk7Ci0JCQllbHNlCi0JCQkJcHJlY2VkaW5nVGV4dCA9ICIiOwotCQkJSUZpbGUgZWRpdG9yRmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShuZXcgUGF0aChnZXRMb2NhdGlvbigpKSk7Ci0JCQllZGl0b3JGaWxlLmdldFByb2plY3QoKS5hY2NlcHQobmV3IFhTTEZpbGVSZXNvdXJjZVZpc2l0b3IoZWRpdG9yRmlsZSxwcmVjZWRpbmdUZXh0KSk7Ci0KLQkJCUNvbGxlY3Rpb25zLnNvcnQocGF0aExpc3QsbmV3IFBhdGhDb21wYXJhdG9yKCkpOwotCQkJZm9yIChJUGF0aCBwYXRoIDogcGF0aExpc3QpCi0JCQl7Ci0JCQkJU3RyaW5nIHBhdGhTdHJpbmcgPSBwYXRoLnRvU3RyaW5nKCk7Ci0JCQkJQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCgKLQkJCQkJCXBhdGhTdHJpbmcsCi0JCQkJCQlnZXRTdGFydE9mZnNldCgpICsgMSwKLQkJCQkJCXRleHQubGVuZ3RoKCktMiwKLQkJCQkJCXBhdGhTdHJpbmcubGVuZ3RoKCksCi0JCQkJCQlYU0xQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhTTFBsdWdpbkltYWdlcy5JTUdfWFNMX0ZJTEUpLAotCQkJCQkJcGF0aFN0cmluZywKLQkJCQkJCW51bGwsIAotCQkJCQkJbnVsbCwgCi0JCQkJCQkwLAotCQkJCQkJdHJ1ZQotCQkJCQkpOwotCQkJCXByb3Bvc2Fscy5hZGQocHJvcG9zYWwpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JCXsKLQkJCVhTTFVJUGx1Z2luLmxvZyhlKTsKLQkJfQotCi0JCXJldHVybiBwcm9wb3NhbHM7Ci0JfQotCQotCS8qKgotCSAqIERvIG5vdCB3aXNoIHRvIHNvcnQgdGhlIHByb3Bvc2FscyAtIHRoZXkgYXJlIGFscmVhZHkgc29ydGVkCi0JICogCi0JICogQHJldHVybiB0aGUgc2FtZSBsaXN0LCBpbiB0aGUgc2FtZSBvcmRlcgotCSAqLwotCXByb3RlY3RlZCBMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+IHNvcnRQcm9wb3NhbHMoTGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPiBwcm9wb3NhbHNJbikgewotCQlyZXR1cm4gcHJvcG9zYWxzSW47Ci0JfQotCi0JcHJpdmF0ZSBJUGF0aCBnZXRSZWxhdGl2ZVBhdGgoSUZpbGUgcmVsYXRpdmVUbywgSUZpbGUgZmlsZSkKLQl7Ci0JCUlQYXRoIGZpbGVQYXRoID0gZmlsZS5nZXRGdWxsUGF0aCgpOwotCQlJUGF0aCByZWxhdGl2ZVRvUGF0aCA9IHJlbGF0aXZlVG8uZ2V0RnVsbFBhdGgoKTsKLQkJCi0JCUlQYXRoIHJlbFBhdGg7Ci0JCWlmIChmaWxlUGF0aC5zZWdtZW50Q291bnQoKSA+IHJlbGF0aXZlVG9QYXRoLnNlZ21lbnRDb3VudCgpKQotCQl7Ci0JCQlyZWxQYXRoID0gZmlsZVBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhmaWxlUGF0aC5tYXRjaGluZ0ZpcnN0U2VnbWVudHMocmVsYXRpdmVUb1BhdGgpKTsKLQkJfQotCQllbHNlIGlmIChmaWxlUGF0aC5zZWdtZW50Q291bnQoKSA8IHJlbGF0aXZlVG9QYXRoLnNlZ21lbnRDb3VudCgpKQotCQl7Ci0JCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlbGF0aXZlVG9QYXRoLnNlZ21lbnRDb3VudCgpIC0gZmlsZVBhdGguc2VnbWVudENvdW50KCk7IGkrKykKLQkJCXsKLQkJCQlzYi5hcHBlbmQoIi4uLyIpOwotCQkJfQotCQkJc2IuYXBwZW5kKGZpbGUuZ2V0TmFtZSgpKTsKLQkJCXJlbFBhdGggPSBuZXcgUGF0aChzYi50b1N0cmluZygpKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXJlbFBhdGggPSBuZXcgUGF0aChmaWxlLmdldE5hbWUoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlbFBhdGg7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvaHJlZi9QYXRoQ29tcGFyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvaHJlZi9QYXRoQ29tcGFyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzc0MDcwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L2hyZWYvUGF0aENvbXBhcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LmhyZWY7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLQotZmluYWwgY2xhc3MgUGF0aENvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yPElQYXRoPiwgU2VyaWFsaXphYmxlCi17Ci0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQ0MDExNzk1ODExOTMxMTEyODBMOwotCi0JcHVibGljIGludCBjb21wYXJlKElQYXRoIG8xLCBJUGF0aCBvMikKLQl7Ci0JCWludCBjb3VudENvbXAgPSBvMS5zZWdtZW50Q291bnQoKSAtIG8yLnNlZ21lbnRDb3VudCgpOwotCQlpZiAoY291bnRDb21wICE9IDApCi0JCQlyZXR1cm4gY291bnRDb21wOwotCQkKLQkJZm9yKGludCBpPTA7aTxvMS5zZWdtZW50Q291bnQoKTtpKyspCi0JCXsKLQkJCVN0cmluZyBzZWcxID0gbzEuc2VnbWVudChpKTsKLQkJCVN0cmluZyBzZWcyID0gbzIuc2VnbWVudChpKTsKLQkJCWlmICghc2VnMS5lcXVhbHMoc2VnMikpCi0JCQl7Ci0JCQkJaWYgKHNlZzEuZXF1YWxzKCIuLiIpKQotCQkJCQlyZXR1cm4gMTsKLQkJCQlpZiAoc2VnMi5lcXVhbHMoIi4uIikpCi0JCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG8xLnRvU3RyaW5nKCkuY29tcGFyZVRvKG8yLnRvU3RyaW5nKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvZG91YmxlY2xpY2svWFNMRG91YmxlQ2xpY2tTdHJhdGVneS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL2RvdWJsZWNsaWNrL1hTTERvdWJsZUNsaWNrU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzJkNWQ4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvZG91YmxlY2xpY2svWFNMRG91YmxlQ2xpY2tTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsIGFuZCBvdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERhdmlkIENhcnZlciAtIFNUQVIgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24sIGJhc2VkIG9uIGEgcGF0Y2gKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZWQgYnkgTmlrIE1hdHl1c2hldiBpbiBidWcgMTk1MjYyLgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwuZG91YmxlY2xpY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kb3VibGVjbGljay5YTUxEb3VibGVDbGlja1N0cmF0ZWd5OwotIAotCi0vKioKLSAqIFhTTERvdWJsZUNsaWNrU3RyYXRlZ3kgZXh0ZW5kcyB0aGUgWE1MRG91YmxlY2xpY2tTdHJhdGVneSB0byB0YWtlIGludG8KLSAqIGFjY291bnQgdGhvc2UgYXJlYXMgdGhhdCBtYXkgYmUgaW52b2x2ZWQgaW4gWFBhdGggRXhwcmVzc2lvbnMuCi0gKiAKLSAqIAotICogQGF1dGhvciBkY2FydmVyCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFhTTERvdWJsZUNsaWNrU3RyYXRlZ3kgZXh0ZW5kcyBYTUxEb3VibGVDbGlja1N0cmF0ZWd5IHsKLQlzdGF0aWMgZmluYWwgY2hhcltdIFhNTF9ERUxJTUlURVJTID0geyAnICcsICdcJycsICdcIicsICdbJywgJ10nLAotCQkJJ3wnLCAnKCcsICcpJywgJ3snLCAnfScsICc9JywgJyEnIH07Ci0Jc3RhdGljIGZpbmFsIGNoYXJbXSBYTUxfUEFSRU5USEVTSVMgPSB7ICdbJywgJ10nLCAnKCcsICcpJywgJ3snLAotCQkJJ30nIH07Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUG9pbnQgZ2V0V29yZChTdHJpbmcgc3RyaW5nLCBpbnQgY3Vyc29yKSB7Ci0JCWlmIChzdHJpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpbnQgd29yZFN0YXJ0ID0gMDsKLQkJaW50IHdvcmRFbmQgPSBzdHJpbmcubGVuZ3RoKCk7Ci0KLQkJd29yZFN0YXJ0ID0gc3RhcnRPZldvcmQoc3RyaW5nLCBjdXJzb3IsIHdvcmRTdGFydCk7Ci0JCXdvcmRFbmQgPSBlbmRPZldvcmQoc3RyaW5nLCBjdXJzb3IsIHdvcmRFbmQpOwotCQl3b3JkRW5kID0gY2hlY2tYUGF0aEV4cHJlc3Npb24oc3RyaW5nLCB3b3JkRW5kKTsKLQotCQlpZiAoKHdvcmRTdGFydCA9PSB3b3JkRW5kKSAmJiAhaXNRdW90ZWQoc3RyaW5nKSkgewotCQkJd29yZFN0YXJ0ID0gMDsKLQkJCXdvcmRFbmQgPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCX0KLQotCQlyZXR1cm4gbmV3IFBvaW50KHdvcmRTdGFydCwgd29yZEVuZCk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgY2hlY2tYUGF0aEV4cHJlc3Npb24oU3RyaW5nIHN0cmluZywgaW50IHdvcmRFbmQpIHsKLQkJaWYgKHdvcmRFbmQgPCBzdHJpbmcubGVuZ3RoKCkgLSAxKSB7Ci0JCQkvLyBjaGVjayBwYXJhbnRoZXNpcwotCQkJaW50W10gZmxhZ3MgPSBuZXcgaW50W1hNTF9QQVJFTlRIRVNJUy5sZW5ndGggLyAyXTsKLQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCWludCBwb3MgPSB3b3JkRW5kOwotCQkJZG8gewotCQkJCWNoYXIgY3VyID0gc3RyaW5nLmNoYXJBdChwb3MpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgWE1MX1BBUkVOVEhFU0lTLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChjdXIgPT0gWE1MX1BBUkVOVEhFU0lTW2ldKSB7Ci0JCQkJCQlmbGFnc1tpIC8gMl0gKz0gKGkgJSAyID09IDAgPyAxIDogLTEpOwotCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWJvb2xlYW4gc3RvcCA9IHRydWU7Ci0JCQkJYm9vbGVhbiB1bmJhbGFuY2VkID0gZmFsc2U7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbGFncy5sZW5ndGg7IGkrKykgewotCQkJCQlzdG9wID0gc3RvcCAmJiBmbGFnc1tpXSA9PSAwOwotCQkJCQl1bmJhbGFuY2VkIHw9IGZsYWdzW2ldIDwgMDsKLQkJCQl9Ci0KLQkJCQlpZiAoIXVuYmFsYW5jZWQpIHsKLQkJCQkJcG9zKys7Ci0JCQkJfQotCQkJCWlmIChzdG9wIHwgdW5iYWxhbmNlZCkgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9IHdoaWxlIChwb3MgPCBzdHJpbmcubGVuZ3RoKCkpOwotCQkJCi0JCQlpZiAoZm91bmQpIHsKLQkJCQl3b3JkRW5kID0gTWF0aC5taW4oc3RyaW5nLmxlbmd0aCgpIC0gMSwgcG9zKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gd29yZEVuZDsKLQl9Ci0KLQlwcml2YXRlIGludCBlbmRPZldvcmQoU3RyaW5nIHN0cmluZywgaW50IGN1cnNvciwgaW50IHdvcmRFbmQpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBYTUxfREVMSU1JVEVSUy5sZW5ndGg7IGkrKykgewotCQkJY2hhciBkZWxpbSA9IFhNTF9ERUxJTUlURVJTW2ldOwotCQkJaW50IGVuZCA9IHN0cmluZy5pbmRleE9mKGRlbGltLCBjdXJzb3IpOwotCQkJd29yZEVuZCA9IE1hdGgubWluKHdvcmRFbmQsIGVuZCA9PSAtMSA/IHN0cmluZy5sZW5ndGgoKSA6IGVuZCk7Ci0JCX0KLQotCQlpZiAod29yZEVuZCA9PSBzdHJpbmcubGVuZ3RoKCkpIHsKLQkJCXdvcmRFbmQgPSBjdXJzb3I7Ci0JCX0KLQkJcmV0dXJuIHdvcmRFbmQ7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBzdGFydE9mV29yZChTdHJpbmcgc3RyaW5nLCBpbnQgY3Vyc29yLCBpbnQgd29yZFN0YXJ0KSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgWE1MX0RFTElNSVRFUlMubGVuZ3RoOyBpKyspIHsKLQkJCWNoYXIgZGVsaW0gPSBYTUxfREVMSU1JVEVSU1tpXTsKLQkJCXdvcmRTdGFydCA9IE1hdGgubWF4KHdvcmRTdGFydCwgc3RyaW5nLmxhc3RJbmRleE9mKGRlbGltLAotCQkJCQljdXJzb3IgLSAxKSk7Ci0JCX0KLQotCQlpZiAod29yZFN0YXJ0ID09IC0xKSB7Ci0JCQl3b3JkU3RhcnQgPSBjdXJzb3I7Ci0JCX0gZWxzZSB7Ci0JCQl3b3JkU3RhcnQrKzsKLQkJfQotCQlyZXR1cm4gd29yZFN0YXJ0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL2VkaXRvci9PdmVycmlkZUluZGljYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL2VkaXRvci9PdmVycmlkZUluZGljYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2Q2ZDcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9lZGl0b3IvT3ZlcnJpZGVJbmRpY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Bbm5vdGF0aW9uOwotCi0vKioKLSAqIE92ZXJ3cml0ZSBhbmQgb3ZlcnJpZGUgaW5kaWNhdG9yIGFubm90YXRpb24uCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotY2xhc3MgT3ZlcnJpZGVJbmRpY2F0b3IgZXh0ZW5kcyBBbm5vdGF0aW9uCi17Ci0KLQkvL3ByaXZhdGUgU3RyaW5nIGZBc3ROb2RlS2V5OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBvdmVycmlkZSBhbm5vdGF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBpc092ZXJ3cml0ZUluZGljYXRvcgotCSAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBhbm5vdGF0aW9uIGlzIGFuIG92ZXJ3cml0ZSBpbmRpY2F0b3IsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYW5ub3RhdGlvbgotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIHRoZSBtZXRob2QgYmluZGluZyBrZXkKLQkgKiBAc2luY2UgMS4wCi0JICovCi0JT3ZlcnJpZGVJbmRpY2F0b3IoU3RyaW5nIHRleHQsIFN0cmluZyBrZXkpCi0JewotCQlzdXBlcihPdmVycmlkZUluZGljYXRvck1hbmFnZXIuQU5OT1RBVElPTl9UWVBFLCBmYWxzZSwgdGV4dCk7Ci0JCS8vZkFzdE5vZGVLZXkgPSBrZXk7Ci0JfQotCi0JLyoqCi0JICogT3BlbnMgYW5kIHJldmVhbHMgdGhlIGRlZmluaW5nIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBvcGVuKCkKLQl7Ci0JCS8vIENvbXBpbGF0aW9uVW5pdCBhc3Q9IFNoYXJlZEFTVFByb3ZpZGVyLmdldEFTVChmSmF2YUVsZW1lbnQsIFNoYXJlZEFTVFByb3ZpZGVyLldBSVRfQUNUSVZFX09OTFksIG51bGwpOwotCQkvLyBpZiAoYXN0ICE9IG51bGwpIHsKLQkJLy8gQVNUTm9kZSBub2RlPSBhc3QuZmluZERlY2xhcmluZ05vZGUoZkFzdE5vZGVLZXkpOwotCQkvLyBpZiAobm9kZSBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKSB7Ci0JCS8vIHRyeSB7Ci0JCS8vIElNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmc9ICgoTWV0aG9kRGVjbGFyYXRpb24pbm9kZSkucmVzb2x2ZUJpbmRpbmcoKTsKLQkJLy8gSU1ldGhvZEJpbmRpbmcgZGVmaW5pbmdNZXRob2RCaW5kaW5nPSBCaW5kaW5ncy5maW5kT3ZlcnJpZGRlbk1ldGhvZChtZXRob2RCaW5kaW5nLCB0cnVlKTsKLQkJLy8gaWYgKGRlZmluaW5nTWV0aG9kQmluZGluZyAhPSBudWxsKSB7Ci0JCS8vIElKYXZhRWxlbWVudCBkZWZpbmluZ01ldGhvZD0gZGVmaW5pbmdNZXRob2RCaW5kaW5nLmdldEphdmFFbGVtZW50KCk7Ci0JCS8vIGlmIChkZWZpbmluZ01ldGhvZCAhPSBudWxsKSB7Ci0JCS8vIEphdmFVSS5vcGVuSW5FZGl0b3IoZGVmaW5pbmdNZXRob2QsIHRydWUsIHRydWUpOwotCQkvLyByZXR1cm47Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJLy8gRXhjZXB0aW9uSGFuZGxlci5oYW5kbGUoZSwgSmF2YUVkaXRvck1lc3NhZ2VzLk92ZXJyaWRlSW5kaWNhdG9yTWFuYWdlcl9vcGVuX2Vycm9yX3RpdGxlLCBKYXZhRWRpdG9yTWVzc2FnZXMuT3ZlcnJpZGVJbmRpY2F0b3JNYW5hZ2VyX29wZW5fZXJyb3JfbWVzc2FnZUhhc0xvZ0VudHJ5KTsKLQkJLy8gcmV0dXJuOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyBTdHJpbmcgdGl0bGU9IEphdmFFZGl0b3JNZXNzYWdlcy5PdmVycmlkZUluZGljYXRvck1hbmFnZXJfb3Blbl9lcnJvcl90aXRsZTsKLQkJLy8gU3RyaW5nIG1lc3NhZ2U9IEphdmFFZGl0b3JNZXNzYWdlcy5PdmVycmlkZUluZGljYXRvck1hbmFnZXJfb3Blbl9lcnJvcl9tZXNzYWdlOwotCQkvLyBNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihKYXZhUGx1Z2luLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksIHRpdGxlLCBtZXNzYWdlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvZWRpdG9yL092ZXJyaWRlSW5kaWNhdG9ySW1hZ2VQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL2VkaXRvci9PdmVycmlkZUluZGljYXRvckltYWdlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVjMGRmOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvZWRpdG9yL092ZXJyaWRlSW5kaWNhdG9ySW1hZ2VQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JQW5ub3RhdGlvbkltYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5YU0xVSVBsdWdpbjsKLQotLyoqCi0gKiBJbWFnZSBwcm92aWRlciBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwuZWRpdG9yLmpkdC5pbnRlcm5hbC51aS5qYXZhZWRpdG9yLk92ZXJyaWRlSW5kaWNhdG9yTWFuYWdlci5PdmVycmlkZUluZGljYXRvcn0gYW5ub3RhdGlvbnMuCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIE92ZXJyaWRlSW5kaWNhdG9ySW1hZ2VQcm92aWRlciBpbXBsZW1lbnRzIElBbm5vdGF0aW9uSW1hZ2VQcm92aWRlcgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPVkVSUklERV9JTUdfREVTQ19JRCA9ICJPdmVycmlkZUluZGljYXRvckltYWdlUHJvdmlkZXIuT1ZFUlJJREVfSU1HX0RFU0NfSUQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGlzIGRvZXMgbm90IHN1cHBvcnQgbWFuYWdpbmcgaXRzIG93biBpbWFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gYW5ub3RhdGlvbgotCSAqIEByZXR1cm4gbnVsbAotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRNYW5hZ2VkSW1hZ2UoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQotCXsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklBbm5vdGF0aW9uSW1hZ2VQcm92aWRlciNnZXRJbWFnZURlc2NyaXB0b3JJZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Bbm5vdGF0aW9uKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW1hZ2VEZXNjcmlwdG9ySWQoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQotCXsKLQkJaWYgKCFpc0ltYWdlUHJvdmlkZXJGb3IoYW5ub3RhdGlvbikpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIE9WRVJSSURFX0lNR19ERVNDX0lEOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JQW5ub3RhdGlvbkltYWdlUHJvdmlkZXIjZ2V0SW1hZ2VEZXNjcmlwdG9yKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGltYWdlRGVzY3JpdHBvcklkKQotCXsKLQkJaWYgKE9WRVJSSURFX0lNR19ERVNDX0lELmVxdWFscyhpbWFnZURlc2NyaXRwb3JJZCkpCi0JCQlyZXR1cm4gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKFhTTFVJUGx1Z2luLlBMVUdJTl9JRCwgImljb25zL2Z1bGwvb3Zlcl9jby5naWYiKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzSW1hZ2VQcm92aWRlckZvcihBbm5vdGF0aW9uIGFubm90YXRpb24pCi0JewotCQlyZXR1cm4gYW5ub3RhdGlvbiAhPSBudWxsICYmIE92ZXJyaWRlSW5kaWNhdG9yTWFuYWdlci5BTk5PVEFUSU9OX1RZUEUuZXF1YWxzKGFubm90YXRpb24uZ2V0VHlwZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvZWRpdG9yL092ZXJyaWRlSW5kaWNhdG9yTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL2VkaXRvci9PdmVycmlkZUluZGljYXRvck1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThjYmRiNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvZWRpdG9yL092ZXJyaWRlSW5kaWNhdG9yTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVN5bmNocm9uaXphYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklBbm5vdGF0aW9uTW9kZWxFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLlhTTENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLm1vZGVsLlN0eWxlc2hlZXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUubW9kZWwuVGVtcGxhdGU7Ci0KLS8qKgotICogTWFuYWdlcyB0aGUgb3ZlcnJpZGUgYW5kIG92ZXJ3cml0ZSBpbmRpY2F0b3JzIGZvciB0aGUgZ2l2ZW4gSmF2YSBlbGVtZW50IGFuZCBhbm5vdGF0aW9uIG1vZGVsLgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPdmVycmlkZUluZGljYXRvck1hbmFnZXIKLXsKLQotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBBTk5PVEFUSU9OX1RZUEUgPSAib3JnLmVjbGlwc2Uud3N0LnhzbC51aS5vdmVycmlkZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSUFubm90YXRpb25Nb2RlbCBmQW5ub3RhdGlvbk1vZGVsOwotCXByaXZhdGUgT2JqZWN0IGZBbm5vdGF0aW9uTW9kZWxMb2NrT2JqZWN0OwotCXByaXZhdGUgQW5ub3RhdGlvbltdIGZPdmVycmlkZUFubm90YXRpb25zOwotCi0JcHJpdmF0ZSBJRmlsZSBmaWxlOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgcmVxdWlyZXMgdGhlIGVkaXRvcnMgYW5ub3RhdGlvbiBtb2RlbCBhbmQgdGhlIGZpbGUgdGhlIGVkaXRvciBpcyBsb29raW5nIGF0LgotCSAqIAotCSAqIEBwYXJhbSBhbm5vdGF0aW9uTW9kZWwKLQkgKiBAcGFyYW0gZmlsZQotCSAqLwotCXB1YmxpYyBPdmVycmlkZUluZGljYXRvck1hbmFnZXIoSUFubm90YXRpb25Nb2RlbCBhbm5vdGF0aW9uTW9kZWwsIElGaWxlIGZpbGUpCi0JewotCQlBc3NlcnQuaXNOb3ROdWxsKGFubm90YXRpb25Nb2RlbCk7Ci0KLQkJdGhpcy5maWxlID0gZmlsZTsKLQkJZkFubm90YXRpb25Nb2RlbCA9IGFubm90YXRpb25Nb2RlbDsKLQkJZkFubm90YXRpb25Nb2RlbExvY2tPYmplY3QgPSBnZXRMb2NrT2JqZWN0KGZBbm5vdGF0aW9uTW9kZWwpOwotCi0JCXVwZGF0ZUFubm90YXRpb25zKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jayBvYmplY3QgZm9yIHRoZSBnaXZlbiBhbm5vdGF0aW9uIG1vZGVsLgotCSAqIAotCSAqIEBwYXJhbSBhbm5vdGF0aW9uTW9kZWwKLQkgKiAgICAgICAgICAgIHRoZSBhbm5vdGF0aW9uIG1vZGVsCi0JICogQHJldHVybiB0aGUgYW5ub3RhdGlvbiBtb2RlbCdzIGxvY2sgb2JqZWN0Ci0JICogQHNpbmNlIDEuMAotCSAqLwotCXByaXZhdGUgT2JqZWN0IGdldExvY2tPYmplY3QoSUFubm90YXRpb25Nb2RlbCBhbm5vdGF0aW9uTW9kZWwpCi0JewotCQlpZiAoYW5ub3RhdGlvbk1vZGVsIGluc3RhbmNlb2YgSVN5bmNocm9uaXphYmxlKQotCQl7Ci0JCQlPYmplY3QgbG9jayA9ICgoSVN5bmNocm9uaXphYmxlKSBhbm5vdGF0aW9uTW9kZWwpLmdldExvY2tPYmplY3QoKTsKLQkJCWlmIChsb2NrICE9IG51bGwpCi0JCQkJcmV0dXJuIGxvY2s7Ci0JCX0KLQkJcmV0dXJuIGFubm90YXRpb25Nb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBvdmVycmlkZSBhbmQgaW1wbGVtZW50cyBhbm5vdGF0aW9ucyBiYXNlZCBvbiB0aGUgZ2l2ZW4gQVNULgotCSAqIAotCSAqIEBwYXJhbSBhc3QKLQkgKiAgICAgICAgICAgIHRoZSBjb21waWxhdGlvbiB1bml0IEFTVAotCSAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IKLQkgKiAgICAgICAgICAgIHRoZSBwcm9ncmVzcyBtb25pdG9yCi0JICogQHNpbmNlIDEuMAotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZUFubm90YXRpb25zKCkKLQl7Ci0JCVN0eWxlc2hlZXRNb2RlbCBzdHlsZXNoZWV0Q29tcG9zZWQgPSBYU0xDb3JlLmdldEluc3RhbmNlKCkuZ2V0U3R5bGVzaGVldChmaWxlKTsKLQkJZmluYWwgTWFwPEFubm90YXRpb24sUG9zaXRpb24+IGFubm90YXRpb25NYXA9IG5ldyBIYXNoTWFwPEFubm90YXRpb24sUG9zaXRpb24+KDUwKTsKLQkJTGlzdDxUZW1wbGF0ZT4gbmVzdGVkVGVtcGxhdGVzID0gc3R5bGVzaGVldENvbXBvc2VkLmZpbmRBbGxOZXN0ZWRUZW1wbGF0ZXMoKTsKLQkJZm9yIChUZW1wbGF0ZSB0ZW1wbGF0ZSA6IHN0eWxlc2hlZXRDb21wb3NlZC5nZXRTdHlsZXNoZWV0KCkuZ2V0VGVtcGxhdGVzKCkpCi0JCXsKLQkJCS8vIGNoZWNrIGZvciBvdmVycmlkZGVuIHN0eWxlc2hlZXRzCi0JCQlmb3IgKFRlbXBsYXRlIG5lc3RlZFRlbXBsYXRlIDogbmVzdGVkVGVtcGxhdGVzKQotCQkJewotCQkJCUlGaWxlIG5lc3RlZEZpbGUgPSBuZXN0ZWRUZW1wbGF0ZS5nZXRTdHlsZXNoZWV0KCkuZ2V0RmlsZSgpOwotCQkJCWlmIChuZXN0ZWRGaWxlICE9IG51bGwpCi0JCQkJewotCQkJCQlpZih0ZW1wbGF0ZS5tYXRjaGVzQnlNYXRjaE9yTmFtZShuZXN0ZWRUZW1wbGF0ZSkpCi0JCQkJCXsvLyB0aGUgdGVtcGxhdGUgb3ZlcnJpZGVzIGFub3RoZXIgdGVtcGxhdGVzIGFzIGl0cyBuYW1lIG1hdGNoZXMsIG9yIGl0cyBtYXRjaCBhbmQgbW9kZSBtYXRjaGVzCi0JCQkJCQlpZiAodGVtcGxhdGUuZ2V0TmFtZSgpICE9IG51bGwpCi0JCQkJCQl7Ci0JCQkJCQkJU3RyaW5nIHRleHQgPSAib3ZlcnJpZGVzICIrdGVtcGxhdGUuZ2V0TmFtZSgpKyIgaW4gIituZXN0ZWRGaWxlLmdldE5hbWUoKTsKLQkJCQkJCQlhbm5vdGF0aW9uTWFwLnB1dCgKLQkJCQkJCQkJbmV3IE92ZXJyaWRlSW5kaWNhdG9yKHRleHQsICJiaW5kaW5nLmdldEtleSgpIiksIAotCQkJCQkJCQluZXcgUG9zaXRpb24odGVtcGxhdGUuZ2V0T2Zmc2V0KCksIHRlbXBsYXRlLmdldExlbmd0aCgpKQotCQkJCQkJCSk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQl7Ci0JCQkJCQkJU3RyaW5nIHRleHQgPSAib3ZlcnJpZGVzIFwiIit0ZW1wbGF0ZS5nZXRNYXRjaCgpKyJcIiI7Ci0JCQkJCQkJU3RyaW5nIG1vZGUgPSB0ZW1wbGF0ZS5nZXRNb2RlKCk7Ci0JCQkJCQkJaWYgKG1vZGUgIT0gbnVsbCkKLQkJCQkJCQkJdGV4dCArPSAiICgiK21vZGUrIikiOwotCQkJCQkJCXRleHQgKz0gIiBpbiAiK25lc3RlZEZpbGUuZ2V0TmFtZSgpOwotCQkJCQkJCWFubm90YXRpb25NYXAucHV0KAotCQkJCQkJCQluZXcgT3ZlcnJpZGVJbmRpY2F0b3IodGV4dCwgImJpbmRpbmcuZ2V0S2V5KCkiKSwgCi0JCQkJCQkJCW5ldyBQb3NpdGlvbih0ZW1wbGF0ZS5nZXRPZmZzZXQoKSwgdGVtcGxhdGUuZ2V0TGVuZ3RoKCkpCi0JCQkJCQkJKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXN5bmNocm9uaXplZCAoZkFubm90YXRpb25Nb2RlbExvY2tPYmplY3QpCi0JCXsKLQkJCWlmIChmQW5ub3RhdGlvbk1vZGVsIGluc3RhbmNlb2YgSUFubm90YXRpb25Nb2RlbEV4dGVuc2lvbikKLQkJCXsKLQkJCQkoKElBbm5vdGF0aW9uTW9kZWxFeHRlbnNpb24pIGZBbm5vdGF0aW9uTW9kZWwpLnJlcGxhY2VBbm5vdGF0aW9ucyhmT3ZlcnJpZGVBbm5vdGF0aW9ucywgYW5ub3RhdGlvbk1hcCk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcmVtb3ZlQW5ub3RhdGlvbnMoKTsKLQkJCQlJdGVyYXRvciBpdGVyID0gYW5ub3RhdGlvbk1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQotCQkJCXsKLQkJCQkJTWFwLkVudHJ5IG1hcEVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJCWZBbm5vdGF0aW9uTW9kZWwuYWRkQW5ub3RhdGlvbigoQW5ub3RhdGlvbikgbWFwRW50cnkuZ2V0S2V5KCksIChQb3NpdGlvbikgbWFwRW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQkJfQotCQkJfQotCQkJZk92ZXJyaWRlQW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uTWFwLmtleVNldCgpLnRvQXJyYXkobmV3IEFubm90YXRpb25bYW5ub3RhdGlvbk1hcC5rZXlTZXQoKS5zaXplKCldKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYWxsIG92ZXJyaWRlIGluZGljYXRvcnMgZnJvbSB0aGlzIG1hbmFnZXIncyBhbm5vdGF0aW9uIG1vZGVsLgotCSAqLwotCXZvaWQgcmVtb3ZlQW5ub3RhdGlvbnMoKQotCXsKLQkJaWYgKGZPdmVycmlkZUFubm90YXRpb25zID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJc3luY2hyb25pemVkIChmQW5ub3RhdGlvbk1vZGVsTG9ja09iamVjdCkKLQkJewotCQkJaWYgKGZBbm5vdGF0aW9uTW9kZWwgaW5zdGFuY2VvZiBJQW5ub3RhdGlvbk1vZGVsRXh0ZW5zaW9uKQotCQkJewotCQkJCSgoSUFubm90YXRpb25Nb2RlbEV4dGVuc2lvbikgZkFubm90YXRpb25Nb2RlbCkucmVwbGFjZUFubm90YXRpb25zKGZPdmVycmlkZUFubm90YXRpb25zLCBudWxsKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gZk92ZXJyaWRlQW5ub3RhdGlvbnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspCi0JCQkJCWZBbm5vdGF0aW9uTW9kZWwucmVtb3ZlQW5ub3RhdGlvbihmT3ZlcnJpZGVBbm5vdGF0aW9uc1tpXSk7Ci0JCQl9Ci0JCQlmT3ZlcnJpZGVBbm5vdGF0aW9ucyA9IG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvZWRpdG9yL1NvdXJjZUZpbGVIeXBlcmxpbmsuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9lZGl0b3IvU291cmNlRmlsZUh5cGVybGluay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTg2ZDg3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9lZGl0b3IvU291cmNlRmlsZUh5cGVybGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwuZWRpdG9yOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5tb2RlbC5YU0xOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwuWFNMVUlQbHVnaW47Ci0KLS8qKgotICogQGF1dGhvciBEb3VnIFNhdGNod2VsbAotICoKLSAqLwotcHVibGljIGNsYXNzIFNvdXJjZUZpbGVIeXBlcmxpbmsgaW1wbGVtZW50cyBJSHlwZXJsaW5rCi17Ci0JcHJpdmF0ZSBJUmVnaW9uIGh5cGVyTGlua1JlZ2lvbjsKLQlwcml2YXRlIElGaWxlIGxpbmtlZEZpbGU7Ci0JcHJpdmF0ZSBYU0xOb2RlIHNvdXJjZUFydGlmYWN0OwotCi0JLyoqCi0JICogQHBhcmFtIGh5cGVyTGlua1JlZ2lvbgotCSAqIEBwYXJhbSBsaW5rZWRGaWxlCi0JICovCi0JcHVibGljIFNvdXJjZUZpbGVIeXBlcmxpbmsoSVJlZ2lvbiBoeXBlckxpbmtSZWdpb24sIElGaWxlIGxpbmtlZEZpbGUpCi0JewotCQl0aGlzLmh5cGVyTGlua1JlZ2lvbiA9IGh5cGVyTGlua1JlZ2lvbjsKLQkJdGhpcy5saW5rZWRGaWxlID0gbGlua2VkRmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaHlwZXJMaW5rUmVnaW9uCi0JICogQHBhcmFtIGxpbmtlZEZpbGUKLQkgKiBAcGFyYW0gbm9kZQotCSAqLwotCXB1YmxpYyBTb3VyY2VGaWxlSHlwZXJsaW5rKElSZWdpb24gaHlwZXJMaW5rUmVnaW9uLCBJRmlsZSBsaW5rZWRGaWxlLCBYU0xOb2RlIG5vZGUpCi0JewotCQl0aGlzLmh5cGVyTGlua1JlZ2lvbiA9IGh5cGVyTGlua1JlZ2lvbjsKLQkJdGhpcy5saW5rZWRGaWxlID0gbGlua2VkRmlsZTsKLQkJdGhpcy5zb3VyY2VBcnRpZmFjdCA9IG5vZGU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluayNnZXRIeXBlcmxpbmtSZWdpb24oKQotCSAqLwotCXB1YmxpYyBJUmVnaW9uIGdldEh5cGVybGlua1JlZ2lvbigpCi0JewotCQlyZXR1cm4gaHlwZXJMaW5rUmVnaW9uOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0VHlwZUxhYmVsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVMYWJlbCgpCi0JewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rI2dldEh5cGVybGlua1RleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SHlwZXJsaW5rVGV4dCgpCi0JewotCQlyZXR1cm4gbGlua2VkRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluayNvcGVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBvcGVuKCkKLQl7Ci0JCWlmIChsaW5rZWRGaWxlICE9IG51bGwgJiYgbGlua2VkRmlsZS5leGlzdHMoKSkKLQkJewotCQkJdHJ5Ci0JCQl7Ci0JCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IElERS5vcGVuRWRpdG9yKHBhZ2UsIGxpbmtlZEZpbGUsIHRydWUpOwotCQkJCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpZWRpdG9yLmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQkJCWlmIChzb3VyY2VBcnRpZmFjdCAhPSBudWxsICYmIHRleHRFZGl0b3IgIT0gbnVsbCkKLQkJCQl7Ci0JCQkJCUlEb2N1bWVudCBvcGVuZWREb2N1bWVudCA9IChJRG9jdW1lbnQpZWRpdG9yLmdldEFkYXB0ZXIoSURvY3VtZW50LmNsYXNzKTsKLQkJCQkJaWYgKG9wZW5lZERvY3VtZW50ICE9IG51bGwpCi0JCQkJCXsKLQkJCQkJCWludCBsaW5lT2Zmc2V0ID0gb3BlbmVkRG9jdW1lbnQuZ2V0TGluZU9mZnNldChzb3VyY2VBcnRpZmFjdC5nZXRMaW5lTnVtYmVyKCkpOwotCQkJCQkJaW50IG9mZnNldCA9IGxpbmVPZmZzZXQgKyBzb3VyY2VBcnRpZmFjdC5nZXRDb2x1bW5OdW1iZXIoKTsKLQkJCQkJCS8vdGV4dEVkaXRvci5zZWxlY3RBbmRSZXZlYWwob2Zmc2V0LCBzb3VyY2VBcnRpZmFjdC5nZXRMZW5ndGgoKSk7Ci0JCQkJCQl0ZXh0RWRpdG9yLnNldEhpZ2hsaWdodFJhbmdlKG9mZnNldCwgc291cmNlQXJ0aWZhY3QuZ2V0TGVuZ3RoKCksIHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIHBpZSkKLQkJCXsKLQkJCQlYU0xVSVBsdWdpbi5sb2cocGllKTsKLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKQotCQkJewotCQkJCVhTTFVJUGx1Z2luLmxvZyhlKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL2VkaXRvci9YU0xFZGl0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9lZGl0b3IvWFNMRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4Yjk2NTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL2VkaXRvci9YU0xFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci50ZW1wbGF0ZXMuSVRlbXBsYXRlc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLnRlbXBsYXRlcy5YU0xUZW1wbGF0ZXNQYWdlOwotCi0vKioKLSAqIFhTTCBzcGVjaWZpYyBleHRlbnNpb25zIHRvIHRoZSBTU0UgVUkgdGhhdCBoYXZlbid0IHlldCBiZWVuIG1hZGUKLSAqIGF2YWlsYWJsZSB0byB0aGUgU1NFLgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBYU0xFZGl0b3IgZXh0ZW5kcyBTdHJ1Y3R1cmVkVGV4dEVkaXRvcgotewotCXByaXZhdGUgT3ZlcnJpZGVJbmRpY2F0b3JNYW5hZ2VyIGZPdmVycmlkZUluZGljYXRvck1hbmFnZXI7Ci0JCi0JLyoqCi0JICogQHNpbmNlIDEuMAotCSAqLwotCXByaXZhdGUgWFNMVGVtcGxhdGVzUGFnZSBmVGVtcGxhdGVzUGFnZTsKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvU2V0SW5wdXQoSUVkaXRvcklucHV0IGlucHV0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJc3VwZXIuZG9TZXRJbnB1dChpbnB1dCk7Ci0JCWluc3RhbGxPdmVycmlkZUluZGljYXRvcigpOwotCX0KLQkKLQlwdWJsaWMgT3ZlcnJpZGVJbmRpY2F0b3JNYW5hZ2VyIGdldE92ZXJyaWRlSW5kaWNhdG9yTWFuYWdlcigpCi0JewotCQlyZXR1cm4gZk92ZXJyaWRlSW5kaWNhdG9yTWFuYWdlcjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5zdGFsbE92ZXJyaWRlSW5kaWNhdG9yKCkKLQl7Ci0JCS8vIHVuaW5zdGFsbE92ZXJyaWRlSW5kaWNhdG9yKCk7Ci0JCWlmIChnZXRFZGl0b3JJbnB1dCgpIGluc3RhbmNlb2YgRmlsZUVkaXRvcklucHV0KQotCQl7Ci0JCQlJQW5ub3RhdGlvbk1vZGVsIG1vZGVsID0gZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldEFubm90YXRpb25Nb2RlbChnZXRFZGl0b3JJbnB1dCgpKTsKLQkJCUlGaWxlIGZpbGUgPSAoKEZpbGVFZGl0b3JJbnB1dClnZXRFZGl0b3JJbnB1dCgpKS5nZXRGaWxlKCk7Ci0JCQlmT3ZlcnJpZGVJbmRpY2F0b3JNYW5hZ2VyID0gbmV3IE92ZXJyaWRlSW5kaWNhdG9yTWFuYWdlcihtb2RlbCwgZmlsZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3IjZ2V0QWRhcHRlcihqYXZhLmxhbmcuQ2xhc3MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIHJlcXVpcmVkKSB7Ci0JCWlmIChJVGVtcGxhdGVzUGFnZS5jbGFzcy5lcXVhbHMocmVxdWlyZWQpKSB7Ci0JCQlpZiAoZlRlbXBsYXRlc1BhZ2UgPT0gbnVsbCkKLQkJCQlmVGVtcGxhdGVzUGFnZSA9IG5ldyBYU0xUZW1wbGF0ZXNQYWdlKHRoaXMpOwotCQkJcmV0dXJuIGZUZW1wbGF0ZXNQYWdlOwotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIocmVxdWlyZWQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9lZGl0b3IvWFNMSHlwZXJsaW5rRGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9lZGl0b3IvWFNMSHlwZXJsaW5rRGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZkN2M0YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvZWRpdG9yL1hTTEh5cGVybGlua0RldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgRGF2aWQgQ2FydmVyIChTVEFSKSAtIGJ1ZyAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5BYnN0cmFjdEh5cGVybGlua0RldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLlhTTENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLm1vZGVsLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUubW9kZWwuU3R5bGVzaGVldE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5tb2RlbC5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUubW9kZWwuWFNMQXR0cmlidXRlOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIEEgaHlwZXJsaW5rIGRldGVjdG9yIGZvciBYU0wgZmlsZXMuCi0gKiAKLSAqIFRoZSBkZXRlY3RvciBtYWtlcyB1c2Ugb2YgdGhlIG1vZGVsIGJ1aWx0IGJ5IFNTRSB2YWxpZGF0aW9uIChmb3VuZCBpbiA8Y29kZT5YU0xDb3JlPC9jb2RlPikuCi0gKiAKLSAqIEN1cnJlbnRseSBzdXBwb3J0cyBoeXBlcmxpbmtpbmcgZm9yIGluY2x1ZGVzLCBpbXBvcnRzIG9yIGNhbGxlZCB0ZW1wbGF0ZXMuCi0gKiAKLSAqIEBhdXRob3IgRG91ZyBTYXRjaHdlbGwKLSAqLwotcHVibGljIGNsYXNzIFhTTEh5cGVybGlua0RldGVjdG9yIGV4dGVuZHMgQWJzdHJhY3RIeXBlcmxpbmtEZXRlY3RvcgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX1dJVEhfUEFSQU0gPSAid2l0aC1wYXJhbSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRSA9ICJuYW1lIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxNX0NBTExfVEVNUExBVEUgPSAiY2FsbC10ZW1wbGF0ZSI7Ci0KLQkvKioKLQkgKiBUcnkgdG8gY3JlYXRlIGh5cGVybGlua3MgZm9yIHZpZXdlciBhbmQgcmVnaW9uCi0JICogCi0JICogQHNlZSBBYnN0cmFjdEh5cGVybGlua0RldGVjdG9yCi0JICogQHBhcmFtIHRleHRWaWV3ZXIgCi0JICogQHBhcmFtIHJlZ2lvbiAKLQkgKiBAcGFyYW0gY2FuU2hvd011bHRpcGxlSHlwZXJsaW5rcyAKLQkgKiBAcmV0dXJuIGFycmF5IG9mIGh5cGVybGlua3MgZm9yIGN1cnJlbnQgcmVnaW9uCi0JICovCi0JcHVibGljIElIeXBlcmxpbmtbXSBkZXRlY3RIeXBlcmxpbmtzKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIElSZWdpb24gcmVnaW9uLCBib29sZWFuIGNhblNob3dNdWx0aXBsZUh5cGVybGlua3MpCi0JewotCQlJSHlwZXJsaW5rIGh5cGVybGluayA9IG51bGw7Ci0JCWlmIChyZWdpb24gIT0gbnVsbCAmJiB0ZXh0Vmlld2VyICE9IG51bGwpCi0JCXsKLQkJCXJldHVybiBkZXRlY3RIeXBlcmxpbmtzKHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKSwgcmVnaW9uLCBjYW5TaG93TXVsdGlwbGVIeXBlcmxpbmtzKTsKLQkJfQotCQlyZXR1cm4gbmV3IElIeXBlcmxpbmtbXXtoeXBlcmxpbmt9OwotCX0KLQotCS8qKgotCSAqIFRyeSB0byBjcmVhdGUgaHlwZXJsaW5rcyBmb3IgZG9jdW1lbnQgYW5kIHJlZ2lvbgotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqIEBwYXJhbSByZWdpb24KLQkgKiBAcGFyYW0gY2FuU2hvd011bHRpcGxlSHlwZXJsaW5rcwotCSAqIEByZXR1cm4gYXJyYXkgb2YgaHlwZXJsaW5rcyBmb3IgY3VycmVudCByZWdpb24KLQkgKi8KLQlwdWJsaWMgSUh5cGVybGlua1tdIGRldGVjdEh5cGVybGlua3MoSURvY3VtZW50IGRvY3VtZW50LCBJUmVnaW9uIHJlZ2lvbiwgYm9vbGVhbiBjYW5TaG93TXVsdGlwbGVIeXBlcmxpbmtzKQotCXsKLQkJSUh5cGVybGluayBoeXBlcmxpbmsgPSBudWxsOwotCQkKLQkJaWYgKHJlZ2lvbiAhPSBudWxsICYmIGRvY3VtZW50ICE9IG51bGwpCi0JCXsKLQkJCU5vZGUgY3VycmVudE5vZGUgPSBYU0xDb3JlLmdldEN1cnJlbnROb2RlKGRvY3VtZW50LCByZWdpb24uZ2V0T2Zmc2V0KCkpOwotCi0JCQlFbGVtZW50IHhzbEVsID0gbnVsbDsKLQkJCUF0dHIgeHNsQXR0ciA9IG51bGw7Ci0JCQlpZiAoWFNMQ29yZS5YU0xfTkFNRVNQQUNFX1VSSS5lcXVhbHMoY3VycmVudE5vZGUuZ2V0TmFtZXNwYWNlVVJJKCkpKSB7Ci0JCQkJaWYgKGN1cnJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkKLQkJCQl7Ci0JCQkJCUF0dHIgYXR0ID0gKEF0dHIpIGN1cnJlbnROb2RlOwotCQkJCQl4c2xFbCA9IGF0dC5nZXRPd25lckVsZW1lbnQoKTsKLQkJCQkJeHNsQXR0ciA9IGF0dDsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKGN1cnJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJewotCQkJCQlFbGVtZW50IGVsID0gKEVsZW1lbnQpY3VycmVudE5vZGU7Ci0JCQkJCQl4c2xFbCA9IGVsOwotCQkJCQkJeHNsQXR0ciA9IFhTTENvcmUuZ2V0Q3VycmVudEF0dHJOb2RlKGVsLCByZWdpb24uZ2V0T2Zmc2V0KCkpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJaHlwZXJsaW5rID0gY3JlYXRlSHlwZXJMaW5rKGRvY3VtZW50LCBoeXBlcmxpbmssIHhzbEVsLCB4c2xBdHRyKTsKLQkJfQotCQlyZXR1cm4gaHlwZXJsaW5rID09IG51bGwgPyBudWxsIDogbmV3IElIeXBlcmxpbmtbXXtoeXBlcmxpbmt9OwotCX0KLQotCXByaXZhdGUgSUh5cGVybGluayBjcmVhdGVIeXBlckxpbmsoSURvY3VtZW50IGRvY3VtZW50LAotCQkJSUh5cGVybGluayBoeXBlcmxpbmssIEVsZW1lbnQgeHNsRWwsIEF0dHIgeHNsQXR0cikgewotCQlpZiAoeHNsRWwgIT0gbnVsbCAmJiB4c2xBdHRyICE9IG51bGwpCi0JCXsKLQkJCUlSZWdpb24gaHlwZXJsaW5rUmVnaW9uID0gZ2V0SHlwZXJsaW5rUmVnaW9uKHhzbEF0dHIpOwotCQkJSUZpbGUgZmlsZSA9IGdldEZpbGVGb3JEb2N1bWVudChkb2N1bWVudCk7Ci0JCQlpZiAoZmlsZSAhPSBudWxsKQotCQkJewotCQkJCWlmIChFTE1fQ0FMTF9URU1QTEFURS5lcXVhbHMoeHNsRWwuZ2V0TG9jYWxOYW1lKCkpICYmIEFUVFJfTkFNRS5lcXVhbHMoeHNsQXR0ci5nZXRMb2NhbE5hbWUoKSkpCi0JCQkJewotCQkJCQloeXBlcmxpbmsgPSBjcmVhdGVDYWxsVGVtcGxhdGVIeXBlckxpbmsoZmlsZSx4c2xBdHRyLmdldFZhbHVlKCksIGh5cGVybGlua1JlZ2lvbik7Ci0JCQkJfQotCQkJCQotCQkJCWlmIChFTEVNX1dJVEhfUEFSQU0uZXF1YWxzKHhzbEVsLmdldExvY2FsTmFtZSgpKSAmJiBBVFRSX05BTUUuZXF1YWxzKHhzbEF0dHIuZ2V0TG9jYWxOYW1lKCkpKSB7Ci0JCQkJCWh5cGVybGluayA9IGNyZWF0ZVdpdGhQYXJhbUh5cGVyTGluayhmaWxlLCB4c2xFbCwgeHNsQXR0ciwgaHlwZXJsaW5rUmVnaW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJfQotCQlyZXR1cm4gaHlwZXJsaW5rOwotCX0KLQkKLQotCXByaXZhdGUgSUh5cGVybGluayBjcmVhdGVDYWxsVGVtcGxhdGVIeXBlckxpbmsoSUZpbGUgY3VycmVudEZpbGUsIFN0cmluZyB0ZW1wbGF0ZU5hbWUsIElSZWdpb24gaHlwZXJsaW5rUmVnaW9uKQotCXsKLQkJSUh5cGVybGluayBoeXBlcmxpbmsgPSBudWxsOwotCQlTdHlsZXNoZWV0TW9kZWwgc2YgPSBYU0xDb3JlLmdldEluc3RhbmNlKCkuZ2V0U3R5bGVzaGVldChjdXJyZW50RmlsZSk7Ci0JCWlmIChzZiAhPSBudWxsKQotCQl7Ci0JCQlMaXN0PFRlbXBsYXRlPiB0ZW1wbGF0ZXMgPSBzZi5nZXRUZW1wbGF0ZXNCeU5hbWUodGVtcGxhdGVOYW1lKTsKLQkJCWlmICh0ZW1wbGF0ZXMgIT0gbnVsbCAmJiB0ZW1wbGF0ZXMuc2l6ZSgpID09IDEpCi0JCQl7Ci0JCQkJVGVtcGxhdGUgdGVtcGxhdGUgPSB0ZW1wbGF0ZXMuZ2V0KDApOwotCQkJCWh5cGVybGluayA9IG5ldyBTb3VyY2VGaWxlSHlwZXJsaW5rKGh5cGVybGlua1JlZ2lvbix0ZW1wbGF0ZS5nZXRTdHlsZXNoZWV0KCkuZ2V0RmlsZSgpLHRlbXBsYXRlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaHlwZXJsaW5rOwotCX0KLQkKLQlwcml2YXRlIElIeXBlcmxpbmsgY3JlYXRlV2l0aFBhcmFtSHlwZXJMaW5rKElGaWxlIGN1cnJlbnRGaWxlLCBFbGVtZW50IGVsZW0sIEF0dHIgYXR0ciwgSVJlZ2lvbiBoeXBlcmxpbmtSZWdpb24pCi0JewotCQlJSHlwZXJsaW5rIGh5cGVybGluayA9IG51bGw7Ci0JCVN0eWxlc2hlZXRNb2RlbCBzZiA9IFhTTENvcmUuZ2V0SW5zdGFuY2UoKS5nZXRTdHlsZXNoZWV0KGN1cnJlbnRGaWxlKTsKLQkJaWYgKHNmICE9IG51bGwpCi0JCXsKLQkJCU5vZGUgcGFyZW50Tm9kZSA9IGVsZW0uZ2V0UGFyZW50Tm9kZSgpOwotCQkJQXR0ciBwYXJlbnRBdHRyaWJ1dGUgPSAoQXR0cikgcGFyZW50Tm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKEFUVFJfTkFNRSk7Ci0JCQlTdHJpbmcgdGVtcGxhdGVOYW1lID0gcGFyZW50QXR0cmlidXRlLmdldFZhbHVlKCk7Ci0JCQlMaXN0PFRlbXBsYXRlPiB0ZW1wbGF0ZXMgPSBzZi5nZXRUZW1wbGF0ZXNCeU5hbWUodGVtcGxhdGVOYW1lKTsKLQkJCQotCQkJaWYgKHRlbXBsYXRlcyAhPSBudWxsICYmIHRlbXBsYXRlcy5zaXplKCkgPT0gMSkKLQkJCXsKLQkJCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IHRlbXBsYXRlcy5nZXQoMCk7Ci0JCQkJTGlzdDxQYXJhbWV0ZXI+IHBhcmFtZXRlcnMgPSB0ZW1wbGF0ZS5nZXRQYXJhbWV0ZXJzKCk7Ci0JCQkJZm9yKFBhcmFtZXRlciBwYXJhbSA6IHBhcmFtZXRlcnMpIHsKLQkJCQkJU3RyaW5nIHBhcmFtTmFtZSA9IGF0dHIuZ2V0VmFsdWUoKTsKLQkJCQkJWFNMQXR0cmlidXRlIHBhcmFtZXRlck5hbWVBdHRyID0gcGFyYW0uZ2V0QXR0cmlidXRlKEFUVFJfTkFNRSk7Ci0JCQkJCWlmIChwYXJhbWV0ZXJOYW1lQXR0ciAhPSBudWxsICYmIHBhcmFtZXRlck5hbWVBdHRyLmdldFZhbHVlKCkuZXF1YWxzKHBhcmFtTmFtZSkpIHsKLQkJCQkJCWh5cGVybGluayA9IG5ldyBTb3VyY2VGaWxlSHlwZXJsaW5rKGh5cGVybGlua1JlZ2lvbix0ZW1wbGF0ZS5nZXRTdHlsZXNoZWV0KCkuZ2V0RmlsZSgpLHBhcmFtKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaHlwZXJsaW5rOwotCX0KLQotCXByaXZhdGUgSVJlZ2lvbiBnZXRIeXBlcmxpbmtSZWdpb24oTm9kZSBub2RlKQotCXsKLQkJSVJlZ2lvbiBoeXBlclJlZ2lvbiA9IG51bGw7Ci0KLQkJaWYgKG5vZGUgIT0gbnVsbCkKLQkJewotCQkJc2hvcnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0JCQlpZiAobm9kZVR5cGUgPT0gTm9kZS5ET0NVTUVOVF9UWVBFX05PREUpCi0JCQl7Ci0JCQkJLy8gaGFuZGxlIGRvYyB0eXBlIG5vZGUKLQkJCQlJRE9NTm9kZSBkb2NOb2RlID0gKElET01Ob2RlKSBub2RlOwotCQkJCWh5cGVyUmVnaW9uID0gbmV3IFJlZ2lvbihkb2NOb2RlLmdldFN0YXJ0T2Zmc2V0KCksIGRvY05vZGUuZ2V0RW5kT2Zmc2V0KCkgLSBkb2NOb2RlLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJfQotCQkJZWxzZSBpZiAobm9kZVR5cGUgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkKLQkJCXsKLQkJCQkvLyBoYW5kbGUgYXR0cmlidXRlIG5vZGVzCi0JCQkJSURPTUF0dHIgYXR0ID0gKElET01BdHRyKSBub2RlOwotCQkJCS8vIGRvIG5vdCBpbmNsdWRlIHF1b3RlcyBpbiBhdHRyaWJ1dGUgdmFsdWUgcmVnaW9uCi0JCQkJaW50IHJlZ09mZnNldCA9IGF0dC5nZXRWYWx1ZVJlZ2lvblN0YXJ0T2Zmc2V0KCk7Ci0JCQkJSVRleHRSZWdpb24gdmFsdWVSZWdpb24gPSBhdHQuZ2V0VmFsdWVSZWdpb24oKTsKLQkJCQlpZiAodmFsdWVSZWdpb24gIT0gbnVsbCkKLQkJCQl7Ci0JCQkJCWludCByZWdMZW5ndGggPSB2YWx1ZVJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JCQkJCVN0cmluZyBhdHRWYWx1ZSA9IGF0dC5nZXRWYWx1ZVJlZ2lvblRleHQoKTsKLQkJCQkJaWYgKFN0cmluZ1V0aWxzLmlzUXVvdGVkKGF0dFZhbHVlKSkKLQkJCQkJewotCQkJCQkJKytyZWdPZmZzZXQ7Ci0JCQkJCQlyZWdMZW5ndGggPSByZWdMZW5ndGggLSAyOwotCQkJCQl9Ci0JCQkJCWh5cGVyUmVnaW9uID0gbmV3IFJlZ2lvbihyZWdPZmZzZXQsIHJlZ0xlbmd0aCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBoeXBlclJlZ2lvbjsKLQl9Ci0JCi0JcHJpdmF0ZSBJRmlsZSBnZXRGaWxlRm9yRG9jdW1lbnQoSURvY3VtZW50IGRvY3VtZW50KQotCXsKLQkJSUZpbGUgZmlsZSA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gbnVsbDsKLQkJdHJ5Ci0JCXsKLQkJCXNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQkJaWYgKHNNb2RlbCAhPSBudWxsKQotCQkJewotCQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChzTW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCkpOwotCQkJCWZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7Ci0JCQl9Ci0JCX0KLQkJZmluYWxseQotCQl7Ci0JCQlpZiAoc01vZGVsICE9IG51bGwpCi0JCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JCXJldHVybiBmaWxlICE9IG51bGwgJiYgZmlsZS5leGlzdHMoKSA/IGZpbGUgOiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL2hhbmRsZXJzL09wZW5EZWNsYXJhdGlvbkhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9oYW5kbGVycy9PcGVuRGVjbGFyYXRpb25IYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMTc2NGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL2hhbmRsZXJzL09wZW5EZWNsYXJhdGlvbkhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwuaGFuZGxlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5IYW5kbGVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwuZWRpdG9yLlhTTEh5cGVybGlua0RldGVjdG9yOwotCi1wdWJsaWMgY2xhc3MgT3BlbkRlY2xhcmF0aW9uSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlcgotewotCXByaXZhdGUgWFNMSHlwZXJsaW5rRGV0ZWN0b3IgZGV0ZWN0b3IgPSBuZXcgWFNMSHlwZXJsaW5rRGV0ZWN0b3IoKTsKLQotCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShFeGVjdXRpb25FdmVudCBldmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbgotCXsKLQkJSUVkaXRvclBhcnQgZWRpdG9yID0gSGFuZGxlclV0aWwuZ2V0QWN0aXZlRWRpdG9yKGV2ZW50KTsKLQotCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gbnVsbDsKLQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotCQkJdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZWRpdG9yOwotCQllbHNlCi0JCXsKLQkJCU9iamVjdCBvID0gZWRpdG9yLmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQkJaWYgKG8gIT0gbnVsbCkKLQkJCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBvOwotCQl9Ci0JCWlmICh0ZXh0RWRpdG9yICE9IG51bGwpCi0JCXsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IHRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KHRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkKLQkJCXsKLQkJCQkvLyBnZXQgY3VycmVudCB0ZXh0IHNlbGVjdGlvbgotCQkJCUlUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24gPSBnZXRDdXJyZW50U2VsZWN0aW9uKHRleHRFZGl0b3IpOwotCQkJCWlmICh0ZXh0U2VsZWN0aW9uLmlzRW1wdHkoKSkKLQkJCQl7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlpbnQgb2Zmc2V0ID0gdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKTsKLQkJCQlpZiAob2Zmc2V0ID09IC0xKQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQlJUmVnaW9uIHJlZ2lvbiA9IG5ldyBSZWdpb24ob2Zmc2V0LCAwKTsKLQkJCQlJSHlwZXJsaW5rW10gbGlua3MgPSBkZXRlY3Rvci5kZXRlY3RIeXBlcmxpbmtzKGRvY3VtZW50LCByZWdpb24sIHRydWUpOwotCQkJCWlmIChsaW5rcyAhPSBudWxsICYmIGxpbmtzLmxlbmd0aCA+IDApCi0JCQkJewotCQkJCQlJSHlwZXJsaW5rIGxpbmsgPSBsaW5rc1swXTsKLQkJCQkJbGluay5vcGVuKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBJVGV4dFNlbGVjdGlvbiBnZXRDdXJyZW50U2VsZWN0aW9uKElUZXh0RWRpdG9yIHRleHRFZGl0b3IpCi0JewotCQlJU2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIgPSB0ZXh0RWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JCWlmIChwcm92aWRlciAhPSBudWxsKQotCQl7Ci0JCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHByb3ZpZGVyLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElUZXh0U2VsZWN0aW9uKQotCQkJewotCQkJCXJldHVybiAoSVRleHRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gVGV4dFNlbGVjdGlvbi5lbXB0eVNlbGVjdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU5M2VkNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotTWFpblByZWZlcmVuY2VQYWdlID0gRXhwYW5kIHRoZSB0cmVlIGZvciBtb3JlIHByZWZlcmVuY2VzLgotRXhjbHVkZVJlc3VsdFByZWZpeGVzQ29udGVudEFzc2lzdCA9IFhNTCBOYW1lc3BhY2U6Ci1Ob0NvbnRlbnRBc3Npc3RhbmNlID0gTm8gQ29udGVudCBBc3Npc3RhbmNlIFByb3Bvc2FscyBBdmFpbGFibGUuCi1YU0xTeW50YXhDb2xvcmluZ1BhZ2UgPSBcbkRlZmF1bHQgY29sb3JzIGFuZCBmb250cyBmb3IgPGEgaHJlZj0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy54bWwuY29sb3JzIj5YTUw8L2E+IGNhbiBiZSBjb25maWd1cmVkIG9uIHRoZSBYTUwgU3ludGF4IENvbG9yaW5nIHBhZ2UuICBTZXR0aW5ncyBvbiB0aGlzIHBhZ2Ugb25seSBhZmZlY3QgWFNMVCBjb250ZW50LgoteHNsdFN0eWxlRG9jdW1lbnQgPSA8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbjx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPVwiMS4wXCIgeG1sbnM6eHNsPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtXCI+XG4gPHhzbDp0ZW1wbGF0ZSBtYXRjaD1cIi9cIj4gICAgICAgIDxodG1sPlxuCQkgICAgPGJvZHkgYmdjb2xvcj1cIiNmZmZmZmZcIj5cbiAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD1cIiRzb21lVmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgIDwhLS0gQUREIFNvbWUgQ29kZSBoZXJlIC0tPlxuICAgICAgICAgICAgICAgPC94c2w6aWY+XG4gICAgICAgICAgICA8L2JvZHk+XG4gICAgICAgIDwvaHRtbD5cbgk8L3hzbDp0ZW1wbGF0ZT5cbjwveHNsOnN0eWxlc2hlZXQ+XG4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvcGVyc3BlY3RpdmUvWE1MUGVyc3BlY3RpdmVGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvcGVyc3BlY3RpdmUvWE1MUGVyc3BlY3RpdmVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmYmRmNjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3BlcnNwZWN0aXZlL1hNTFBlcnNwZWN0aXZlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERhdmlkIENhcnZlciAtIGJ1ZyAyMTM4ODMgLSBpbml0aWFsIGFwaSAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFnZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGb2xkZXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29uc29sZS5JQ29uc29sZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JRGVidWdVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzLlByb2plY3RFeHBsb3JlcjsKLQotCi0vKioKLSAqIEBhdXRob3IgZGNhcnZlcgotICoKLSAqLwotcHVibGljIGNsYXNzIFhNTFBlcnNwZWN0aXZlRmFjdG9yeSBpbXBsZW1lbnRzIElQZXJzcGVjdGl2ZUZhY3RvcnkgewotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgaW5pdGlhbCBsYXlvdXQuICBUaGlzIGlzIHdoYXQgdGhlIGxheW91dCBpcyByZXNldCB0bwotICAgICAqIHdoZW4gdGhlIFJlc2V0IFBlcnNwZWN0aXZlIGlzIHNlbGVjdGVkLiAgIEl0IHRha2VzIGFzIGlucHV0IGEKLSAgICAgKiBJUGFnZUxheW91dCBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGF5b3V0IAotICAgICAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUluaXRpYWxMYXlvdXQoSVBhZ2VMYXlvdXQgbGF5b3V0KSB7Ci0JCS8vIEdldCB0aGUgRWRpdG9yIEFyZWEKLQkJU3RyaW5nIGVkaXRvckFyZWEgPSBsYXlvdXQuZ2V0RWRpdG9yQXJlYSgpOwotCi0JCXRoaXMuYWRkU2hvcnRDdXRWaWV3cyhsYXlvdXQpOwotCQl0aGlzLmFkZFNob3J0Q3V0UGVyc3BlY3RpdmUobGF5b3V0KTsKLQotCQlsYXlvdXQuYWRkQWN0aW9uU2V0KElEZWJ1Z1VJQ29uc3RhbnRzLkxBVU5DSF9BQ1RJT05fU0VUKTsKLQkJbGF5b3V0LmFkZEFjdGlvblNldCgib3JnLmVjbGlwc2Uud3N0LnhzbC51aS54c2xBY3Rpb25TZXQiKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIFR1cm4gb24gdGhlIEVkaXRvciBBcmVhCi0JCWxheW91dC5zZXRFZGl0b3JBcmVhVmlzaWJsZSh0cnVlKTsKLQkJbGF5b3V0LnNldEZpeGVkKGZhbHNlKTsKLQkJCi0JCS8vIEFkZCB0aGUgdmFyaW91cyB2aWV3cwotCQlJRm9sZGVyTGF5b3V0IGxlZnQgPQotICAgICAgICBsYXlvdXQuY3JlYXRlRm9sZGVyKCJsZWZ0IiwgSVBhZ2VMYXlvdXQuTEVGVCwgKGZsb2F0KSAwLjI2LCBlZGl0b3JBcmVhKTsgLy8kTk9OLU5MUy0xJAotCQlsZWZ0LmFkZFZpZXcoUHJvamVjdEV4cGxvcmVyLlZJRVdfSUQpOwotCQkKLQkJSUZvbGRlckxheW91dCByaWdodCA9IGxheW91dC5jcmVhdGVGb2xkZXIoInJpZ2h0IiwgSVBhZ2VMYXlvdXQuUklHSFQsIChmbG9hdCkgMC41MCwgZWRpdG9yQXJlYSk7IC8vJE5PTi1OTFMtMSQKLQkJcmlnaHQuYWRkVmlldyhJUGFnZUxheW91dC5JRF9PVVRMSU5FKTsKLQkJSUZvbGRlckxheW91dCBib3R0b21SaWdodCA9IGxheW91dC5jcmVhdGVGb2xkZXIoImJvdHRvbS1yaWdodCIsIElQYWdlTGF5b3V0LkJPVFRPTSwgKGZsb2F0KSAwLjUwLCAicmlnaHQiKTsKLQkJYm90dG9tUmlnaHQuYWRkVmlldygib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5UZW1wbGF0ZXNWaWV3Iik7Ci0JCQotCQkvLyBBZGQgT3V0bGluZSB0byB0aGUgYm90dG9tLWxlZnQKLQkJSUZvbGRlckxheW91dCBib3R0b21MZWZ0ID0gCi0JCQlsYXlvdXQuY3JlYXRlRm9sZGVyKCJib3R0b20tbGVmdCIsIElQYWdlTGF5b3V0LkJPVFRPTSwgKGZsb2F0KSAwLjUwLCAibGVmdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYm90dG9tTGVmdC5hZGRWaWV3KCJvcmcuZWNsaXBzZS53c3QueG1sLnZpZXdzLlhQYXRoVmlldyIpOyAvLyROT04tTkxTLTEkCi0JCS8vYm90dG9tTGVmdC5hZGRWaWV3KCJvcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLnVpLnZpZXdzLlhQYXRoTmF2aWdhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUlGb2xkZXJMYXlvdXQgYm90dG9tID0gbGF5b3V0LmNyZWF0ZUZvbGRlcigiYm90dG9tIiwgSVBhZ2VMYXlvdXQuQk9UVE9NLCAoZmxvYXQpIDAuNzUsIGVkaXRvckFyZWEpOyAvLyROT04tTkxTLTEkCi0JCWJvdHRvbS5hZGRWaWV3KElQYWdlTGF5b3V0LklEX1BST0JMRU1fVklFVyk7Ci0JCWJvdHRvbS5hZGRWaWV3KElQYWdlTGF5b3V0LklEX1BST1BfU0hFRVQpOwotCQlib3R0b20uYWRkVmlldyhJQ29uc29sZUNvbnN0YW50cy5JRF9DT05TT0xFX1ZJRVcpOwotCQlib3R0b20uYWRkVmlldygib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5zbmlwcGV0cy5pbnRlcm5hbC51aS5TbmlwcGV0c1ZpZXciKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJLy9sYXlvdXQuYWRkTmV3V2l6YXJkU2hvcnRjdXQoIm9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkcy5OZXdYTUxXaXphcmQiKTsgLy8kTk9OLU5MUy0xJAotCQlsYXlvdXQuYWRkTmV3V2l6YXJkU2hvcnRjdXQoIm9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwud2l6YXJkcy5OZXdTdHlsZXNoZWV0V2l6YXJkIik7IC8vJE5PTi1OTFMtMSQKLQkJLy9sYXlvdXQuYWRkTmV3V2l6YXJkU2hvcnRjdXQoIm9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwud2l6YXJkLk5ld0RURFdpemFyZCIpOyAvLyROT04tTkxTLTEkCi0JCS8vbGF5b3V0LmFkZE5ld1dpemFyZFNob3J0Y3V0KCJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLndpemFyZHMuTmV3WFNEV2l6YXJkIik7IC8vJE5PTi1OTFMtMSQKLQkJLy9sYXlvdXQuYWRkTmV3V2l6YXJkU2hvcnRjdXQoIm9yZy5lY2xpcHNlLndzdC53c2RsLnVpIik7IC8vJE5PTi1OTFMtMSQKLQkJLy9sYXlvdXQuYWRkTmV3V2l6YXJkU2hvcnRjdXQoIm9yZy5lY2xpcHNlLnVpLndpemFyZHMubmV3LmZvbGRlciIpOyAvLyROT04tTkxTLTEkCi0JCS8vbGF5b3V0LmFkZE5ld1dpemFyZFNob3J0Y3V0KCJhZGRpdGlvbnMiKTsKLQkJCi0JCWxheW91dC5hZGRQZXJzcGVjdGl2ZVNob3J0Y3V0KCJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5EZWJ1Z1BlcnNwZWN0aXZlIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JfQotCQotCS8qKgotCSAqIEFkZHMgVmlldyBzaG9ydCBjdXRzIHRvIHRoZSBYTUwgUGVyc3BlY3RpdmUuICBUaGUgc2hvcnQgY3V0cyBhZGRlZCBhcmU6Ci0JICogWFBhdGggTmF2aWdhdG9yCi0JICogUHJvamVjdEV4cGxvcmVyCi0JICogTmF2aWdhdG9yCi0JICogUHJvYmxlbXMgVmlldwotCSAqIENvbnNvbGUgVmlldyAKLQkgKiBAcGFyYW0gbGF5b3V0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFNob3J0Q3V0Vmlld3MoSVBhZ2VMYXlvdXQgbGF5b3V0KSB7Ci0JCWxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KCJvcmcuZWNsaXBzZS53c3QueG1sLnZpZXdzLlhQYXRoVmlldyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KCJvcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLnVpLnZpZXdzLlhQYXRoTmF2aWdhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkJbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoUHJvamVjdEV4cGxvcmVyLlZJRVdfSUQpOwotCQlsYXlvdXQuYWRkU2hvd1ZpZXdTaG9ydGN1dChJUGFnZUxheW91dC5JRF9SRVNfTkFWKTsKLSAgICAgICAgbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoSVBhZ2VMYXlvdXQuSURfT1VUTElORSk7Ci0gICAgICAgIGxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KElQYWdlTGF5b3V0LklEX1BST0JMRU1fVklFVyk7Ci0gICAgICAgIGxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KElDb25zb2xlQ29uc3RhbnRzLklEX0NPTlNPTEVfVklFVyk7Ci0gICAgICAgIGxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KCJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnNuaXBwZXRzLmludGVybmFsLnVpLlNuaXBwZXRzVmlldyIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRTaG9ydEN1dFBlcnNwZWN0aXZlKElQYWdlTGF5b3V0IGxheW91dCkgewotCQkKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvQWJzdHJhY3RWYWxpZGF0aW9uU2V0dGluZ3NQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvQWJzdHJhY3RWYWxpZGF0aW9uU2V0dGluZ3NQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZGZiNzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0Fic3RyYWN0VmFsaWRhdGlvblNldHRpbmdzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRGF2aWQgQ2FydmVyIChTVEFSKSAtIGJ1ZyAyMzAwNzIgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VkIG9uIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpIGNsYXNzIG9mCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc2FtZSBuYW1lLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlByb2plY3RTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5EZWZhdWx0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklTY29wZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZXNzYWdlQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuRXhwYW5zaW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuRXhwYW5zaW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5FeHBhbmRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLlNjcm9sbGVkUGFnZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkZyYW1ld29yazsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnByZWZzLkJhY2tpbmdTdG9yZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBCYXNlZCBvbiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuT3B0aW9uc0NvbmZpZ3VyYXRpb25CbG9jawotICovCi1hYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbGlkYXRpb25TZXR0aW5nc1BhZ2UgZXh0ZW5kcyBQcm9wZXJ0eVByZWZlcmVuY2VQYWdlIHsKLQotCXByaXZhdGUgTGlzdCBmQ29tYm9zOwotCXByaXZhdGUgTGlzdCBmRXhwYW5kYWJsZXM7Ci0JCi0JcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBmU2VsZWN0aW9uTGlzdGVuZXI7Ci0JCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZXNTZXJ2aWNlIGZQcmVmZXJlbmNlc1NlcnZpY2UgPSBudWxsOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRUSU5HU19FWFBBTkRFRCA9ICJleHBhbmRlZCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIFZhbGlkYXRpb25GcmFtZXdvcmsgZlZhbGlkYXRpb247Ci0JCi0JcHVibGljIEFic3RyYWN0VmFsaWRhdGlvblNldHRpbmdzUGFnZSgpIHsKLQkJc3VwZXIoKTsKLQkJZkNvbWJvcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZkV4cGFuZGFibGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmUHJlZmVyZW5jZXNTZXJ2aWNlID0gUGxhdGZvcm0uZ2V0UHJlZmVyZW5jZXNTZXJ2aWNlKCk7Ci0JCWZWYWxpZGF0aW9uID0gVmFsaWRhdGlvbkZyYW1ld29yay5nZXREZWZhdWx0KCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBDb21ibyB3aWRnZXQgaW4gdGhlIGNvbXBvc2l0ZSA8Y29kZT5wYXJlbnQ8L2NvZGU+LiBUaGUgZGF0YQotCSAqIGluIHRoZSBDb21ibyBpcyBhc3NvY2lhdGVkIHdpdGggPGNvZGU+a2V5PC9jb2RlPi4gVGhlIENvbWJvIGRhdGEgaXMKLQkgKiBnZW5lcmF0ZWQgYmFzZWQgb24gdGhlIGludGVnZXIgPGNvZGU+dmFsdWVzPC9jb2RlPiB3aGVyZSB0aGUgaW5kZXgKLQkgKiBvZiA8Y29kZT52YWx1ZXM8L2NvZGU+IGNvcnJlc3BvbmRzIHRvIHRoZSBpbmRleCBvZiA8Y29kZT52YWx1ZUxhYmVsczwvY29kZT4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBjb21wb3NpdGUgdG8gY3JlYXRlIHRoZSBjb21ibyBib3ggaW4KLQkgKiBAcGFyYW0gbGFiZWwgdGhlIGxhYmVsIHRvIGdpdmUgdGhlIGNvbWJvIGJveAotCSAqIEBwYXJhbSBrZXkgdGhlIHVuaXF1ZSBrZXkgdG8gaWRlbnRpZnkgdGhlIGNvbWJvIGJveAotCSAqIEBwYXJhbSB2YWx1ZXMgdGhlIHZhbHVlcyByZXByZXNlbnRlZCBieSB0aGUgY29tYm8gb3B0aW9ucwotCSAqIEBwYXJhbSB2YWx1ZUxhYmVscyB0aGUgY2FsdWVzIGRpc3BsYXllZCBpbiB0aGUgY29tYm8gYm94Ci0JICogQHBhcmFtIGluZGVudCBob3cgZmFyIHRvIGluZGVudCB0aGUgY29tYm8gYm94IGxhYmVsCi0JICogCi0JICogQHJldHVybiB0aGUgZ2VuZXJhdGVkIGNvbWJvIGJveAotCSAqLwotCXByb3RlY3RlZCBDb21ibyBhZGRDb21ib0JveChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwsIFN0cmluZyBrZXksIGludFtdIHZhbHVlcywgU3RyaW5nW10gdmFsdWVMYWJlbHMsIGludCBpbmRlbnQpIHsKLQkJR3JpZERhdGEgZ2Q9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5DRU5URVIsIHRydWUsIGZhbHNlLCAyLCAxKTsKLQkJZ2QuaG9yaXpvbnRhbEluZGVudD0gaW5kZW50OwotCQkJCQotCQlMYWJlbCBsYWJlbENvbnRyb2w9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5MRUZUKTsKLQkJbGFiZWxDb250cm9sLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0RGlhbG9nRm9udCgpKTsKLQkJbGFiZWxDb250cm9sLnNldFRleHQobGFiZWwpOwotCQlsYWJlbENvbnRyb2wuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQkJCi0JCUNvbWJvIGNvbWJvQm94PSBuZXdDb21ib0NvbnRyb2wocGFyZW50LCBrZXksIHZhbHVlcywgdmFsdWVMYWJlbHMpOwotCQljb21ib0JveC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQotCQlyZXR1cm4gY29tYm9Cb3g7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBjb21ibyBib3ggYW5kIGFzc29jaWF0ZXMgdGhlIGNvbWJvIGRhdGEgd2l0aCB0aGUKLQkgKiBjb21ibyBib3guCi0JICogCi0JICogQHBhcmFtIGNvbXBvc2l0ZSB0aGUgY29tcG9zaXRlIHRvIGNyZWF0ZSB0aGUgY29tYm8gYm94IGluCi0JICogQHBhcmFtIGtleSB0aGUgdW5pcXVlIGtleSB0byBpZGVudGlmeSB0aGUgY29tYm8gYm94Ci0JICogQHBhcmFtIHZhbHVlcyB0aGUgdmFsdWVzIHJlcHJlc2VudGVkIGJ5IHRoZSBjb21ibyBvcHRpb25zCi0JICogQHBhcmFtIHZhbHVlTGFiZWxzIHRoZSB2YWx1ZXMgZGlzcGxheWVkIGluIHRoZSBjb21ibyBib3gKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBnZW5lcmF0ZWQgY29tYm8gYm94Ci0JICovCi0JcHJvdGVjdGVkIENvbWJvIG5ld0NvbWJvQ29udHJvbChDb21wb3NpdGUgY29tcG9zaXRlLCBTdHJpbmcga2V5LCBpbnRbXSB2YWx1ZXMsIFN0cmluZ1tdIHZhbHVlTGFiZWxzKSB7Ci0JCUNvbWJvRGF0YSBkYXRhID0gbmV3IENvbWJvRGF0YShrZXksIHZhbHVlcywgLTEpOwotCQkKLQkJQ29tYm8gY29tYm9Cb3g9IG5ldyBDb21ibyhjb21wb3NpdGUsIFNXVC5SRUFEX09OTFkpOwotCQljb21ib0JveC5zZXRJdGVtcyh2YWx1ZUxhYmVscyk7Ci0JCWNvbWJvQm94LnNldERhdGEoZGF0YSk7Ci0JCWNvbWJvQm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKGdldFNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCQljb21ib0JveC5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldERpYWxvZ0ZvbnQoKSk7Ci0JCQkKLQkJbWFrZVNjcm9sbGFibGVDb21wb3NpdGVBd2FyZShjb21ib0JveCk7Ci0JCQotCQlpbnQgc2V2ZXJpdHkgPSAtMTsKLQkJaWYoa2V5ICE9IG51bGwpCi0JCQlzZXZlcml0eSA9IGZQcmVmZXJlbmNlc1NlcnZpY2UuZ2V0SW50KGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCksIGtleSwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORywgY3JlYXRlUHJlZmVyZW5jZVNjb3BlcygpKTsKLQotCQlpZiAoc2V2ZXJpdHkgPT0gVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IgfHwgc2V2ZXJpdHkgPT0gVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyB8fCBzZXZlcml0eSA9PSBWYWxpZGF0aW9uTWVzc2FnZS5JR05PUkUpIHsKLQkJCWRhdGEuc2V0U2V2ZXJpdHkoc2V2ZXJpdHkpOwotCQkJZGF0YS5vcmlnaW5hbFNldmVyaXR5ID0gc2V2ZXJpdHk7Ci0JCX0KLQkJCi0JCWlmKGRhdGEuZ2V0SW5kZXgoKSA+PSAwKQotCQkJY29tYm9Cb3guc2VsZWN0KGRhdGEuZ2V0SW5kZXgoKSk7Ci0JCQotCQlmQ29tYm9zLmFkZChjb21ib0JveCk7Ci0JCXJldHVybiBjb21ib0JveDsKLQl9Ci0JCi0JcHJvdGVjdGVkIFNlbGVjdGlvbkxpc3RlbmVyIGdldFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlpZiAoZlNlbGVjdGlvbkxpc3RlbmVyID09IG51bGwpIHsKLQkJCWZTZWxlY3Rpb25MaXN0ZW5lcj0gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQotCQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJY29udHJvbENoYW5nZWQoZS53aWRnZXQpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGZTZWxlY3Rpb25MaXN0ZW5lcjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY29udHJvbENoYW5nZWQoV2lkZ2V0IHdpZGdldCkgewotCQlDb21ib0RhdGEgZGF0YT0gKENvbWJvRGF0YSkgd2lkZ2V0LmdldERhdGEoKTsKLQkJaWYgKHdpZGdldCBpbnN0YW5jZW9mIENvbWJvKSB7Ci0JCQlkYXRhLnNldEluZGV4KCgoQ29tYm8pd2lkZ2V0KS5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdFNldHRpbmdzUGFnZSNzdG9yZVZhbHVlcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0JCWlmKGZDb21ib3MgPT0gbnVsbCB8fCBmQ29tYm9zLnNpemUoKSA9PSAwKQotCQkJcmV0dXJuOwotCQkKLQkJSXRlcmF0b3IgaXQgPSBmQ29tYm9zLml0ZXJhdG9yKCk7Ci0JCQotCQlJU2NvcGVDb250ZXh0W10gY29udGV4dHMgPSBjcmVhdGVQcmVmZXJlbmNlU2NvcGVzKCk7Ci0KLQkJd2hpbGUoaXQuaGFzTmV4dCgpKSB7Ci0JCQlDb21ib0RhdGEgZGF0YSA9IChDb21ib0RhdGEpICgoQ29tYm8paXQubmV4dCgpKS5nZXREYXRhKCk7Ci0JCQlpZihkYXRhLmdldEtleSgpICE9IG51bGwpIHsKLQkJCQljb250ZXh0c1swXS5nZXROb2RlKGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCkpLnB1dEludChkYXRhLmdldEtleSgpLCBkYXRhLmdldFNldmVyaXR5KCkpOwotCQkJfQotCQl9Ci0JCQotCQlmb3IoaW50IGkgPSAwOyBpIDwgY29udGV4dHMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJY29udGV4dHNbaV0uZ2V0Tm9kZShnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpKS5mbHVzaCgpOwotCQkJfQotCQkJY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCi0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIEV4cGFuZGFibGVDb21wb3NpdGUgZ2V0UGFyZW50RXhwYW5kYWJsZUNvbXBvc2l0ZShDb250cm9sIGNvbnRyb2wpIHsKLQkJQ29udHJvbCBwYXJlbnQ9IGNvbnRyb2wuZ2V0UGFyZW50KCk7Ci0JCXdoaWxlICghKHBhcmVudCBpbnN0YW5jZW9mIEV4cGFuZGFibGVDb21wb3NpdGUpICYmIHBhcmVudCAhPSBudWxsKSB7Ci0JCQlwYXJlbnQ9IHBhcmVudC5nZXRQYXJlbnQoKTsKLQkJfQotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgRXhwYW5kYWJsZUNvbXBvc2l0ZSkgewotCQkJcmV0dXJuIChFeHBhbmRhYmxlQ29tcG9zaXRlKSBwYXJlbnQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBFeHBhbmRhYmxlQ29tcG9zaXRlIGNyZWF0ZVR3aXN0aWUoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsLCBpbnQgbkNvbHVtbnMpIHsKLQkJRXhwYW5kYWJsZUNvbXBvc2l0ZSBleGNvbXBvc2l0ZT0gbmV3IEV4cGFuZGFibGVDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5UV0lTVElFIHwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5DTElFTlRfSU5ERU5UKTsKLQkJZXhjb21wb3NpdGUuc2V0VGV4dChsYWJlbCk7Ci0JCWV4Y29tcG9zaXRlLnNldEV4cGFuZGVkKGZhbHNlKTsKLQkJZXhjb21wb3NpdGUuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXRGb250UmVnaXN0cnkoKS5nZXRCb2xkKEpGYWNlUmVzb3VyY2VzLkRJQUxPR19GT05UKSk7Ci0JCWV4Y29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkZJTEwsIHRydWUsIGZhbHNlLCBuQ29sdW1ucywgMSkpOwotCQlleGNvbXBvc2l0ZS5hZGRFeHBhbnNpb25MaXN0ZW5lcihuZXcgRXhwYW5zaW9uQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgZXhwYW5zaW9uU3RhdGVDaGFuZ2VkKEV4cGFuc2lvbkV2ZW50IGUpIHsKLQkJCQlleHBhbmRlZFN0YXRlQ2hhbmdlZCgoRXhwYW5kYWJsZUNvbXBvc2l0ZSkgZS5nZXRTb3VyY2UoKSk7Ci0JCQl9Ci0JCX0pOwotCQlmRXhwYW5kYWJsZXMuYWRkKGV4Y29tcG9zaXRlKTsKLQkJbWFrZVNjcm9sbGFibGVDb21wb3NpdGVBd2FyZShleGNvbXBvc2l0ZSk7Ci0JCXJldHVybiBleGNvbXBvc2l0ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZXhwYW5kZWRTdGF0ZUNoYW5nZWQoRXhwYW5kYWJsZUNvbXBvc2l0ZSBleHBhbmRhYmxlKSB7Ci0JCVNjcm9sbGVkUGFnZUNvbnRlbnQgcGFyZW50U2Nyb2xsZWRDb21wb3NpdGU9IGdldFBhcmVudFNjcm9sbGVkQ29tcG9zaXRlKGV4cGFuZGFibGUpOwotCQlpZiAocGFyZW50U2Nyb2xsZWRDb21wb3NpdGUgIT0gbnVsbCkgewotCQkJcGFyZW50U2Nyb2xsZWRDb21wb3NpdGUucmVmbG93KHRydWUpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBtYWtlU2Nyb2xsYWJsZUNvbXBvc2l0ZUF3YXJlKENvbnRyb2wgY29udHJvbCkgewotCQlTY3JvbGxlZFBhZ2VDb250ZW50IHBhcmVudFNjcm9sbGVkQ29tcG9zaXRlPSBnZXRQYXJlbnRTY3JvbGxlZENvbXBvc2l0ZShjb250cm9sKTsKLQkJaWYgKHBhcmVudFNjcm9sbGVkQ29tcG9zaXRlICE9IG51bGwpIHsKLQkJCXBhcmVudFNjcm9sbGVkQ29tcG9zaXRlLmFkYXB0Q2hpbGQoY29udHJvbCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIFNjcm9sbGVkUGFnZUNvbnRlbnQgZ2V0UGFyZW50U2Nyb2xsZWRDb21wb3NpdGUoQ29udHJvbCBjb250cm9sKSB7Ci0JCUNvbnRyb2wgcGFyZW50PSBjb250cm9sLmdldFBhcmVudCgpOwotCQl3aGlsZSAoIShwYXJlbnQgaW5zdGFuY2VvZiBTY3JvbGxlZFBhZ2VDb250ZW50KSAmJiBwYXJlbnQgIT0gbnVsbCkgewotCQkJcGFyZW50PSBwYXJlbnQuZ2V0UGFyZW50KCk7Ci0JCX0KLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFNjcm9sbGVkUGFnZUNvbnRlbnQpIHsKLQkJCXJldHVybiAoU2Nyb2xsZWRQYWdlQ29udGVudCkgcGFyZW50OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZVNlY3Rpb25FeHBhbnNpb25TdGF0ZXMoSURpYWxvZ1NldHRpbmdzIHNlY3Rpb24pIHsKLQkJZm9yKGludCBpID0gMDsgaSA8IGZFeHBhbmRhYmxlcy5zaXplKCk7IGkrKykgewotCQkJRXhwYW5kYWJsZUNvbXBvc2l0ZSBjb21wID0gKEV4cGFuZGFibGVDb21wb3NpdGUpIGZFeHBhbmRhYmxlcy5nZXQoaSk7Ci0JCQlzZWN0aW9uLnB1dChTRVRUSU5HU19FWFBBTkRFRCArIFN0cmluZy52YWx1ZU9mKGkpLCBjb21wLmlzRXhwYW5kZWQoKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVzdG9yZVNlY3Rpb25FeHBhbnNpb25TdGF0ZXMoSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzKSB7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBmRXhwYW5kYWJsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUV4cGFuZGFibGVDb21wb3NpdGUgZXhjb21wb3NpdGU9IChFeHBhbmRhYmxlQ29tcG9zaXRlKSBmRXhwYW5kYWJsZXMuZ2V0KGkpOwotCQkJaWYgKHNldHRpbmdzID09IG51bGwpIHsKLQkJCQlleGNvbXBvc2l0ZS5zZXRFeHBhbmRlZChpID09IDApOyAvLyBvbmx5IGV4cGFuZCB0aGUgZmlyc3Qgbm9kZSBieSBkZWZhdWx0Ci0JCQl9IGVsc2UgewotCQkJCWV4Y29tcG9zaXRlLnNldEV4cGFuZGVkKHNldHRpbmdzLmdldEJvb2xlYW4oU0VUVElOR1NfRVhQQU5ERUQgKyBTdHJpbmcudmFsdWVPZihpKSkpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlc2V0U2V2ZXJpdGllcygpIHsKLQkJSUVjbGlwc2VQcmVmZXJlbmNlcyBkZWZhdWx0Q29udGV4dCA9IG5ldyBEZWZhdWx0U2NvcGUoKS5nZXROb2RlKGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCkpOwotCQlmb3IoaW50IGkgPSAwOyBpIDwgZkNvbWJvcy5zaXplKCk7IGkrKykgewotCQkJQ29tYm9EYXRhIGRhdGEgPSAoQ29tYm9EYXRhKSgoQ29tYm8pZkNvbWJvcy5nZXQoaSkpLmdldERhdGEoKTsKLQkJCWludCBzZXZlcml0eSA9IGRlZmF1bHRDb250ZXh0LmdldEludChkYXRhLmdldEtleSgpLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJCWRhdGEuc2V0U2V2ZXJpdHkoc2V2ZXJpdHkpOwotCQkJKChDb21ibylmQ29tYm9zLmdldChpKSkuc2VsZWN0KGRhdGEuZ2V0SW5kZXgoKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkUmV2YWxpZGF0ZU9uU2V0dGluZ3NDaGFuZ2UoKSB7Ci0JCUl0ZXJhdG9yIGl0ID0gZkNvbWJvcy5pdGVyYXRvcigpOwotCi0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCUNvbWJvRGF0YSBkYXRhID0gKENvbWJvRGF0YSkgKChDb21ibykgaXQubmV4dCgpKS5nZXREYXRhKCk7Ci0JCQlpZiAoZGF0YS5pc0NoYW5nZWQoKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJaWYoc3VwZXIucGVyZm9ybU9rKCkgJiYgc2hvdWxkUmV2YWxpZGF0ZU9uU2V0dGluZ3NDaGFuZ2UoKSkgewotCQkJTWVzc2FnZUJveCBtYiA9IG5ldyBNZXNzYWdlQm94KHRoaXMuZ2V0U2hlbGwoKSwgU1dULkFQUExJQ0FUSU9OX01PREFMIHwgU1dULllFUyB8IFNXVC5OTyB8IFNXVC5DQU5DRUwgfCBTV1QuSUNPTl9JTkZPUk1BVElPTiB8IFNXVC5SSUdIVCk7Ci0JCQltYi5zZXRUZXh0KCJYU0wgVmFsaWRhdGlvbiIpOwotCQkJLyogQ2hvb3NlIHdoaWNoIG1lc3NhZ2UgdG8gdXNlIGJhc2VkIG9uIGlmIGl0cyBwcm9qZWN0IG9yIHdvcmtzcGFjZSBzZXR0aW5ncyAqLwotCQkJU3RyaW5nIG1zZyA9IChnZXRQcm9qZWN0KCkgPT0gbnVsbCkgPyAiWFNMIFdvcmtzcGFjZSBWYWxpZGF0aW9uIiA6ICJYU0wgUHJvamVjdCBMZXZlbCBWYWxpZGF0aW9uIjsKLQkJCW1iLnNldE1lc3NhZ2UobXNnKTsKLQkJCXN3aXRjaChtYi5vcGVuKCkpIHsKLQkJCQljYXNlIFNXVC5DQU5DRUw6Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQljYXNlIFNXVC5ZRVM6Ci0JCQkJCVZhbGlkYXRlSm9iIGpvYiA9IG5ldyBWYWxpZGF0ZUpvYigiWFNMIFZhbGlkYXRpb24gSm9iIik7Ci0JCQkJCWpvYi5zY2hlZHVsZSgpOwotCQkJCWNhc2UgU1dULk5POgotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBQZXJmb3JtcyB2YWxpZGF0aW9uIGFmdGVyIHZhbGlkYXRpb24gcHJlZmVyZW5jZXMgaGF2ZSBiZWVuIG1vZGlmaWVkLgotCSAqLwotCXByaXZhdGUgY2xhc3MgVmFsaWRhdGVKb2IgZXh0ZW5kcyBKb2IgewotCQkKLQkJcHVibGljIFZhbGlkYXRlSm9iKFN0cmluZyBuYW1lKSB7Ci0JCQlzdXBlcihuYW1lKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCQl0cnkgewotCQkJCUlQcm9qZWN0W10gcHJvamVjdHMgPSBudWxsOwotCQkJCS8qIENoYW5nZWQgcHJlZmVyZW5jZXMgZm9yIGEgc2luZ2xlIHByb2plY3QsIG9ubHkgdmFsaWRhdGUgaXQgKi8KLQkJCQlpZihnZXRQcm9qZWN0KCkgIT0gbnVsbCkKLQkJCQkJcHJvamVjdHMgPSBuZXcgSVByb2plY3RbXSB7Z2V0UHJvamVjdCgpfTsKLQkJCQkvKiBXb3Jrc3BhY2Utd2lkZSBwcmVmZXJlbmNlcyBjaGFuZ2VkICovCi0JCQkJZWxzZSB7Ci0JCQkJCS8qIEdldCBhbGwgb2YgdGhlIHByb2plY3RzIGluIHRoZSB3b3Jrc3BhY2UgKi8KLQkJCQkJcHJvamVjdHMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0JCQkJCUlFY2xpcHNlUHJlZmVyZW5jZXMgcHJlZnMgPSBudWxsOwotCQkJCQlMaXN0IHByb2plY3RMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkKLQkJCQkJLyogRmlsdGVyIG91dCBwcm9qZWN0cyB0aGF0IHVzZSBwcm9qZWN0LXNwZWNpZmljIHNldHRpbmdzIG9yIGhhdmUgYmVlbiBjbG9zZWQgKi8KLQkJCQkJZm9yKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlwcmVmcyA9IG5ldyBQcm9qZWN0U2NvcGUocHJvamVjdHNbaV0pLmdldE5vZGUoZ2V0UHJlZmVyZW5jZU5vZGVRdWFsaWZpZXIoKSk7Ci0JCQkJCQlpZihwcm9qZWN0c1tpXS5pc0FjY2Vzc2libGUoKSAmJiAhcHJlZnMuZ2V0Qm9vbGVhbihnZXRQcm9qZWN0U2V0dGluZ3NLZXkoKSwgZmFsc2UpKQotCQkJCQkJCXByb2plY3RMaXN0LmFkZChwcm9qZWN0c1tpXSk7Ci0JCQkJCX0KLQkJCQkJcHJvamVjdHMgPSAoSVByb2plY3RbXSkgcHJvamVjdExpc3QudG9BcnJheShuZXcgSVByb2plY3RbcHJvamVjdExpc3Quc2l6ZSgpXSk7Ci0JCQkJfQotCQkJCWZWYWxpZGF0aW9uLnZhbGlkYXRlKHByb2plY3RzLCB0cnVlLCBmYWxzZSwgbW9uaXRvcik7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCXN0YXR1cyA9IFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQkJfQotCQkJCi0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0JCQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9BYnN0cmFjdFhTTFByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvQWJzdHJhY3RYU0xQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTJhN2QwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9BYnN0cmFjdFhTTFByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuRXhwYW5zaW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuRXhwYW5zaW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5FeHBhbmRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQWJzdHJhY3RQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLlNjcm9sbGVkUGFnZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLlhTTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5YU0xVSVBsdWdpbjsKLQotLyoqCi0gKiBBdWdtZW50cyB0aGUgU1NFIDxjb2RlPkFic3RyYWN0UHJlZmVyZW5jZVBhZ2U8L2NvZGU+IHdpdGggc3VwcG9ydCBmb3IgZXhwYW5kYWJsZSBjb21wb3NpdGVzICh0d2lzdGllcykgYW5kIGNvbWJvcy4KLSAqIAotICogQGF1dGhvciBEb3VnIFNhdGNod2VsbAotICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkFic3RyYWN0UHJlZmVyZW5jZVBhZ2UKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0WFNMUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VQYWdlCi17Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgU0VUVElOR1NfRVhQQU5ERUQgPSBnZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSsiLlNFVFRJTkdTX0VYUEFOREVEIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgU3RyaW5nIFNFVFRJTkdTX1NFQ1RJT05fTkFNRSA9IGdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKyIuU0VUVElOR1NfU0VDVElPTl9OQU1FIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBMaXN0PEV4cGFuZGFibGVDb21wb3NpdGU+IGZFeHBhbmRhYmxlcyA9IG5ldyBBcnJheUxpc3Q8RXhwYW5kYWJsZUNvbXBvc2l0ZT4oKTsKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBmaW5hbCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpCi0JewotCQljcmVhdGVDb21tb25Db250ZW50cyhwYXJlbnQpOwotCQlsb2FkUHJlZmVyZW5jZXMoKTsKLQkJcmVzdG9yZVNlY3Rpb25FeHBhbnNpb25TdGF0ZXMoZ2V0RGlhbG9nU2V0dGluZ3MoKS5nZXRTZWN0aW9uKFNFVFRJTkdTX1NFQ1RJT05fTkFNRSkpOwotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCS8qKgotCSAqIENhbGxlZCBieSBjcmVhdGVDb250ZW50cyBhbmQgbXVzdCBiZSBpbXBsZW1lbnRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHJldHVybiB0aGUgY29tcG9zaXRlCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IENvbXBvc2l0ZSBjcmVhdGVDb21tb25Db250ZW50cyhDb21wb3NpdGUgcGFyZW50KTsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVHdpc3RpZShDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwsIGludCBjb2xzKQotCXsKLQkJRXhwYW5kYWJsZUNvbXBvc2l0ZSBleGNvbXBvc2l0ZSA9IG5ldyBFeHBhbmRhYmxlQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUsIEV4cGFuZGFibGVDb21wb3NpdGUuVFdJU1RJRSB8IEV4cGFuZGFibGVDb21wb3NpdGUuQ0xJRU5UX0lOREVOVCk7Ci0JCWV4Y29tcG9zaXRlLnNldFRleHQobGFiZWwpOwotCQlleGNvbXBvc2l0ZS5zZXRFeHBhbmRlZChmYWxzZSk7Ci0JCWV4Y29tcG9zaXRlLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udFJlZ2lzdHJ5KCkuZ2V0Qm9sZChKRmFjZVJlc291cmNlcy5ESUFMT0dfRk9OVCkpOwotCQlleGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5GSUxMLCB0cnVlLCBmYWxzZSwgY29scywgMSkpOwotCQlleGNvbXBvc2l0ZS5hZGRFeHBhbnNpb25MaXN0ZW5lcihuZXcgRXhwYW5zaW9uQWRhcHRlcigpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgZXhwYW5zaW9uU3RhdGVDaGFuZ2VkKEV4cGFuc2lvbkV2ZW50IGUpCi0JCQl7Ci0JCQkJZXhwYW5kZWRTdGF0ZUNoYW5nZWQoKEV4cGFuZGFibGVDb21wb3NpdGUpIGUuZ2V0U291cmNlKCkpOwotCQkJfQotCQl9KTsKLQkJZkV4cGFuZGFibGVzLmFkZChleGNvbXBvc2l0ZSk7Ci0JCW1ha2VTY3JvbGxhYmxlQ29tcG9zaXRlQXdhcmUoZXhjb21wb3NpdGUpOwotCi0JCUNvbXBvc2l0ZSB0d2lzdGllQ2llbnQgPSBuZXcgQ29tcG9zaXRlKGV4Y29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWV4Y29tcG9zaXRlLnNldENsaWVudCh0d2lzdGllQ2llbnQpOwotCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luUmlnaHQgPSA1OwotCQl0d2lzdGllQ2llbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5OT05FLCB0cnVlLCBmYWxzZSk7Ci0JCXR3aXN0aWVDaWVudC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlyZXR1cm4gdHdpc3RpZUNpZW50OwotCX0KLQotCXByaXZhdGUgZmluYWwgdm9pZCBleHBhbmRlZFN0YXRlQ2hhbmdlZChFeHBhbmRhYmxlQ29tcG9zaXRlIGV4cGFuZGFibGUpCi0JewotCQlTY3JvbGxlZFBhZ2VDb250ZW50IHBhcmVudFNjcm9sbGVkQ29tcG9zaXRlID0gZ2V0UGFyZW50U2Nyb2xsZWRDb21wb3NpdGUoZXhwYW5kYWJsZSk7Ci0JCWlmIChwYXJlbnRTY3JvbGxlZENvbXBvc2l0ZSAhPSBudWxsKQotCQl7Ci0JCQlwYXJlbnRTY3JvbGxlZENvbXBvc2l0ZS5yZWZsb3codHJ1ZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbWFrZVNjcm9sbGFibGVDb21wb3NpdGVBd2FyZShDb250cm9sIGNvbnRyb2wpCi0JewotCQlTY3JvbGxlZFBhZ2VDb250ZW50IHBhcmVudFNjcm9sbGVkQ29tcG9zaXRlID0gZ2V0UGFyZW50U2Nyb2xsZWRDb21wb3NpdGUoY29udHJvbCk7Ci0JCWlmIChwYXJlbnRTY3JvbGxlZENvbXBvc2l0ZSAhPSBudWxsKQotCQl7Ci0JCQlwYXJlbnRTY3JvbGxlZENvbXBvc2l0ZS5hZGFwdENoaWxkKGNvbnRyb2wpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTY3JvbGxlZFBhZ2VDb250ZW50IGdldFBhcmVudFNjcm9sbGVkQ29tcG9zaXRlKENvbnRyb2wgY29udHJvbCkKLQl7Ci0JCUNvbnRyb2wgcGFyZW50ID0gY29udHJvbC5nZXRQYXJlbnQoKTsKLQkJd2hpbGUgKCEocGFyZW50IGluc3RhbmNlb2YgU2Nyb2xsZWRQYWdlQ29udGVudCkgJiYgcGFyZW50ICE9IG51bGwpCi0JCXsKLQkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKTsKLQkJfQotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgU2Nyb2xsZWRQYWdlQ29udGVudCkKLQkJewotCQkJcmV0dXJuIChTY3JvbGxlZFBhZ2VDb250ZW50KSBwYXJlbnQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIENvbWJvIGNyZWF0ZUNvbWJvKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbCwgU3RyaW5nIHByZWZLZXkpCi0JewotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5DRU5URVIsIHRydWUsIGZhbHNlLCAxLCAxKTsKLQotCQlMYWJlbCBsYWJlbENvbnRyb2wgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTEVGVCk7Ci0JCWxhYmVsQ29udHJvbC5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldERpYWxvZ0ZvbnQoKSk7Ci0JCWxhYmVsQ29udHJvbC5zZXRUZXh0KGxhYmVsKTsKLQkJbGFiZWxDb250cm9sLnNldExheW91dERhdGEoZ2QpOwotCi0JCUNvbWJvIGNvbWJvID0gY3JlYXRlRHJvcERvd25Cb3gocGFyZW50KTsKLQkJY29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCWNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0b3JlU2VjdGlvbkV4cGFuc2lvblN0YXRlcyhJRGlhbG9nU2V0dGluZ3Mgc2VjdGlvbikKLQl7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZkV4cGFuZGFibGVzLnNpemUoKTsgaSsrKQotCQl7Ci0JCQlFeHBhbmRhYmxlQ29tcG9zaXRlIGNvbXAgPSBmRXhwYW5kYWJsZXMuZ2V0KGkpOwotCQkJc2VjdGlvbi5wdXQoU0VUVElOR1NfRVhQQU5ERUQgKyBTdHJpbmcudmFsdWVPZihpKSwgY29tcC5pc0V4cGFuZGVkKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJRGlhbG9nU2V0dGluZ3MgZ2V0RGlhbG9nU2V0dGluZ3MoKQotCXsKLQkJcmV0dXJuIFhTTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBleHBhbnNpb24gc3RhdGVzIGJlZm9yZSBjYWxsaW5nIHN1cGVyLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2dQYWdlI2Rpc3Bvc2UoKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotCXsKLQkJc3RvcmVTZWN0aW9uRXhwYW5zaW9uU3RhdGVzKGdldERpYWxvZ1NldHRpbmdzKCkuYWRkTmV3U2VjdGlvbihTRVRUSU5HU19TRUNUSU9OX05BTUUpKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZXN0b3JlU2VjdGlvbkV4cGFuc2lvblN0YXRlcyhJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MpCi0JewotCQlmb3IgKGludCBpID0gMDsgaSA8IGZFeHBhbmRhYmxlcy5zaXplKCk7IGkrKykKLQkJewotCQkJRXhwYW5kYWJsZUNvbXBvc2l0ZSBleGNvbXBvc2l0ZSA9IGZFeHBhbmRhYmxlcy5nZXQoaSk7Ci0JCQlpZiAoc2V0dGluZ3MgPT0gbnVsbCkKLQkJCXsKLQkJCQlleGNvbXBvc2l0ZS5zZXRFeHBhbmRlZChpID09IDApOyAvLyBvbmx5IGV4cGFuZCB0aGUgZmlyc3Qgbm9kZSBieSBkZWZhdWx0Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJZXhjb21wb3NpdGUuc2V0RXhwYW5kZWQoc2V0dGluZ3MuZ2V0Qm9vbGVhbihTRVRUSU5HU19FWFBBTkRFRCArIFN0cmluZy52YWx1ZU9mKGkpKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZXMgZ2V0TW9kZWxQcmVmZXJlbmNlcygpCi0JewotCQlyZXR1cm4gWFNMQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlIHRoZSBwcmVmZXJlbmNlcy4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQWJzdHJhY3RQcmVmZXJlbmNlUGFnZSNwZXJmb3JtT2soKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpCi0JewotCQlib29sZWFuIG9rID0gc3VwZXIucGVyZm9ybU9rKCk7Ci0JCWlmIChvaykKLQkJCVhTTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlyZXR1cm4gb2s7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0NvbWJvRGF0YS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0NvbWJvRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDM0NmVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9Db21ib0RhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotY2xhc3MgQ29tYm9EYXRhIHsKLQlwcml2YXRlIFN0cmluZyBmS2V5OwotCXByaXZhdGUgaW50W10gZlNldmVyaXRpZXM7Ci0JcHJpdmF0ZSBpbnQgZkluZGV4OwotCWludCBvcmlnaW5hbFNldmVyaXR5ID0gLTI7Ci0JCi0JcHVibGljIENvbWJvRGF0YShTdHJpbmcga2V5LCBpbnRbXSBzZXZlcml0aWVzLCBpbnQgaW5kZXgpIHsKLQkJZktleSA9IGtleTsKLQkJZlNldmVyaXRpZXMgPSBzZXZlcml0aWVzOwotCQlmSW5kZXggPSBpbmRleDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBmS2V5OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRJbmRleChpbnQgaW5kZXgpIHsKLQkJZkluZGV4ID0gaW5kZXg7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0SW5kZXgoKSB7Ci0JCXJldHVybiBmSW5kZXg7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHNldmVyaXR5IGluZGV4IGJhc2VkIG9uIDxjb2RlPnNldmVyaXR5PC9jb2RlPi4KLQkgKiBJZiB0aGUgc2V2ZXJpdHkgZG9lc24ndCBleGlzdCwgdGhlIGluZGV4IGlzIHNldCB0byAtMS4KLQkgKiAKLQkgKiBAcGFyYW0gc2V2ZXJpdHkgdGhlIHNldmVyaXR5IGxldmVsCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2V2ZXJpdHkoaW50IHNldmVyaXR5KSB7Ci0JCWZvcihpbnQgaSA9IDA7IGZTZXZlcml0aWVzICE9IG51bGwgJiYgaSA8IGZTZXZlcml0aWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZihmU2V2ZXJpdGllc1tpXSA9PSBzZXZlcml0eSkgewotCQkJCWZJbmRleCA9IGk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCQotCQlmSW5kZXggPSAtMTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRTZXZlcml0eSgpIHsKLQkJcmV0dXJuIChmSW5kZXggPj0gMCAmJiBmU2V2ZXJpdGllcyAhPSBudWxsICYmIGZJbmRleCA8IGZTZXZlcml0aWVzLmxlbmd0aCkgPyBmU2V2ZXJpdGllc1tmSW5kZXhdIDogLTE7Ci0JfQotCQotCWJvb2xlYW4gaXNDaGFuZ2VkKCkgewotCQlyZXR1cm4gZlNldmVyaXRpZXNbZkluZGV4XSAhPSBvcmlnaW5hbFNldmVyaXR5OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9NYWluUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9NYWluUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFiMDQzMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvTWFpblByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBTVEFSIC0gYnVnIDIxMzg1MyAtIE1vdmVkIG1haW4gcHJlZmVyZW5jZSBwYWdlIG91dCBvZgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcgdWkgYW5kIGludG8gWFNMIHVpLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci0KLS8qKgotICogCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTWFpblByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UKLXsKLQkvKioKLQkgKiBNYWluUHJlZmVybmNlUGFnZSBpcyB0aGUgY29uc3RydWN0b3IgZm9yIHRoZSBYU0wgUHJlZmVyZW5jZSBQYWdlCi0JICovCi0JcHVibGljIE1haW5QcmVmZXJlbmNlUGFnZSgpCi0JewotCQlzdXBlcigpOwotCQlub0RlZmF1bHRBbmRBcHBseUJ1dHRvbigpOwotCX0KLQotCS8qKiAKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpCi0JewotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBhbmNlc3RvcikKLQl7Ci0JCWluaXRpYWxpemVEaWFsb2dVbml0cyhhbmNlc3Rvcik7Ci0KLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlhbmNlc3Rvci5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChhbmNlc3RvciwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLk1haW5QcmVmZXJlbmNlUGFnZSk7Ci0JCQotCQlhcHBseURpYWxvZ0ZvbnQoYW5jZXN0b3IpOwotCQlyZXR1cm4gYW5jZXN0b3I7Ci0JfQotCi0JLyoqIAotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybU9rKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKQotCXsKLQkJcmV0dXJuIHN1cGVyLnBlcmZvcm1PaygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9Qcm9wZXJ0eVByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvUHJvcGVydHlQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTAxNjVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9Qcm9wZXJ0eVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEYXZpZCBDYXJ2ZXIgKFNUQVIpIC0gYnVnIDIzMDA3MiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZWQgb24gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkgY2xhc3Mgb2YKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzYW1lIG5hbWUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5Qcm9qZWN0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuRGVmYXVsdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JU2NvcGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JbnN0YW5jZVNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuQ29udHJvbEVuYWJsZVN0YXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRGVjb3JhdGluZ0xhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5MaXN0RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZXNVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJvcGVydHlQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MubmF2aWdhdG9yLlJlc291cmNlU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50YXNrcy5UYXNrVGFnUHJlZmVyZW5jZUtleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci0KLS8qKgotICogQmFzZWQgbG9vc2VseSBvbiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuUHJvcGVydHlBbmRQcmVmZXJlbmNlUGFnZQotICovCi1hYnN0cmFjdCBjbGFzcyBQcm9wZXJ0eVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJvcGVydHlQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIF9kZWJ1Z1ByZWZlcmVuY2VzID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UudWkvcHJlZmVyZW5jZXMtcHJvcGVydGllcyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JLyoKLQkgKiBEaXNhYmxlIGxpbmsgZGF0YSwgcHJldmVudHMgdGhlIGRpc3BsYXkgb2YgYSAid29ya3NwYWNlIiBvciAicHJvamVjdCIKLQkgKiBzZXR0aW5ncyBsaW5rIHRvIHByZXZlbnQgcmVjdXJzaXZlIGRpYWxvZyBsYXVuY2hpbmcKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgRElTQUJMRV9MSU5LID0gIkRJU0FCTEVfTElOSyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgTWFwIERhdGEgPSBudWxsOwotCi0JcHJpdmF0ZSBCdXR0b24gRW5hYmxlUHJvamVjdFNldHRpbmdzOwotCi0JcHJpdmF0ZSBMaW5rIFByb2plY3RTZXR0aW5nc0xpbms7Ci0JCi0JcHJpdmF0ZSBDb250cm9sIENvbW1vbjsKLQkKLQlwcml2YXRlIENvbnRyb2xFbmFibGVTdGF0ZSBFbmFibGVtZW50czsKLQotCXB1YmxpYyBQcm9wZXJ0eVByZWZlcmVuY2VQYWdlKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBmaW5hbCB2b2lkIGFwcGx5RGF0YShPYmplY3QgZGF0YSkgewotCQlzdXBlci5hcHBseURhdGEoZGF0YSk7Ci0JCWlmIChkYXRhIGluc3RhbmNlb2YgTWFwKSB7Ci0JCQlEYXRhID0gKE1hcCkgZGF0YTsKLQkJCXVwZGF0ZUxpbmtFbmFibGVtZW50KCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQ29udHJvbCBjcmVhdGVDb21tb25Db250ZW50cyhDb21wb3NpdGUgY29tcG9zaXRlKTsKLQotCUBPdmVycmlkZQotCXB1YmxpYyBmaW5hbCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJQ29tcG9zaXRlIGNoZWNrTGlua0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWNoZWNrTGlua0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKLQkJY2hlY2tMaW5rQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCi0JCWlmIChnZXRQcm9qZWN0KCkgIT0gbnVsbCkgewotCQkJRW5hYmxlUHJvamVjdFNldHRpbmdzID0gbmV3IEJ1dHRvbihjaGVja0xpbmtDb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCQlFbmFibGVQcm9qZWN0U2V0dGluZ3Muc2V0VGV4dChTU0VVSU1lc3NhZ2VzLkVuYWJsZVByb2plY3RTZXR0aW5ncyk7IAotCQkJRW5hYmxlUHJvamVjdFNldHRpbmdzLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5CRUdJTk5JTkcsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSkpOwotCQkJYm9vbGVhbiBlbmFibGVkRm9yUHJvamVjdCA9IGNyZWF0ZVByZWZlcmVuY2VTY29wZXMoKVswXS5nZXROb2RlKGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCkpLmdldEJvb2xlYW4oZ2V0UHJvamVjdFNldHRpbmdzS2V5KCksIGZhbHNlKTsKLQkJCUVuYWJsZVByb2plY3RTZXR0aW5ncy5zZXRTZWxlY3Rpb24oZW5hYmxlZEZvclByb2plY3QpOwotCQl9Ci0JCWVsc2UgewotCQkJTGFiZWwgc3BhY2VyID0gbmV3IExhYmVsKGNoZWNrTGlua0NvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJCXNwYWNlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQkJfQotCi0JCVByb2plY3RTZXR0aW5nc0xpbmsgPSBuZXcgTGluayhjaGVja0xpbmtDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJUHJvamVjdFNldHRpbmdzTGluay5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRU5ELCBTV1QuQkVHSU5OSU5HLCB0cnVlLCBmYWxzZSkpOwotCi0JCS8qCi0JCSAqICJlbGVtZW50IiBzaG91bGQgYmUgYSBwcm9qZWN0LCBpZiBudWxsLCBsaW5rIHRvIHBlci1wcm9qZWN0Ci0JCSAqIHByb3BlcnRpZXMKLQkJICovCi0JCWlmIChnZXRQcm9qZWN0KCkgIT0gbnVsbCkgewotCQkJUHJvamVjdFNldHRpbmdzTGluay5zZXRUZXh0KCI8YT4iICsgU1NFVUlNZXNzYWdlcy5Db25maWd1cmVXb3Jrc3BhY2VTZXR0aW5ncyArICI8L2E+Iik7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCX0KLQkJZWxzZSB7Ci0JCQlQcm9qZWN0U2V0dGluZ3NMaW5rLnNldFRleHQoIjxhPiIgKyBTU0VVSU1lc3NhZ2VzLkNvbmZpZ3VyZVByb2plY3RTZXR0aW5ncyArICI8L2E+Iik7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCX0KLQotCQl1cGRhdGVMaW5rRW5hYmxlbWVudCgpOwotCi0JCVByb2plY3RTZXR0aW5nc0xpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl3aWRnZXRTZWxlY3RlZChlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmIChnZXRQcm9qZWN0KCkgPT0gbnVsbCkgewotCQkJCQlvcGVuUHJvamVjdFNldHRpbmdzKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlvcGVuV29ya3NwYWNlU2V0dGluZ3MoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfSk7Ci0KLQkJaWYgKGdldFByb2plY3QoKSAhPSBudWxsKSB7Ci0JCQlMYWJlbCBsaW5lID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLQkJCWxpbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCX0KLQotCQlDb21tb24gPSBjcmVhdGVDb21tb25Db250ZW50cyhjb21wb3NpdGUpOwotCQkKLQkJQ29tbW9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCWlmIChFbmFibGVQcm9qZWN0U2V0dGluZ3MgIT0gbnVsbCkgewotCQkJU2VsZWN0aW9uQWRhcHRlciBzZWxlY3Rpb25BZGFwdGVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlzdXBlci53aWRnZXRTZWxlY3RlZChlKTsKLQkJCQkJZW5hYmxlUHJlZmVyZW5jZUNvbnRlbnQoRW5hYmxlUHJvamVjdFNldHRpbmdzLmdldFNlbGVjdGlvbigpKTsKLQkJCQl9Ci0JCQl9OwotCQkJc2VsZWN0aW9uQWRhcHRlci53aWRnZXRTZWxlY3RlZChudWxsKTsKLQkJCUVuYWJsZVByb2plY3RTZXR0aW5ncy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25BZGFwdGVyKTsKLQkJfQotCQkKLQkJYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIElTY29wZUNvbnRleHRbXSBjcmVhdGVQcmVmZXJlbmNlU2NvcGVzKCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IElTY29wZUNvbnRleHRbXXtuZXcgUHJvamVjdFNjb3BlKHByb2plY3QpLCBuZXcgSW5zdGFuY2VTY29wZSgpLCBuZXcgRGVmYXVsdFNjb3BlKCl9OwotCQl9Ci0JCXJldHVybiBuZXcgSVNjb3BlQ29udGV4dFtde25ldyBJbnN0YW5jZVNjb3BlKCksIG5ldyBEZWZhdWx0U2NvcGUoKX07Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRQcmVmZXJlbmNlUGFnZUlEKCk7Ci0KLQlwcm90ZWN0ZWQgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJaWYgKGdldEVsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCQlyZXR1cm4gKElQcm9qZWN0KSBnZXRFbGVtZW50KCk7Ci0JCQl9Ci0JCQlPYmplY3QgYWRhcHRlciA9IGdldEVsZW1lbnQoKS5nZXRBZGFwdGVyKElQcm9qZWN0LmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCQlyZXR1cm4gKElQcm9qZWN0KSBhZGFwdGVyOwotCQkJfQotCQkJYWRhcHRlciA9IGdldEVsZW1lbnQoKS5nZXRBZGFwdGVyKElSZXNvdXJjZS5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQkJcmV0dXJuIChJUHJvamVjdCkgYWRhcHRlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFByb2plY3RTZXR0aW5nc0tleSgpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRQcm9wZXJ0eVBhZ2VJRCgpOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFbGVtZW50U2V0dGluZ3NFbmFibGVkKCkgewotCQlyZXR1cm4gRW5hYmxlUHJvamVjdFNldHRpbmdzICE9IG51bGwgJiYgRW5hYmxlUHJvamVjdFNldHRpbmdzLmdldFNlbGVjdGlvbigpOwotCX0KLQotCXZvaWQgb3BlblByb2plY3RTZXR0aW5ncygpIHsKLQkJTGlzdERpYWxvZyBkaWFsb2cgPSBuZXcgTGlzdERpYWxvZyhnZXRTaGVsbCgpKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCQkJQ29udHJvbCBhcmVhID0gc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShjb250YWluZXIpOwotCQkJCWdldFRhYmxlVmlld2VyKCkuc2V0U29ydGVyKG5ldyBSZXNvdXJjZVNvcnRlcihSZXNvdXJjZVNvcnRlci5OQU1FKSk7Ci0JCQkJcmV0dXJuIGFyZWE7Ci0JCQl9Ci0JCX07Ci0JCWRpYWxvZy5zZXRNZXNzYWdlKFNTRVVJTWVzc2FnZXMuUHJvcGVydHlQcmVmZXJlbmNlUGFnZV8wMik7Ci0JCWRpYWxvZy5zZXRDb250ZW50UHJvdmlkZXIobmV3IElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKCkgewotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCX0KLQotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gKChJV29ya3NwYWNlKSBpbnB1dEVsZW1lbnQpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJCX0KLQkJfSk7Ci0JCWRpYWxvZy5zZXRMYWJlbFByb3ZpZGVyKG5ldyBEZWNvcmF0aW5nTGFiZWxQcm92aWRlcihuZXcgV29ya2JlbmNoTGFiZWxQcm92aWRlcigpLCBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0RGVjb3JhdG9yTWFuYWdlcigpLmdldExhYmVsRGVjb3JhdG9yKCkpKTsKLQkJZGlhbG9nLnNldElucHV0KFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKSk7Ci0JCWRpYWxvZy5zZXRUaXRsZShTU0VVSU1lc3NhZ2VzLlByb3BlcnR5UHJlZmVyZW5jZVBhZ2VfMDEpOwotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCU9iamVjdFtdIHJlc3VsdCA9IGRpYWxvZy5nZXRSZXN1bHQoKTsKLQkJCWlmIChyZXN1bHQubGVuZ3RoID4gMCkgewotCQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIGRpYWxvZy5nZXRSZXN1bHQoKVswXTsKLQkJCQlNYXAgZGF0YSA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJZGF0YS5wdXQoRElTQUJMRV9MSU5LLCBCb29sZWFuLlRSVUUpOwotCQkJCVByZWZlcmVuY2VzVXRpbC5jcmVhdGVQcm9wZXJ0eURpYWxvZ09uKGdldFNoZWxsKCksIHByb2plY3QsIGdldFByb3BlcnR5UGFnZUlEKCksIG5ldyBTdHJpbmdbXXtnZXRQcm9wZXJ0eVBhZ2VJRCgpfSwgZGF0YSkub3BlbigpOwotCQkJfQotCQl9Ci0JfQotCi0Jdm9pZCBvcGVuV29ya3NwYWNlU2V0dGluZ3MoKSB7Ci0JCU1hcCBkYXRhID0gbmV3IEhhc2hNYXAoKTsKLQkJZGF0YS5wdXQoRElTQUJMRV9MSU5LLCBCb29sZWFuLlRSVUUpOwotCQlQcmVmZXJlbmNlc1V0aWwuY3JlYXRlUHJlZmVyZW5jZURpYWxvZ09uKGdldFNoZWxsKCksIGdldFByZWZlcmVuY2VQYWdlSUQoKSwgbmV3IFN0cmluZ1tde2dldFByZWZlcmVuY2VQYWdlSUQoKX0sIGRhdGEpLm9wZW4oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWJvb2xlYW4gb2sgPSBzdXBlci5wZXJmb3JtT2soKTsKLQkJSVNjb3BlQ29udGV4dFtdIHByZWZlcmVuY2VTY29wZXMgPSBjcmVhdGVQcmVmZXJlbmNlU2NvcGVzKCk7Ci0JCWlmIChnZXRQcm9qZWN0KCkgIT0gbnVsbCkgewotCQkJaWYgKGlzRWxlbWVudFNldHRpbmdzRW5hYmxlZCgpKSB7Ci0JCQkJaWYgKF9kZWJ1Z1ByZWZlcmVuY2VzKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgc2V0dGluZyAiICsgVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX1BFUl9QUk9KRUNUICsgIiAoIiArIHRydWUgKyAiKSBpbiBzY29wZSAiICsgcHJlZmVyZW5jZVNjb3Blc1swXS5nZXROYW1lKCkgKyAiOiIgKyBwcmVmZXJlbmNlU2NvcGVzWzBdLmdldExvY2F0aW9uKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkICAKLQkJCQl9Ci0JCQkJcHJlZmVyZW5jZVNjb3Blc1swXS5nZXROb2RlKGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCkpLnB1dEJvb2xlYW4oZ2V0UHJvamVjdFNldHRpbmdzS2V5KCksIEVuYWJsZVByb2plY3RTZXR0aW5ncy5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoX2RlYnVnUHJlZmVyZW5jZXMpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiByZW1vdmluZyAiICsgVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX1BFUl9QUk9KRUNUICsgIiBmcm9tIHNjb3BlICIgKyBwcmVmZXJlbmNlU2NvcGVzWzBdLmdldE5hbWUoKSArICI6IiArIHByZWZlcmVuY2VTY29wZXNbMF0uZ2V0TG9jYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIAotCQkJCX0KLQkJCQlwcmVmZXJlbmNlU2NvcGVzWzBdLmdldE5vZGUoZ2V0UHJlZmVyZW5jZU5vZGVRdWFsaWZpZXIoKSkucmVtb3ZlKGdldFByb2plY3RTZXR0aW5nc0tleSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gb2s7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJaWYoZ2V0UHJvamVjdCgpICE9IG51bGwgJiYgRW5hYmxlUHJvamVjdFNldHRpbmdzICE9IG51bGwpIHsKLQkJCUVuYWJsZVByb2plY3RTZXR0aW5ncy5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJZW5hYmxlUHJlZmVyZW5jZUNvbnRlbnQoZmFsc2UpOwotCQl9Ci0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVMaW5rRW5hYmxlbWVudCgpIHsKLQkJaWYgKERhdGEgIT0gbnVsbCAmJiBQcm9qZWN0U2V0dGluZ3NMaW5rICE9IG51bGwpIHsKLQkJCVByb2plY3RTZXR0aW5nc0xpbmsuc2V0RW5hYmxlZCghQm9vbGVhbi5UUlVFLmVxdWFscyhEYXRhLmdldChESVNBQkxFX0xJTkspKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ29udHJvbHMgdGhlIGVuYWJsZW1lbnQgb2YgdGhlIGNvbW1vbiBjb250ZW50IHJlZ2lvbgotCSAqIG9mIGEgcHJvcGVydHkgb3IgcHJlZmVyZW5jZSBwYWdlCi0JICogCi0JICogQHBhcmFtIGVuYWJsZSB0aGUgZW5hYmxlZCBzdGF0ZSBvZiB0aGUgY29tbW9uIGNvbnRlbnQKLQkgKiBhcmVhCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZW5hYmxlUHJlZmVyZW5jZUNvbnRlbnQoYm9vbGVhbiBlbmFibGUpIHsKLQkJaWYoZW5hYmxlKSB7Ci0JCQlpZihFbmFibGVtZW50cyAhPSBudWxsKSB7Ci0JCQkJRW5hYmxlbWVudHMucmVzdG9yZSgpOwotCQkJCUVuYWJsZW1lbnRzID0gbnVsbDsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmKEVuYWJsZW1lbnRzID09IG51bGwpCi0JCQkJRW5hYmxlbWVudHMgPSBDb250cm9sRW5hYmxlU3RhdGUuZGlzYWJsZShDb21tb24pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1ZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1ZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmUxOTlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9WYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5TY3JvbGxlZFBhZ2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5WYWxpZGF0aW9uUHJlZmVyZW5jZXM7Ci0KLS8qKgotICogUHJlZmVyZW5jZSBwYWdlIGZvciBYU0wgdmFsaWRhdG9yIHByZWZlcmVuY2VzLgotICogCi0gKiBAYXV0aG9yIERvdWcgU2F0Y2h3ZWxsCi0gKiBAZGVwcmVjYXRlZCAgVGhpcyBoYXMgYmVlbiByZXBsYWNlZCBieSBYU0xWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2UKLSAqLwotQERlcHJlY2F0ZWQKLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBBYnN0cmFjdFhTTFByZWZlcmVuY2VQYWdlCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRVJST1JTID0gbmV3IFN0cmluZ1tdIHsgIkVycm9yIiwgIldhcm5pbmciLCAiSWdub3JlIiB9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIEVSUk9SX1ZBTFVFUyA9IG5ldyBpbnRbXSB7IElNYXJrZXIuU0VWRVJJVFlfRVJST1IsIElNYXJrZXIuU0VWRVJJVFlfV0FSTklORywgSU1hcmtlci5TRVZFUklUWV9JTkZPIH07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPEludGVnZXIsIEludGVnZXI+IEVSUk9SX01BUCA9IG5ldyBIYXNoTWFwPEludGVnZXIsIEludGVnZXI+KCk7Ci0JcHJpdmF0ZSBUZXh0IG1heEVycm9yc1RleHQ7Ci0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBDb21ibz4gY29tYm9zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDb21ibz4oKTsKLQotCXN0YXRpYwotCXsKLQkJRVJST1JfTUFQLnB1dChJTWFya2VyLlNFVkVSSVRZX0VSUk9SLCAwKTsKLQkJRVJST1JfTUFQLnB1dChJTWFya2VyLlNFVkVSSVRZX1dBUk5JTkcsIDEpOwotCQlFUlJPUl9NQVAucHV0KElNYXJrZXIuU0VWRVJJVFlfSU5GTywgMik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMuCi0JICovCi0JcHVibGljIFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZSgpCi0JewotCQlzdXBlcigpOwotCQkvLyBvbmx5IHVzZWQgd2hlbiBwYWdlIGlzIHNob3duIHByb2dyYW1hdGljYWxseQotCQlzZXRUaXRsZSgiWFNMIFZhbGlkYXRpb24iKTsKLQkJc2V0RGVzY3JpcHRpb24oIkNvbmZpZ3VyZSB2YWxpZGF0aW9uIHByZWZlcmVuY2VzIik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVDb21tb25Db250ZW50cyhDb21wb3NpdGUgcGFyZW50KQotCXsKLQkJR3JpZExheW91dCBsYXlvdXQ9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zPSAyOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0PSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGg9IDA7Ci0JCQotCQlmaW5hbCBTY3JvbGxlZFBhZ2VDb250ZW50IHBhZ2VDb250ZW50ID0gbmV3IFNjcm9sbGVkUGFnZUNvbnRlbnQocGFyZW50KTsKLQkJcGFnZUNvbnRlbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCXBhZ2VDb250ZW50LnNldEV4cGFuZEhvcml6b250YWwodHJ1ZSk7Ci0JCXBhZ2VDb250ZW50LnNldEV4cGFuZFZlcnRpY2FsKHRydWUpOwotCQkKLQkJQ29tcG9zaXRlIGJvZHkgPSBwYWdlQ29udGVudC5nZXRCb2R5KCk7Ci0JCWJvZHkuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJLy8gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnQsIElIZWxwQ29udGV4dElkcy5YTUxfUFJFRldFQlhfRklMRVNfSEVMUElEKTsKLQotCQljcmVhdGVMYWJlbChib2R5LCAiTWF4aW11bSBudW1iZXIgb2YgZXJyb3JzIHJlcG9ydGVkIHBlciBzdHlsZXNoZWV0OiIpOwotCQltYXhFcnJvcnNUZXh0ID0gY3JlYXRlVGV4dEZpZWxkKGJvZHkpOwotCQltYXhFcnJvcnNUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCi0JCUNvbXBvc2l0ZSB0d2lzdGllOwotCQkKLQkJdHdpc3RpZSA9IGNyZWF0ZVR3aXN0aWUoYm9keSwiSW1wb3J0cyBhbmQgSW5jbHVkZXMiLDIpOwkJCi0JCWNyZWF0ZUNvbWJvKHR3aXN0aWUsICJVbnJlc29sdmVkIGluY2x1ZGUvaW1wb3J0OiIsIFZhbGlkYXRpb25QcmVmZXJlbmNlcy5NSVNTSU5HX0lOQ0xVREUpOwotCQljcmVhdGVDb21ibyh0d2lzdGllLCAiQ2lyY3VsYXIgcmVmZXJlbmNlczoiLCBWYWxpZGF0aW9uUHJlZmVyZW5jZXMuQ0lSQ1VMQVJfUkVGKTsKLQotCQl0d2lzdGllID0gY3JlYXRlVHdpc3RpZShib2R5LCJOYW1lZCBUZW1wbGF0ZXMiLDIpOwkJCi0JCWNyZWF0ZUNvbWJvKHR3aXN0aWUsICJUZW1wbGF0ZSBuYW1lIGNvbmZsaWN0czoiLCBWYWxpZGF0aW9uUHJlZmVyZW5jZXMuVEVNUExBVEVfQ09ORkxJQ1QpOwotCQljcmVhdGVDb21ibyh0d2lzdGllLCAiRHVwbGljYXRlIHBhcmFtZXRlcnc6IiwgVmFsaWRhdGlvblByZWZlcmVuY2VzLkRVUExJQ0FURV9QQVJBTUVURVIpOwotCQljcmVhdGVDb21ibyh0d2lzdGllLCAiUGFyYW1ldGVyIHdpdGhvdXQgbmFtZSBhdHRyaWJ1dGU6IiwgVmFsaWRhdGlvblByZWZlcmVuY2VzLk5BTUVfQVRUUklCVVRFX01JU1NJTkcpOwotCQljcmVhdGVDb21ibyh0d2lzdGllLCAiUGFyYW1ldGVyIHdpdGggZW1wdHkgbmFtZSBhdHRyaWJ1dGU6IiwgVmFsaWRhdGlvblByZWZlcmVuY2VzLk5BTUVfQVRUUklCVVRFX0VNUFRZKTsKLQkJCi0JCXR3aXN0aWUgPSBjcmVhdGVUd2lzdGllKGJvZHksIlRlbXBsYXRlIENhbGxzIiwyKTsJCQotCQljcmVhdGVDb21ibyh0d2lzdGllLCAiVW5yZXNvbHZlZCB0ZW1wbGF0ZXM6IiwgVmFsaWRhdGlvblByZWZlcmVuY2VzLkNBTExfVEVNUExBVEVTKTsKLQkJY3JlYXRlQ29tYm8odHdpc3RpZSwgIk1pc3NpbmcgcGFyYW1ldGVyczoiLCBWYWxpZGF0aW9uUHJlZmVyZW5jZXMuTUlTU0lOR19QQVJBTSk7Ci0JCWNyZWF0ZUNvbWJvKHR3aXN0aWUsICJQYXJhbWV0ZXJzIHdpdGhvdXQgdmFsdWU6IiwgVmFsaWRhdGlvblByZWZlcmVuY2VzLkVNUFRZX1BBUkFNKTsKLQotCQl0d2lzdGllID0gY3JlYXRlVHdpc3RpZShib2R5LCJYUGF0aCBQcm9ibGVtcyIsMik7Ci0JCWNyZWF0ZUNvbWJvKHR3aXN0aWUsICJJbmNvcnJlY3QgWFBhdGggc3ludGF4OiIsIFZhbGlkYXRpb25QcmVmZXJlbmNlcy5YUEFUSFMpOwotCi0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbWJvIGNyZWF0ZUNvbWJvKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbCwgU3RyaW5nIHByZWZLZXkpCi0JewotCQlDb21ibyBjb21ibyA9IHN1cGVyLmNyZWF0ZUNvbWJvKHBhcmVudCwgbGFiZWwsIHByZWZLZXkpOwotCQljb21iby5zZXRJdGVtcyhFUlJPUlMpOwotCQljb21ib3MucHV0KHByZWZLZXksIGNvbWJvKTsKLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKQotCXsKLQkJaW50IG1heEVycm9ycyA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRJbnQoVmFsaWRhdGlvblByZWZlcmVuY2VzLk1BWF9FUlJPUlMpOwotCQltYXhFcnJvcnNUZXh0LnNldFRleHQoU3RyaW5nLnZhbHVlT2YobWF4RXJyb3JzKSk7Ci0JCWZvciAoTWFwLkVudHJ5PFN0cmluZywgQ29tYm8+IGVudHJ5IDogY29tYm9zLmVudHJ5U2V0KCkpCi0JCXsKLQkJCWludCB2YWwgPSBnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0SW50KGVudHJ5LmdldEtleSgpKTsKLQkJCWVudHJ5LmdldFZhbHVlKCkuc2VsZWN0KEVSUk9SX01BUC5nZXQodmFsKSk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZVZhbHVlcygpCi0JewotCQlpbnQgbWF4RXJyb3JzID0gSW50ZWdlci5wYXJzZUludChtYXhFcnJvcnNUZXh0LmdldFRleHQoKSk7Ci0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShWYWxpZGF0aW9uUHJlZmVyZW5jZXMuTUFYX0VSUk9SUywgbWF4RXJyb3JzKTsKLQkJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBDb21ibz4gZW50cnkgOiBjb21ib3MuZW50cnlTZXQoKSkKLQkJewotCQkJaW50IGluZGV4ID0gZW50cnkuZ2V0VmFsdWUoKS5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKGVudHJ5LmdldEtleSgpLCBFUlJPUl9WQUxVRVNbaW5kZXhdKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlVmFsdWVzKCkKLQl7Ci0JCVN0cmluZyBlcnJvck1lc3NhZ2UgPSBudWxsOwotCQl0cnkKLQkJewotCQkJaW50IG1heEVycm9ycyA9IEludGVnZXIucGFyc2VJbnQobWF4RXJyb3JzVGV4dC5nZXRUZXh0KCkpOwotCQkJaWYgKG1heEVycm9ycyA8IDApCi0JCQkJZXJyb3JNZXNzYWdlID0gIk1heCBlcnJvcnMgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIiOwotCQl9Ci0JCWNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkKLQkJewotCQkJZXJyb3JNZXNzYWdlID0gIk1heCBlcnJvcnMgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIiOwotCQl9Ci0JCXNldEVycm9yTWVzc2FnZShlcnJvck1lc3NhZ2UpOwotCQlzZXRWYWxpZChlcnJvck1lc3NhZ2UgPT0gbnVsbCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkKLQl7Ci0JCWludCBtYXhFcnJvcnMgPSBnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0RGVmYXVsdEludChWYWxpZGF0aW9uUHJlZmVyZW5jZXMuTUFYX0VSUk9SUyk7Ci0JCW1heEVycm9yc1RleHQuc2V0VGV4dChTdHJpbmcudmFsdWVPZihtYXhFcnJvcnMpKTsKLQkJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBDb21ibz4gZW50cnkgOiBjb21ib3MuZW50cnlTZXQoKSkKLQkJewotCQkJaW50IGRlZiA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0SW50KGVudHJ5LmdldEtleSgpKTsKLQkJCWVudHJ5LmdldFZhbHVlKCkuc2VsZWN0KEVSUk9SX01BUC5nZXQoZGVmKSk7Ci0JCX0KLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1hTTFN5bnRheENvbG9yaW5nUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1hTTFN5bnRheENvbG9yaW5nUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMzA4NzI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YU0xTeW50YXhDb2xvcmluZ1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuQ29sb3JTZWxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGlzdFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFDQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TYXNoRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZXNVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5PdmVybGF5UHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQ29sb3JIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLkVkaXRvclV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5YU0xVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLnN0eWxlLklTdHlsZUNvbnN0YW50c1hTTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5NZXNzYWdlczsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuQ29sbGF0b3I7Ci0KLS8qKgotICogQSBwcmVmZXJlbmNlIHBhZ2UgdG8gY29uZmlndXJlIG91ciBYU0wgc3ludGF4IGNvbG9yLiBJdCByZXNlbWJsZXMgdGhlIFhNTAotICogcGFnZXMuCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFhTTFN5bnRheENvbG9yaW5nUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMKLQkJSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5UQVhDT0xPUklOR19YU0wgPSAic3ludGF4Y29sb3JpbmcueHNsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYU0xGSUxFU19ESVIgPSAieHNsZmlsZXMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBCdXR0b24gYm9sZDsKLQlwcml2YXRlIExhYmVsIGZvcmVncm91bmRMYWJlbDsKLQlwcml2YXRlIExhYmVsIGJhY2tncm91bmRMYWJlbDsKLQlwcml2YXRlIEJ1dHRvbiBjbGVhclN0eWxlOwotCXByaXZhdGUgTWFwIGNvbnRleHRUb1hTTFN0eWxlTWFwOwotCXByaXZhdGUgQ29sb3IgZGVmYXVsdEZvcmVncm91bmQgPSBudWxsOwotCXByaXZhdGUgQ29sb3IgZGVmYXVsdEJhY2tncm91bmQgPSBudWxsOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudDsKLQlwcml2YXRlIENvbG9yU2VsZWN0b3IgZm9yZWdyb3VuZENvbG9yRWRpdG9yOwotCXByaXZhdGUgQ29sb3JTZWxlY3RvciBiYWNrZ3JvdW5kQ29sb3JFZGl0b3I7Ci0JcHJpdmF0ZSBCdXR0b24gaXRhbGljOwotCXByaXZhdGUgT3ZlcmxheVByZWZlcmVuY2VTdG9yZSBvdmVybGF5U3RvcmU7Ci0JcHJpdmF0ZSBCdXR0b24gc3RyaWtlOwotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IHN0eWxlUHJlZmVyZW5jZUtleXM7Ci0JcHJpdmF0ZSBTdHJ1Y3R1cmVkVmlld2VyIHN0eWxlc1ZpZXdlciA9IG51bGw7Ci0JcHJpdmF0ZSBNYXAgc3R5bGVUb0Rlc2NyaXB0aW9uTWFwOwotCXByaXZhdGUgU3R5bGVkVGV4dCBzdHlsZWRUZXh0OwotCXByaXZhdGUgQnV0dG9uIHVuZGVybGluZTsKLQotCS8vIGFjdGl2YXRlIGNvbnRyb2xzIGJhc2VkIG9uIHRoZSBnaXZlbiBsb2NhbCBjb2xvciB0eXBlCi0JcHJpdmF0ZSB2b2lkIGFjdGl2YXRlKFN0cmluZyBuYW1lZFN0eWxlKSB7Ci0JCUNvbG9yIGZvcmVncm91bmQgPSBkZWZhdWx0Rm9yZWdyb3VuZDsKLQkJQ29sb3IgYmFja2dyb3VuZCA9IGRlZmF1bHRCYWNrZ3JvdW5kOwotCQlpZiAobmFtZWRTdHlsZSA9PSBudWxsKSB7Ci0JCQljbGVhclN0eWxlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJYm9sZC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWl0YWxpYy5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCXN0cmlrZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCXVuZGVybGluZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZvcmVncm91bmRMYWJlbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWJhY2tncm91bmRMYWJlbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZvcmVncm91bmRDb2xvckVkaXRvci5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWJhY2tncm91bmRDb2xvckVkaXRvci5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWJvbGQuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCWl0YWxpYy5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJc3RyaWtlLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQl1bmRlcmxpbmUuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCVRleHRBdHRyaWJ1dGUgYXR0cmlidXRlID0gZ2V0QXR0cmlidXRlRm9yKG5hbWVkU3R5bGUpOwotCQkJY2xlYXJTdHlsZS5zZXRFbmFibGVkKHRydWUpOwotCQkJYm9sZC5zZXRFbmFibGVkKHRydWUpOwotCQkJaXRhbGljLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlzdHJpa2Uuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCXVuZGVybGluZS5zZXRFbmFibGVkKHRydWUpOwotCQkJZm9yZWdyb3VuZExhYmVsLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQliYWNrZ3JvdW5kTGFiZWwuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZvcmVncm91bmRDb2xvckVkaXRvci5zZXRFbmFibGVkKHRydWUpOwotCQkJYmFja2dyb3VuZENvbG9yRWRpdG9yLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlib2xkLnNldFNlbGVjdGlvbigoYXR0cmlidXRlLmdldFN0eWxlKCkgJiBTV1QuQk9MRCkgIT0gMCk7Ci0JCQlpdGFsaWMuc2V0U2VsZWN0aW9uKChhdHRyaWJ1dGUuZ2V0U3R5bGUoKSAmIFNXVC5JVEFMSUMpICE9IDApOwotCQkJc3RyaWtlCi0JCQkJCS5zZXRTZWxlY3Rpb24oKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgVGV4dEF0dHJpYnV0ZS5TVFJJS0VUSFJPVUdIKSAhPSAwKTsKLQkJCXVuZGVybGluZQotCQkJCQkuc2V0U2VsZWN0aW9uKChhdHRyaWJ1dGUuZ2V0U3R5bGUoKSAmIFRleHRBdHRyaWJ1dGUuVU5ERVJMSU5FKSAhPSAwKTsKLQkJCWlmIChhdHRyaWJ1dGUuZ2V0Rm9yZWdyb3VuZCgpICE9IG51bGwpIHsKLQkJCQlmb3JlZ3JvdW5kID0gYXR0cmlidXRlLmdldEZvcmVncm91bmQoKTsKLQkJCX0KLQkJCWlmIChhdHRyaWJ1dGUuZ2V0QmFja2dyb3VuZCgpICE9IG51bGwpIHsKLQkJCQliYWNrZ3JvdW5kID0gYXR0cmlidXRlLmdldEJhY2tncm91bmQoKTsKLQkJCX0KLQkJfQotCi0JCWZvcmVncm91bmRDb2xvckVkaXRvci5zZXRDb2xvclZhbHVlKGZvcmVncm91bmQuZ2V0UkdCKCkpOwotCQliYWNrZ3JvdW5kQ29sb3JFZGl0b3Iuc2V0Q29sb3JWYWx1ZShiYWNrZ3JvdW5kLmdldFJHQigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb2xvciB0aGUgdGV4dCBpbiB0aGUgc2FtcGxlIGFyZWEgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IHByZWZlcmVuY2VzCi0JICovCi0JcHVibGljIHZvaWQgYXBwbHlTdHlsZXMoKSB7Ci0JCWlmIChzdHlsZWRUZXh0ID09IG51bGwgfHwgc3R5bGVkVGV4dC5pc0Rpc3Bvc2VkKCkpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24gPSBkb2N1bWVudAotCQkJCS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCi0JCXdoaWxlIChkb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGRvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJCUlUZXh0UmVnaW9uIGN1cnJlbnRSZWdpb24gPSByZWdpb25zLmdldChpKTsKLQkJCQkvLyBsb29rdXAgdGhlIGxvY2FsIGNvbG9yaW5nIHR5cGUgYW5kIGFwcGx5IGl0Ci0JCQkJLy8gVGhpcyBjb3VsZCBiZSBwb3RlbnRpYWxseSBleHBlbnNpdmUgYXMgd2UgZ2V0IHRoZSBtb2RlbCBhbmQKLQkJCQkvLyByZWFkIGl0IHByZXR0eSBjb25zaXN0ZW50bHkuCi0JCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBudWxsOwotCQkJCWlmIChjb250ZXh0VG9YU0xTdHlsZU1hcC5jb250YWluc0tleShjdXJyZW50UmVnaW9uLmdldFR5cGUoKSkpIHsKLQkJCQkJbmFtZWRTdHlsZSA9IChTdHJpbmcpIGNvbnRleHRUb1hTTFN0eWxlTWFwCi0JCQkJCQkJLmdldChjdXJyZW50UmVnaW9uLmdldFR5cGUoKSk7Ci0JCQkJCWlmIChuYW1lZFN0eWxlID09IG51bGwpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJVGV4dEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBnZXRBdHRyaWJ1dGVGb3IobmFtZWRTdHlsZSk7Ci0JCQkJCWlmIChhdHRyaWJ1dGUgPT0gbnVsbCkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlTdHlsZVJhbmdlIHN0eWxlID0gbmV3IFN0eWxlUmFuZ2UoZG9jdW1lbnRSZWdpb24KLQkJCQkJCQkuZ2V0U3RhcnRPZmZzZXQoY3VycmVudFJlZ2lvbiksIGN1cnJlbnRSZWdpb24KLQkJCQkJCQkuZ2V0VGV4dExlbmd0aCgpLCBhdHRyaWJ1dGUuZ2V0Rm9yZWdyb3VuZCgpLAotCQkJCQkJCWF0dHJpYnV0ZS5nZXRCYWNrZ3JvdW5kKCksIGF0dHJpYnV0ZS5nZXRTdHlsZSgpKTsKLQkJCQkJc3R5bGUuc3RyaWtlb3V0ID0gKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgVGV4dEF0dHJpYnV0ZS5TVFJJS0VUSFJPVUdIKSAhPSAwOwotCQkJCQlzdHlsZS51bmRlcmxpbmUgPSAoYXR0cmlidXRlLmdldFN0eWxlKCkgJiBUZXh0QXR0cmlidXRlLlVOREVSTElORSkgIT0gMDsKLQkJCQkJc3R5bGVkVGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlkb2N1bWVudFJlZ2lvbiA9IGRvY3VtZW50UmVnaW9uLmdldE5leHQoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBCdXR0b24gY3JlYXRlQ2hlY2tib3goQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJYnV0dG9uLnNldFRleHQobGFiZWwpOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSkpOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgY29tcG9zaXRlIGNvbnRyb2wgYW5kIHNldHMgdGhlIGRlZmF1bHQgbGF5b3V0IGRhdGEuCi0JICovCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCS8vIEdyaWRMYXlvdXQKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0JCWxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSBmYWxzZTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvLyBHcmlkRGF0YQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWluaXRpYWxpemVEaWFsb2dVbml0cyhwYXJlbnQpOwotCi0JCWRlZmF1bHRGb3JlZ3JvdW5kID0gcGFyZW50LmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcigKLQkJCQlTV1QuQ09MT1JfTElTVF9GT1JFR1JPVU5EKTsKLQkJZGVmYXVsdEJhY2tncm91bmQgPSBwYXJlbnQuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKAotCQkJCVNXVC5DT0xPUl9MSVNUX0JBQ0tHUk9VTkQpOwotCQlDb21wb3NpdGUgcGFnZUNvbXBvbmVudCA9IGNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIDIpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhZ2VDb21wb25lbnQsCi0JCQkJSUhlbHBDb250ZXh0SWRzLlhNTF9QUkVGV0VCWF9TVFlMRVNfSEVMUElEKTsKLQotCQlMaW5rIGxpbmsgPSBuZXcgTGluayhwYWdlQ29tcG9uZW50LCBTV1QuV1JBUCk7Ci0JCWxpbmsuc2V0VGV4dChNZXNzYWdlcy5YU0xTeW50YXhDb2xvcmluZ1BhZ2UpOwotCQlsaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJUHJlZmVyZW5jZXNVdGlsLmNyZWF0ZVByZWZlcmVuY2VEaWFsb2dPbihwYXJlbnQuZ2V0U2hlbGwoKSwKLQkJCQkJCWUudGV4dCwgbnVsbCwgbnVsbCk7Ci0JCQl9Ci0JCX0pOwotCi0JCUdyaWREYXRhIGxpbmtEYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQkVHSU5OSU5HLCB0cnVlLCBmYWxzZSwKLQkJCQkyLCAxKTsKLQkJbGlua0RhdGEud2lkdGhIaW50ID0gMTUwOyAvLyBvbmx5IGV4cGFuZCBmdXJ0aGVyIGlmIGFueW9uZSBlbHNlIHJlcXVpcmVzCi0JCQkJCQkJCQkvLyBpdAotCQlsaW5rLnNldExheW91dERhdGEobGlua0RhdGEpOwotCi0JCW5ldyBMYWJlbChwYWdlQ29tcG9uZW50LCBTV1QuTk9ORSkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCW5ldyBMYWJlbChwYWdlQ29tcG9uZW50LCBTV1QuTk9ORSkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0KLQkJU2FzaEZvcm0gZWRpdG9yID0gbmV3IFNhc2hGb3JtKHBhZ2VDb21wb25lbnQsIFNXVC5WRVJUSUNBTCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhMiA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotCQlncmlkRGF0YTIuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQllZGl0b3Iuc2V0TGF5b3V0RGF0YShncmlkRGF0YTIpOwotCQlTYXNoRm9ybSB0b3AgPSBuZXcgU2FzaEZvcm0oZWRpdG9yLCBTV1QuSE9SSVpPTlRBTCk7Ci0JCUNvbXBvc2l0ZSBzdHlsZUVkaXRvciA9IGNyZWF0ZUNvbXBvc2l0ZSh0b3AsIDEpOwotCQkoKEdyaWRMYXlvdXQpIHN0eWxlRWRpdG9yLmdldExheW91dCgpKS5tYXJnaW5SaWdodCA9IDU7Ci0JCSgoR3JpZExheW91dCkgc3R5bGVFZGl0b3IuZ2V0TGF5b3V0KCkpLm1hcmdpbkxlZnQgPSAwOwotCQljcmVhdGVMYWJlbChzdHlsZUVkaXRvciwgWE1MVUlNZXNzYWdlcy5TeW50YXhDb2xvcmluZ1BhZ2VfMCk7Ci0JCXN0eWxlc1ZpZXdlciA9IGNyZWF0ZVN0eWxlc1ZpZXdlcihzdHlsZUVkaXRvcik7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxJbmRlbnQgPSAwOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IHN0eWxlVG9EZXNjcmlwdGlvbk1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSBNYXRoLm1heChncmlkRGF0YS53aWR0aEhpbnQsCi0JCQkJCWNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscyhpdGVyYXRvci5uZXh0KCkudG9TdHJpbmcoKQotCQkJCQkJCS5sZW5ndGgoKSkpOwotCQl9Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSBjb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKDUpOwotCQlzdHlsZXNWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCUNvbXBvc2l0ZSBlZGl0aW5nQ29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHRvcCwgMSk7Ci0JCSgoR3JpZExheW91dCkgc3R5bGVFZGl0b3IuZ2V0TGF5b3V0KCkpLm1hcmdpbkxlZnQgPSA1OwotCQljcmVhdGVMYWJlbChlZGl0aW5nQ29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJQnV0dG9uIGVuYWJsZXIgPSBjcmVhdGVDaGVja2JveChlZGl0aW5nQ29tcG9zaXRlLAotCQkJCVhNTFVJTWVzc2FnZXMuU3ludGF4Q29sb3JpbmdQYWdlXzIpOwotCQllbmFibGVyLnNldEVuYWJsZWQoZmFsc2UpOwotCQllbmFibGVyLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJQ29tcG9zaXRlIGVkaXRDb250cm9scyA9IGNyZWF0ZUNvbXBvc2l0ZShlZGl0aW5nQ29tcG9zaXRlLCAyKTsKLQkJKChHcmlkTGF5b3V0KSBlZGl0Q29udHJvbHMuZ2V0TGF5b3V0KCkpLm1hcmdpbkxlZnQgPSAyMDsKLQotCQlmb3JlZ3JvdW5kTGFiZWwgPSBjcmVhdGVMYWJlbChlZGl0Q29udHJvbHMsCi0JCQkJU1NFVUlNZXNzYWdlcy5Gb3JlZ3JvdW5kX1VJXyk7Ci0JCSgoR3JpZERhdGEpIGZvcmVncm91bmRMYWJlbC5nZXRMYXlvdXREYXRhKCkpLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkNFTlRFUjsKLQkJZm9yZWdyb3VuZExhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWZvcmVncm91bmRDb2xvckVkaXRvciA9IG5ldyBDb2xvclNlbGVjdG9yKGVkaXRDb250cm9scyk7Ci0JCUJ1dHRvbiBmRm9yZWdyb3VuZENvbG9yID0gZm9yZWdyb3VuZENvbG9yRWRpdG9yLmdldEJ1dHRvbigpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLQkJZkZvcmVncm91bmRDb2xvci5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZm9yZWdyb3VuZENvbG9yRWRpdG9yLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWJhY2tncm91bmRMYWJlbCA9IGNyZWF0ZUxhYmVsKGVkaXRDb250cm9scywKLQkJCQlTU0VVSU1lc3NhZ2VzLkJhY2tncm91bmRfVUlfKTsKLQkJKChHcmlkRGF0YSkgYmFja2dyb3VuZExhYmVsLmdldExheW91dERhdGEoKSkudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQ0VOVEVSOwotCQliYWNrZ3JvdW5kTGFiZWwuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJYmFja2dyb3VuZENvbG9yRWRpdG9yID0gbmV3IENvbG9yU2VsZWN0b3IoZWRpdENvbnRyb2xzKTsKLQkJQnV0dG9uIGZCYWNrZ3JvdW5kQ29sb3IgPSBiYWNrZ3JvdW5kQ29sb3JFZGl0b3IuZ2V0QnV0dG9uKCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKFNXVC5CRUdJTk5JTkcsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotCQlmQmFja2dyb3VuZENvbG9yLnNldExheW91dERhdGEoZ2QpOwotCQliYWNrZ3JvdW5kQ29sb3JFZGl0b3Iuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJYm9sZCA9IGNyZWF0ZUNoZWNrYm94KGVkaXRDb250cm9scywgWE1MVUlNZXNzYWdlcy5TeW50YXhDb2xvcmluZ1BhZ2VfMyk7Ci0JCWJvbGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCSgoR3JpZERhdGEpIGJvbGQuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWl0YWxpYyA9IGNyZWF0ZUNoZWNrYm94KGVkaXRDb250cm9scywKLQkJCQlYTUxVSU1lc3NhZ2VzLlN5bnRheENvbG9yaW5nUGFnZV80KTsKLQkJaXRhbGljLnNldEVuYWJsZWQoZmFsc2UpOwotCQkoKEdyaWREYXRhKSBpdGFsaWMuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXN0cmlrZSA9IGNyZWF0ZUNoZWNrYm94KGVkaXRDb250cm9scywKLQkJCQlYTUxVSU1lc3NhZ2VzLlN5bnRheENvbG9yaW5nUGFnZV81KTsKLQkJc3RyaWtlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkoKEdyaWREYXRhKSBzdHJpa2UuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXVuZGVybGluZSA9IGNyZWF0ZUNoZWNrYm94KGVkaXRDb250cm9scywKLQkJCQlYTUxVSU1lc3NhZ2VzLlN5bnRheENvbG9yaW5nUGFnZV82KTsKLQkJdW5kZXJsaW5lLnNldEVuYWJsZWQoZmFsc2UpOwotCQkoKEdyaWREYXRhKSB1bmRlcmxpbmUuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWNsZWFyU3R5bGUgPSBuZXcgQnV0dG9uKGVkaXRpbmdDb21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJY2xlYXJTdHlsZS5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuUmVzdG9yZV9EZWZhdWx0X1VJXyk7IC8vID0gIlJlc3RvcmUgRGVmYXVsdCIKLQkJY2xlYXJTdHlsZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HKSk7Ci0JCSgoR3JpZERhdGEpIGNsZWFyU3R5bGUuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsSW5kZW50ID0gMjA7Ci0JCWNsZWFyU3R5bGUuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJQ29tcG9zaXRlIHNhbXBsZUFyZWEgPSBjcmVhdGVDb21wb3NpdGUoZWRpdG9yLCAxKTsKLQotCQkoKEdyaWRMYXlvdXQpIHNhbXBsZUFyZWEuZ2V0TGF5b3V0KCkpLm1hcmdpbkxlZnQgPSA1OwotCQkoKEdyaWRMYXlvdXQpIHNhbXBsZUFyZWEuZ2V0TGF5b3V0KCkpLm1hcmdpblRvcCA9IDU7Ci0JCWNyZWF0ZUxhYmVsKHNhbXBsZUFyZWEsIFNTRVVJTWVzc2FnZXMuU2FtcGxlX3RleHRfX1VJXyk7IC8vID0gIiZTYW1wbGUgdGV4dDoiCi0JCVNvdXJjZVZpZXdlciB2aWV3ZXIgPSBuZXcgU291cmNlVmlld2VyKHNhbXBsZUFyZWEsIG51bGwsIFNXVC5CT1JERVIKLQkJCQl8IFNXVC5MRUZUX1RPX1JJR0hUIHwgU1dULk1VTFRJIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMCi0JCQkJfCBTV1QuUkVBRF9PTkxZKTsKLQkJc3R5bGVkVGV4dCA9IHZpZXdlci5nZXRUZXh0V2lkZ2V0KCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhMyA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotCQlncmlkRGF0YTMud2lkdGhIaW50ID0gY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKDIwKTsKLQkJZ3JpZERhdGEzLmhlaWdodEhpbnQgPSBjb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKDUpOwotCQlncmlkRGF0YTMuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlzdHlsZWRUZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEzKTsKLQkJc3R5bGVkVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCXN0eWxlZFRleHQuc2V0Rm9udChKRmFjZVJlc291cmNlcwotCQkJCS5nZXRGb250KCJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRleHRmb250IikpOyAvLyROT04tTkxTLTEkCi0JCXN0eWxlZFRleHQuYWRkS2V5TGlzdGVuZXIoZ2V0VGV4dEtleUxpc3RlbmVyKCkpOwotCQlzdHlsZWRUZXh0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKGdldFRleHRTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJc3R5bGVkVGV4dC5hZGRNb3VzZUxpc3RlbmVyKGdldFRleHRNb3VzZUxpc3RlbmVyKCkpOwotCQlzdHlsZWRUZXh0LmFkZFRyYXZlcnNlTGlzdGVuZXIoZ2V0VHJhdmVyc2VMaXN0ZW5lcigpKTsKLQkJc2V0QWNjZXNzaWJsZShzdHlsZWRUZXh0LCBTU0VVSU1lc3NhZ2VzLlNhbXBsZV90ZXh0X19VSV8pOwotCi0JCXRyeSB7Ci0JCQlGaWxlIGZpbGUgPSBYU0xVSVBsdWdpbi5tYWtlRmlsZUZvcihYU0xTeW50YXhDb2xvcmluZ1BhZ2UuWFNMRklMRVNfRElSLAotCQkJCQlYU0xTeW50YXhDb2xvcmluZ1BhZ2UuU1lOVEFYQ09MT1JJTkdfWFNMKTsKLQkJCWRvY3VtZW50ID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKQotCQkJCQkuY3JlYXRlU3RydWN0dXJlZERvY3VtZW50Rm9yKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksCi0JCQkJCQkJbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSwgbnVsbCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJWFNMVUlQbHVnaW4ubG9nKGV4KTsKLQkJfQotCQkKLQkJdmlld2VyLnNldERvY3VtZW50KGRvY3VtZW50KTsKLQotCQl0b3Auc2V0V2VpZ2h0cyhuZXcgaW50W10geyAxLCAxIH0pOwotCQllZGl0b3Iuc2V0V2VpZ2h0cyhuZXcgaW50W10geyAxLCAxIH0pOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhZ2VDb21wb25lbnQsCi0JCQkJSUhlbHBDb250ZXh0SWRzLlhNTF9QUkVGV0VCWF9TVFlMRVNfSEVMUElEKTsKLQotCQlzdHlsZXNWaWV3ZXIuc2V0SW5wdXQoZ2V0U3R5bGVQcmVmZXJlbmNlS2V5cygpKTsKLQotCQlhcHBseVN0eWxlcygpOwotCi0JCXN0eWxlc1ZpZXdlcgotCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQlpZiAoIWV2ZW50LmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSkgewotCQkJCQkJCU9iamVjdCBvID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQKLQkJCQkJCQkJCS5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBvLnRvU3RyaW5nKCk7Ci0JCQkJCQkJYWN0aXZhdGUobmFtZWRTdHlsZSk7Ci0JCQkJCQkJaWYgKG5hbWVkU3R5bGUgPT0gbnVsbCkKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJZm9yZWdyb3VuZENvbG9yRWRpdG9yLmFkZExpc3RlbmVyKG5ldyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoZXZlbnQuZ2V0UHJvcGVydHkoKS5lcXVhbHMoQ29sb3JTZWxlY3Rvci5QUk9QX0NPTE9SQ0hBTkdFKSkgewotCQkJCQlPYmplY3QgbyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHN0eWxlc1ZpZXdlcgotCQkJCQkJCS5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gby50b1N0cmluZygpOwotCQkJCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldE92ZXJsYXlTdG9yZSgpLmdldFN0cmluZyhuYW1lZFN0eWxlKTsKLQkJCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyCi0JCQkJCQkJLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyBvbGRWYWx1ZSA9IHN0eWxlUHJlZnNbMF07Ci0JCQkJCQkvLyBvcGVuIGNvbG9yIGRpYWxvZyB0byBnZXQgbmV3IGNvbG9yCi0JCQkJCQlTdHJpbmcgbmV3VmFsdWUgPSBDb2xvckhlbHBlcgotCQkJCQkJCQkudG9SR0JTdHJpbmcoZm9yZWdyb3VuZENvbG9yRWRpdG9yCi0JCQkJCQkJCQkJLmdldENvbG9yVmFsdWUoKSk7Ci0KLQkJCQkJCWlmICghbmV3VmFsdWUuZXF1YWxzKG9sZFZhbHVlKSkgewotCQkJCQkJCXN0eWxlUHJlZnNbMF0gPSBuZXdWYWx1ZTsKLQkJCQkJCQlTdHJpbmcgbmV3UHJlZlN0cmluZyA9IENvbG9ySGVscGVyCi0JCQkJCQkJCQkucGFja1N0eWxlUHJlZmVyZW5jZXMoc3R5bGVQcmVmcyk7Ci0JCQkJCQkJZ2V0T3ZlcmxheVN0b3JlKCkuc2V0VmFsdWUobmFtZWRTdHlsZSwKLQkJCQkJCQkJCW5ld1ByZWZTdHJpbmcpOwotCQkJCQkJCWFwcGx5U3R5bGVzKCk7Ci0JCQkJCQkJc3R5bGVkVGV4dC5yZWRyYXcoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJYmFja2dyb3VuZENvbG9yRWRpdG9yLmFkZExpc3RlbmVyKG5ldyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoZXZlbnQuZ2V0UHJvcGVydHkoKS5lcXVhbHMoQ29sb3JTZWxlY3Rvci5QUk9QX0NPTE9SQ0hBTkdFKSkgewotCQkJCQlPYmplY3QgbyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHN0eWxlc1ZpZXdlcgotCQkJCQkJCS5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gby50b1N0cmluZygpOwotCQkJCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldE92ZXJsYXlTdG9yZSgpLmdldFN0cmluZyhuYW1lZFN0eWxlKTsKLQkJCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyCi0JCQkJCQkJLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyBvbGRWYWx1ZSA9IHN0eWxlUHJlZnNbMV07Ci0JCQkJCQkvLyBvcGVuIGNvbG9yIGRpYWxvZyB0byBnZXQgbmV3IGNvbG9yCi0JCQkJCQlTdHJpbmcgbmV3VmFsdWUgPSBDb2xvckhlbHBlcgotCQkJCQkJCQkudG9SR0JTdHJpbmcoYmFja2dyb3VuZENvbG9yRWRpdG9yCi0JCQkJCQkJCQkJLmdldENvbG9yVmFsdWUoKSk7Ci0KLQkJCQkJCWlmICghbmV3VmFsdWUuZXF1YWxzKG9sZFZhbHVlKSkgewotCQkJCQkJCXN0eWxlUHJlZnNbMV0gPSBuZXdWYWx1ZTsKLQkJCQkJCQlTdHJpbmcgbmV3UHJlZlN0cmluZyA9IENvbG9ySGVscGVyCi0JCQkJCQkJCQkucGFja1N0eWxlUHJlZmVyZW5jZXMoc3R5bGVQcmVmcyk7Ci0JCQkJCQkJZ2V0T3ZlcmxheVN0b3JlKCkuc2V0VmFsdWUobmFtZWRTdHlsZSwKLQkJCQkJCQkJCW5ld1ByZWZTdHJpbmcpOwotCQkJCQkJCWFwcGx5U3R5bGVzKCk7Ci0JCQkJCQkJc3R5bGVkVGV4dC5yZWRyYXcoKTsKLQkJCQkJCQlhY3RpdmF0ZShuYW1lZFN0eWxlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJYm9sZC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXN1cGVyLndpZGdldFNlbGVjdGVkKGUpOwotCQkJCS8vIGdldCBjdXJyZW50IChuZXdseSBvbGQpIHN0eWxlCi0JCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzdHlsZXNWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpCi0JCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBvLnRvU3RyaW5nKCk7Ci0JCQkJU3RyaW5nIHByZWZTdHJpbmcgPSBnZXRPdmVybGF5U3RvcmUoKS5nZXRTdHJpbmcobmFtZWRTdHlsZSk7Ci0JCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyCi0JCQkJCQkudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBvbGRWYWx1ZSA9IHN0eWxlUHJlZnNbMl07Ci0JCQkJCVN0cmluZyBuZXdWYWx1ZSA9IFN0cmluZy52YWx1ZU9mKGJvbGQuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQlpZiAoIW5ld1ZhbHVlLmVxdWFscyhvbGRWYWx1ZSkpIHsKLQkJCQkJCXN0eWxlUHJlZnNbMl0gPSBuZXdWYWx1ZTsKLQkJCQkJCVN0cmluZyBuZXdQcmVmU3RyaW5nID0gQ29sb3JIZWxwZXIKLQkJCQkJCQkJLnBhY2tTdHlsZVByZWZlcmVuY2VzKHN0eWxlUHJlZnMpOwotCQkJCQkJZ2V0T3ZlcmxheVN0b3JlKCkuc2V0VmFsdWUobmFtZWRTdHlsZSwgbmV3UHJlZlN0cmluZyk7Ci0JCQkJCQlhcHBseVN0eWxlcygpOwotCQkJCQkJc3R5bGVkVGV4dC5yZWRyYXcoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJaXRhbGljLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc3VwZXIud2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQkJLy8gZ2V0IGN1cnJlbnQgKG5ld2x5IG9sZCkgc3R5bGUKLQkJCQlPYmplY3QgbyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHN0eWxlc1ZpZXdlci5nZXRTZWxlY3Rpb24oKSkKLQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgbmFtZWRTdHlsZSA9IG8udG9TdHJpbmcoKTsKLQkJCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldE92ZXJsYXlTdG9yZSgpLmdldFN0cmluZyhuYW1lZFN0eWxlKTsKLQkJCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIKLQkJCQkJCS51bnBhY2tTdHlsZVByZWZlcmVuY2VzKHByZWZTdHJpbmcpOwotCQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIG9sZFZhbHVlID0gc3R5bGVQcmVmc1szXTsKLQkJCQkJU3RyaW5nIG5ld1ZhbHVlID0gU3RyaW5nLnZhbHVlT2YoaXRhbGljLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkVmFsdWUpKSB7Ci0JCQkJCQlzdHlsZVByZWZzWzNdID0gbmV3VmFsdWU7Ci0JCQkJCQlTdHJpbmcgbmV3UHJlZlN0cmluZyA9IENvbG9ySGVscGVyCi0JCQkJCQkJCS5wYWNrU3R5bGVQcmVmZXJlbmNlcyhzdHlsZVByZWZzKTsKLQkJCQkJCWdldE92ZXJsYXlTdG9yZSgpLnNldFZhbHVlKG5hbWVkU3R5bGUsIG5ld1ByZWZTdHJpbmcpOwotCQkJCQkJYXBwbHlTdHlsZXMoKTsKLQkJCQkJCXN0eWxlZFRleHQucmVkcmF3KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCXN0cmlrZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXN1cGVyLndpZGdldFNlbGVjdGVkKGUpOwotCQkJCS8vIGdldCBjdXJyZW50IChuZXdseSBvbGQpIHN0eWxlCi0JCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzdHlsZXNWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpCi0JCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBvLnRvU3RyaW5nKCk7Ci0JCQkJU3RyaW5nIHByZWZTdHJpbmcgPSBnZXRPdmVybGF5U3RvcmUoKS5nZXRTdHJpbmcobmFtZWRTdHlsZSk7Ci0JCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyCi0JCQkJCQkudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBvbGRWYWx1ZSA9IHN0eWxlUHJlZnNbNF07Ci0JCQkJCVN0cmluZyBuZXdWYWx1ZSA9IFN0cmluZy52YWx1ZU9mKHN0cmlrZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCWlmICghbmV3VmFsdWUuZXF1YWxzKG9sZFZhbHVlKSkgewotCQkJCQkJc3R5bGVQcmVmc1s0XSA9IG5ld1ZhbHVlOwotCQkJCQkJU3RyaW5nIG5ld1ByZWZTdHJpbmcgPSBDb2xvckhlbHBlcgotCQkJCQkJCQkucGFja1N0eWxlUHJlZmVyZW5jZXMoc3R5bGVQcmVmcyk7Ci0JCQkJCQlnZXRPdmVybGF5U3RvcmUoKS5zZXRWYWx1ZShuYW1lZFN0eWxlLCBuZXdQcmVmU3RyaW5nKTsKLQkJCQkJCWFwcGx5U3R5bGVzKCk7Ci0JCQkJCQlzdHlsZWRUZXh0LnJlZHJhdygpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQl1bmRlcmxpbmUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzdXBlci53aWRnZXRTZWxlY3RlZChlKTsKLQkJCQkvLyBnZXQgY3VycmVudCAobmV3bHkgb2xkKSBzdHlsZQotCQkJCU9iamVjdCBvID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpKQotCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gby50b1N0cmluZygpOwotCQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJCVN0cmluZ1tdIHN0eWxlUHJlZnMgPSBDb2xvckhlbHBlcgotCQkJCQkJLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgb2xkVmFsdWUgPSBzdHlsZVByZWZzWzVdOwotCQkJCQlTdHJpbmcgbmV3VmFsdWUgPSBTdHJpbmcudmFsdWVPZih1bmRlcmxpbmUuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQlpZiAoIW5ld1ZhbHVlLmVxdWFscyhvbGRWYWx1ZSkpIHsKLQkJCQkJCXN0eWxlUHJlZnNbNV0gPSBuZXdWYWx1ZTsKLQkJCQkJCVN0cmluZyBuZXdQcmVmU3RyaW5nID0gQ29sb3JIZWxwZXIKLQkJCQkJCQkJLnBhY2tTdHlsZVByZWZlcmVuY2VzKHN0eWxlUHJlZnMpOwotCQkJCQkJZ2V0T3ZlcmxheVN0b3JlKCkuc2V0VmFsdWUobmFtZWRTdHlsZSwgbmV3UHJlZlN0cmluZyk7Ci0JCQkJCQlhcHBseVN0eWxlcygpOwotCQkJCQkJc3R5bGVkVGV4dC5yZWRyYXcoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY2xlYXJTdHlsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmIChzdHlsZXNWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkuaXNFbXB0eSgpKQotCQkJCQlyZXR1cm47Ci0JCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzdHlsZXNWaWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCkudG9TdHJpbmcoKTsKLQkJCQlnZXRPdmVybGF5U3RvcmUoKS5zZXRUb0RlZmF1bHQobmFtZWRTdHlsZSk7Ci0JCQkJYXBwbHlTdHlsZXMoKTsKLQkJCQlzdHlsZWRUZXh0LnJlZHJhdygpOwotCQkJCWFjdGl2YXRlKG5hbWVkU3R5bGUpOwotCQkJfQotCQl9KTsKLQotCQlyZXR1cm4gcGFnZUNvbXBvbmVudDsKLQl9Ci0KLQlwcml2YXRlIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULldSQVApOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJbGFiZWwuc2V0QmFja2dyb3VuZChwYXJlbnQuZ2V0QmFja2dyb3VuZCgpKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8vIHByb3RlY3RlZCBMYWJlbCBjcmVhdGVEZXNjcmlwdGlvbkxhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkvLyByZXR1cm4gbnVsbDsKLQkvLyB9Ci0KLQkvKioKLQkgKiBTZXQgdXAgYWxsIHRoZSBzdHlsZSBwcmVmZXJlbmNlIGtleXMgaW4gdGhlIG92ZXJsYXkgc3RvcmUKLQkgKi8KLQlwcml2YXRlIE92ZXJsYXlLZXlbXSBjcmVhdGVPdmVybGF5U3RvcmVLZXlzKCkgewotCQlMaXN0IG92ZXJsYXlLZXlzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUl0ZXJhdG9yIGkgPSBnZXRTdHlsZVByZWZlcmVuY2VLZXlzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlvdmVybGF5S2V5cy5hZGQobmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleSgKLQkJCQkJT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5TVFJJTkcsIChTdHJpbmcpIGkubmV4dCgpKSk7Ci0JCX0KLQotCQlPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXlbXSBrZXlzID0gbmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleVtvdmVybGF5S2V5cwotCQkJCS5zaXplKCldOwotCQlvdmVybGF5S2V5cy50b0FycmF5KGtleXMpOwotCQlyZXR1cm4ga2V5czsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBMaXN0IHZpZXdlciB3aGVyZSB3ZSBzZWUgdGhlIHZhcmlvdXMgc3ludGF4IGVsZW1lbnQgZGlzcGxheQotCSAqIG5hbWVzLS13b3VsZCBpdCBldmVyIGJlIGEgVHJlZSBsaWtlIEpEVCdzPwotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkVmlld2VyIGNyZWF0ZVN0eWxlc1ZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVN0cnVjdHVyZWRWaWV3ZXIgc3R5bGVzVmlld2VyID0gbmV3IExpc3RWaWV3ZXIocGFyZW50LCBTV1QuU0lOR0xFCi0JCQkJfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJc3R5bGVzVmlld2VyCi0JCQkJLnNldENvbXBhcmF0b3IobmV3IFZpZXdlckNvbXBhcmF0b3IoQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKSkpOwotCQlzdHlsZXNWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJT2JqZWN0IGRlc2NyaXB0aW9uID0gc3R5bGVUb0Rlc2NyaXB0aW9uTWFwLmdldChlbGVtZW50KTsKLQkJCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGRlc2NyaXB0aW9uLnRvU3RyaW5nKCk7Ci0JCQkJcmV0dXJuIHN1cGVyLmdldFRleHQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0pOwotCQlzdHlsZXNWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBJVHJlZUNvbnRlbnRQcm92aWRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQkJCXJldHVybiBnZXRTdHlsZVByZWZlcmVuY2VLZXlzKCkudG9BcnJheSgpOwotCQkJfQotCi0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJCXJldHVybiBnZXRDaGlsZHJlbihpbnB1dEVsZW1lbnQpOwotCQkJfQotCi0JCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiBnZXRTdHlsZVByZWZlcmVuY2VLZXlzKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LAotCQkJCQlPYmplY3QgbmV3SW5wdXQpIHsKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiBzdHlsZXNWaWV3ZXI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKG92ZXJsYXlTdG9yZSAhPSBudWxsKSB7Ci0JCQlvdmVybGF5U3RvcmUuc3RvcCgpOwotCQl9Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIFhTTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQlwcml2YXRlIFRleHRBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlRm9yKFN0cmluZyBuYW1lZFN0eWxlKSB7Ci0JCVRleHRBdHRyaWJ1dGUgdGEgPSBuZXcgVGV4dEF0dHJpYnV0ZShkZWZhdWx0Rm9yZWdyb3VuZCwKLQkJCQlkZWZhdWx0QmFja2dyb3VuZCwgU1dULk5PUk1BTCk7Ci0KLQkJaWYgKG5hbWVkU3R5bGUgIT0gbnVsbCAmJiBvdmVybGF5U3RvcmUgIT0gbnVsbCkgewotCQkJLy8gbm90ZTogIm5hbWVkU3R5bGUiICppcyogdGhlIHByZWZlcmVuY2Uga2V5Ci0JCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldE92ZXJsYXlTdG9yZSgpLmdldFN0cmluZyhuYW1lZFN0eWxlKTsKLQkJCVN0cmluZ1tdIHN0eWxlUHJlZnMgPSBDb2xvckhlbHBlcgotCQkJCQkudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQlSR0IgZm9yZWdyb3VuZCA9IENvbG9ySGVscGVyLnRvUkdCKHN0eWxlUHJlZnNbMF0pOwotCQkJCVJHQiBiYWNrZ3JvdW5kID0gQ29sb3JIZWxwZXIudG9SR0Ioc3R5bGVQcmVmc1sxXSk7Ci0KLQkJCQlpbnQgZm9udE1vZGlmaWVyID0gU1dULk5PUk1BTDsKLQotCQkJCWlmIChzdHlsZVByZWZzLmxlbmd0aCA+IDIpIHsKLQkJCQkJYm9vbGVhbiBvbiA9IEJvb2xlYW4udmFsdWVPZihzdHlsZVByZWZzWzJdKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJaWYgKG9uKQotCQkJCQkJZm9udE1vZGlmaWVyID0gZm9udE1vZGlmaWVyIHwgU1dULkJPTEQ7Ci0JCQkJfQotCQkJCWlmIChzdHlsZVByZWZzLmxlbmd0aCA+IDMpIHsKLQkJCQkJYm9vbGVhbiBvbiA9IEJvb2xlYW4udmFsdWVPZihzdHlsZVByZWZzWzNdKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJaWYgKG9uKQotCQkJCQkJZm9udE1vZGlmaWVyID0gZm9udE1vZGlmaWVyIHwgU1dULklUQUxJQzsKLQkJCQl9Ci0JCQkJaWYgKHN0eWxlUHJlZnMubGVuZ3RoID4gNCkgewotCQkJCQlib29sZWFuIG9uID0gQm9vbGVhbi52YWx1ZU9mKHN0eWxlUHJlZnNbNF0pLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQlpZiAob24pCi0JCQkJCQlmb250TW9kaWZpZXIgPSBmb250TW9kaWZpZXIKLQkJCQkJCQkJfCBUZXh0QXR0cmlidXRlLlNUUklLRVRIUk9VR0g7Ci0JCQkJfQotCQkJCWlmIChzdHlsZVByZWZzLmxlbmd0aCA+IDUpIHsKLQkJCQkJYm9vbGVhbiBvbiA9IEJvb2xlYW4udmFsdWVPZihzdHlsZVByZWZzWzVdKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJaWYgKG9uKQotCQkJCQkJZm9udE1vZGlmaWVyID0gZm9udE1vZGlmaWVyIHwgVGV4dEF0dHJpYnV0ZS5VTkRFUkxJTkU7Ci0JCQkJfQotCi0JCQkJdGEgPSBuZXcgVGV4dEF0dHJpYnV0ZSgoZm9yZWdyb3VuZCAhPSBudWxsKSA/IEVkaXRvclV0aWxpdHkKLQkJCQkJCS5nZXRDb2xvcihmb3JlZ3JvdW5kKSA6IG51bGwsCi0JCQkJCQkoYmFja2dyb3VuZCAhPSBudWxsKSA/IEVkaXRvclV0aWxpdHkKLQkJCQkJCQkJLmdldENvbG9yKGJhY2tncm91bmQpIDogbnVsbCwgZm9udE1vZGlmaWVyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGE7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TmFtZWRTdHlsZUF0T2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJLy8gZW5zdXJlIHRoZSBvZmZzZXQgaXMgY2xlYW4KLQkJaWYgKG9mZnNldCA+PSBkb2N1bWVudC5nZXRMZW5ndGgoKSkKLQkJCXJldHVybiBnZXROYW1lZFN0eWxlQXRPZmZzZXQoZG9jdW1lbnQuZ2V0TGVuZ3RoKCkgLSAxKTsKLQkJZWxzZSBpZiAob2Zmc2V0IDwgMCkKLQkJCXJldHVybiBnZXROYW1lZFN0eWxlQXRPZmZzZXQoMCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24gPSBkb2N1bWVudAotCQkJCS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQl3aGlsZSAoZG9jdW1lbnRSZWdpb24gIT0gbnVsbCAmJiAhZG9jdW1lbnRSZWdpb24uY29udGFpbnNPZmZzZXQob2Zmc2V0KSkgewotCQkJZG9jdW1lbnRSZWdpb24gPSBkb2N1bWVudFJlZ2lvbi5nZXROZXh0KCk7Ci0JCX0KLQkJaWYgKGRvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCS8vIGZpbmQgdGhlIElUZXh0UmVnaW9uJ3MgQ29udGV4dCBhdCB0aGlzIG9mZnNldAotCQkJSVRleHRSZWdpb24gaW50ZXJlc3QgPSBkb2N1bWVudFJlZ2lvbgotCQkJCQkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCWlmIChpbnRlcmVzdCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYgKG9mZnNldCA+IGRvY3VtZW50UmVnaW9uLmdldFRleHRFbmRPZmZzZXQoaW50ZXJlc3QpKQotCQkJCXJldHVybiBudWxsOwotCQkJU3RyaW5nIHJlZ2lvbkNvbnRleHQgPSBpbnRlcmVzdC5nZXRUeXBlKCk7Ci0JCQlpZiAocmVnaW9uQ29udGV4dCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJLy8gZmluZCB0aGUgbmFtZWQgc3R5bGUgKGludGVybmFsL3NlbGVjdGFibGUgbmFtZSkgZm9yIHRoYXQKLQkJCS8vIGNvbnRleHQKLQkJCVN0cmluZyBuYW1lZFN0eWxlID0gKFN0cmluZykgY29udGV4dFRvWFNMU3R5bGVNYXAuZ2V0KHJlZ2lvbkNvbnRleHQpOwotCQkJaWYgKG5hbWVkU3R5bGUgIT0gbnVsbCkgewotCQkJCXJldHVybiBuYW1lZFN0eWxlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgT3ZlcmxheVByZWZlcmVuY2VTdG9yZSBnZXRPdmVybGF5U3RvcmUoKSB7Ci0JCXJldHVybiBvdmVybGF5U3RvcmU7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0U3R5bGVQcmVmZXJlbmNlS2V5cygpIHsKLQkJaWYgKHN0eWxlUHJlZmVyZW5jZUtleXMgPT0gbnVsbCkgewotCQkJTGlzdDxTdHJpbmc+IHN0eWxlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYU0wuVEFHX0JPUkRFUik7Ci0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c1hTTC5UQUdfTkFNRSk7Ci0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c1hTTC5UQUdfQVRUUklCVVRFX05BTUUpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYU0wuVEFHX0FUVFJJQlVURV9WQUxVRSk7Ci0JCQlzdHlsZVByZWZlcmVuY2VLZXlzID0gc3R5bGVzOwotCQl9Ci0JCXJldHVybiBzdHlsZVByZWZlcmVuY2VLZXlzOwotCX0KLQotCXByaXZhdGUgS2V5TGlzdGVuZXIgZ2V0VGV4dEtleUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEtleUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQlpbnQgeCA9ICgoU3R5bGVkVGV4dCkgZS53aWRnZXQpLmdldENhcmV0T2Zmc2V0KCk7Ci0JCQkJCXNlbGVjdENvbG9yQXRPZmZzZXQoeCk7Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBlKSB7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQlpbnQgeCA9ICgoU3R5bGVkVGV4dCkgZS53aWRnZXQpLmdldENhcmV0T2Zmc2V0KCk7Ci0JCQkJCXNlbGVjdENvbG9yQXRPZmZzZXQoeCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTW91c2VMaXN0ZW5lciBnZXRUZXh0TW91c2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBNb3VzZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGUpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgewotCQkJCWlmIChlLndpZGdldCBpbnN0YW5jZW9mIFN0eWxlZFRleHQpIHsKLQkJCQkJaW50IHggPSAoKFN0eWxlZFRleHQpIGUud2lkZ2V0KS5nZXRDYXJldE9mZnNldCgpOwotCQkJCQlzZWxlY3RDb2xvckF0T2Zmc2V0KHgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGdldFRleHRTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2VsZWN0Q29sb3JBdE9mZnNldChlLngpOwotCQkJCWlmIChlLndpZGdldCBpbnN0YW5jZW9mIFN0eWxlZFRleHQpIHsKLQkJCQkJKChTdHlsZWRUZXh0KSBlLndpZGdldCkuc2V0U2VsZWN0aW9uKGUueCk7Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2VsZWN0Q29sb3JBdE9mZnNldChlLngpOwotCQkJCWlmIChlLndpZGdldCBpbnN0YW5jZW9mIFN0eWxlZFRleHQpIHsKLQkJCQkJKChTdHlsZWRUZXh0KSBlLndpZGdldCkuc2V0U2VsZWN0aW9uKGUueCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgVHJhdmVyc2VMaXN0ZW5lciBnZXRUcmF2ZXJzZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFRyYXZlcnNlTGlzdGVuZXIoKSB7Ci0JCQkvKioKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUxpc3RlbmVyI2tleVRyYXZlcnNlZChUcmF2ZXJzZUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKSB7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQlpZiAoKGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9UQUJfTkVYVCkKLQkJCQkJCQl8fCAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1RBQl9QUkVWSU9VUykpCi0JCQkJCQllLmRvaXQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JCXNldERlc2NyaXB0aW9uKFNTRVVJTWVzc2FnZXMuU3ludGF4Q29sb3JpbmdfRGVzY3JpcHRpb24pOwotCi0JCXN0eWxlVG9EZXNjcmlwdGlvbk1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWNvbnRleHRUb1hTTFN0eWxlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCQlpbml0U3R5bGVUb0Rlc2NyaXB0aW9uTWFwKCk7Ci0JCWluaXRSZWdpb25Db250ZXh0VG9TdHlsZU1hcCgpOwotCi0JCW92ZXJsYXlTdG9yZSA9IG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlKGdldFByZWZlcmVuY2VTdG9yZSgpLAotCQkJCWNyZWF0ZU92ZXJsYXlTdG9yZUtleXMoKSk7Ci0JCW92ZXJsYXlTdG9yZS5sb2FkKCk7Ci0JCW92ZXJsYXlTdG9yZS5zdGFydCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0UmVnaW9uQ29udGV4dFRvU3R5bGVNYXAoKSB7Ci0JCXhzbENvbnRleHRUb1N0eWxlTWFwKCk7Ci0JfQotCi0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHZvaWQgeHNsQ29udGV4dFRvU3R5bGVNYXAoKSB7Ci0JCWNvbnRleHRUb1hTTFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTiwKLQkJCQlJU3R5bGVDb25zdGFudHNYU0wuVEFHX0JPUkRFUik7Ci0JCWNvbnRleHRUb1hTTFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4sCi0JCQkJSVN0eWxlQ29uc3RhbnRzWFNMLlRBR19CT1JERVIpOwotCQljb250ZXh0VG9YU0xTdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUsCi0JCQkJSVN0eWxlQ29uc3RhbnRzWFNMLlRBR19OQU1FKTsKLQkJY29udGV4dFRvWFNMU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSwKLQkJCQlJU3R5bGVDb25zdGFudHNYU0wuVEFHX0FUVFJJQlVURV9OQU1FKTsKLQkJY29udGV4dFRvWFNMU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUsCi0JCQkJSVN0eWxlQ29uc3RhbnRzWFNMLlRBR19BVFRSSUJVVEVfVkFMVUUpOwotCQljb250ZXh0VG9YU0xTdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFLAotCQkJCUlTdHlsZUNvbnN0YW50c1hTTC5UQUdfQk9SREVSKTsKLQkJY29udGV4dFRvWFNMU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSwKLQkJCQlJU3R5bGVDb25zdGFudHNYU0wuVEFHX0JPUkRFUik7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSB2b2lkIGluaXRTdHlsZVRvRGVzY3JpcHRpb25NYXAoKSB7Ci0JCXN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWFNMLlRBR19CT1JERVIsCi0JCQkJWE1MVUlNZXNzYWdlcy5UYWdfRGVsaW1pdGVyc19VSV8pOwotCQlzdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c1hTTC5UQUdfTkFNRSwKLQkJCQlYTUxVSU1lc3NhZ2VzLlRhZ19OYW1lc19VSV8pOwotCQlzdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c1hTTC5UQUdfQVRUUklCVVRFX05BTUUsCi0JCQkJWE1MVUlNZXNzYWdlcy5BdHRyaWJ1dGVfTmFtZXNfVUlfKTsKLQkJc3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNYU0wuVEFHX0FUVFJJQlVURV9WQUxVRSwKLQkJCQlYTUxVSU1lc3NhZ2VzLkF0dHJpYnV0ZV9WYWx1ZXNfVUlfKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCQlnZXRPdmVybGF5U3RvcmUoKS5sb2FkRGVmYXVsdHMoKTsKLQkJYXBwbHlTdHlsZXMoKTsKLQkJc3R5bGVzVmlld2VyLnNldFNlbGVjdGlvbihTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKTsKLQkJYWN0aXZhdGUobnVsbCk7Ci0JCXN0eWxlZFRleHQucmVkcmF3KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlnZXRPdmVybGF5U3RvcmUoKS5wcm9wYWdhdGUoKTsKLQotCQlYU0xVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCVNTRVVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNlbGVjdENvbG9yQXRPZmZzZXQoaW50IG9mZnNldCkgewotCQlTdHJpbmcgbmFtZWRTdHlsZSA9IGdldE5hbWVkU3R5bGVBdE9mZnNldChvZmZzZXQpOwotCQlpZiAobmFtZWRTdHlsZSAhPSBudWxsKSB7Ci0JCQlzdHlsZXNWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5hbWVkU3R5bGUpKTsKLQkJCXN0eWxlc1ZpZXdlci5yZXZlYWwobmFtZWRTdHlsZSk7Ci0JCX0gZWxzZSB7Ci0JCQlzdHlsZXNWaWV3ZXIuc2V0U2VsZWN0aW9uKFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkpOwotCQl9Ci0JCWFjdGl2YXRlKG5hbWVkU3R5bGUpOwotCX0KLQotCS8qKgotCSAqIFNwZWNpZmljYWxseSBzZXQgdGhlIHJlcG9ydGluZyBuYW1lIG9mIGEgY29udHJvbCBmb3IgYWNjZXNzaWJpbGl0eQotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRBY2Nlc3NpYmxlKENvbnRyb2wgY29udHJvbCwgU3RyaW5nIG5hbWUpIHsKLQkJaWYgKGNvbnRyb2wgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZmluYWwgU3RyaW5nIG4gPSBuYW1lOwotCQljb250cm9sLmdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIobmV3IEFjY2Vzc2libGVBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJaWYgKGUuY2hpbGRJRCA9PSBBQ0MuQ0hJTERJRF9TRUxGKQotCQkJCQllLnJlc3VsdCA9IG47Ci0JCQl9Ci0JCX0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YU0xUZW1wbGF0ZVByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWFNMVGVtcGxhdGVQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjA5ZDYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YU0xUZW1wbGF0ZVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRGF2aWQgQ2FydmVyIC0gU1RBUiAtIGJ1ZyAyMTM4NDkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxUZW1wbGF0ZVByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwuWFNMVUlQbHVnaW47Ci0KLS8qKgotICogWFNMVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSBzZXRzIHVwIHRoZSB0ZW1wbGF0ZSBwcmVmZXJlbmNlIHBhZ2UgdGhhdAotICogY29udGFpbnMgdGhlIHRlbXBsYXRlcyBmb3IgeHBhdGgsIHhwYXRoIDIuMCwgYXhpcywgb3BlcmF0b3JzLCBhbmQgCi0gKiBleHNsdCBmdW5jdGlvbnMuIAotICogCi0gKiBAYXV0aG9yIGRjYXJ2ZXIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBYU0xUZW1wbGF0ZVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgWE1MVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgWFNMVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSgpIHsKLQkJc2V0UHJlZmVyZW5jZVN0b3JlKFhTTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JCXNldFRlbXBsYXRlU3RvcmUoWFNMVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFRlbXBsYXRlU3RvcmUoKSk7Ci0JCXNldENvbnRleHRUeXBlUmVnaXN0cnkoWFNMVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCkpOwotCX0KLQkKLQkvKioKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlUGFnZSNwZXJmb3JtT2soKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJYm9vbGVhbiBvayA9IHN1cGVyLnBlcmZvcm1PaygpOwotCQlYU0xVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCXJldHVybiBvazsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1hTTFVJUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWFNMVUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjM2OTRjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWFNMVUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgQmVuamFtaW4gTXVza2FsbGEsIGIubXVza2FsbGFAZ214Lm5ldCAtIFsxNTg2NjBdIGNoYXJhY3RlciBlbnRpdGllcyBzaG91bGQgaGF2ZSB0aGVpciBvd24gc3ludGF4IGhpZ2hsaWdodGluZyBwcmVmZXJlbmNlIAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkNvbG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkNvbG9ySGVscGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5YU0xVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLnN0eWxlLklTdHlsZUNvbnN0YW50c1hTTDsKLQotLyoqCi0gKiBTZXRzIGRlZmF1bHQgdmFsdWVzIGZvciBYTUwgVUkgcHJlZmVyZW5jZXMKLSAqLwotcHVibGljIGNsYXNzIFhTTFVJUHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgewotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIjaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IFhTTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJQ29sb3JSZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0VGhlbWVNYW5hZ2VyKCkuZ2V0Q3VycmVudFRoZW1lKCkuZ2V0Q29sb3JSZWdpc3RyeSgpOwotCi0KLQkJLy8gWFNMIFN0eWxlIFByZWZlcmVuY2VzCi0JCVN0cmluZyBCT0xEID0gIiB8IG51bGwgfCB0cnVlIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgSlVTVElUQUxJQyA9ICIgfCBudWxsIHwgZmFsc2UgfCB0cnVlIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c1hTTC5UQUdfQVRUUklCVVRFX05BTUUsIDEyNywgMCwgMTI3KSArIEJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWFNMLlRBR19BVFRSSUJVVEVfTkFNRSwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c1hTTC5UQUdfQVRUUklCVVRFX1ZBTFVFLCA0MiwgMCwgMjU1KSArIEpVU1RJVEFMSUM7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWFNMLlRBR19BVFRSSUJVVEVfVkFMVUUsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNYU0wuVEFHX0JPUkRFUiwgMCwgMTI4LCAxMjgpICsgQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYU0wuVEFHX0JPUkRFUiwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c1hTTC5UQUdfTkFNRSwgNjMsIDEyNywgMTI3KSArIEJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWFNMLlRBR19OQU1FLCBzdHlsZVZhbHVlKTsKLQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1hTTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1hTTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWU3ZmE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YU0xWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICpDb3B5cmlnaHQgKGMpIDIwMDggU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsIGFuZCBvdGhlcnMuCi0gKkFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKndoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICpDb250cmlidXRvcnM6Ci0gKiAgICBEYXZpZCBDYXJ2ZXIgLSBidWcgMjMwMDcyIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIGJhc2VkIG9uIGNvZGUgZnJvbQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvdWcgU2F0Y2h3ZWxsLCBKZXNwZXIgTW9lbGxlciwgYW5kIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUTUwgVmFsaWRhdGlvbiBQcmVmZXJlbmNlUGFnZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuRXhwYW5zaW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuRXhwYW5zaW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5FeHBhbmRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuU2Nyb2xsZWRQYWdlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuUGl4ZWxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLlZhbGlkYXRpb25QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwuWFNMQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLlhTTFVJUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgWFNMVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU2V0dGluZ3NQYWdlIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRVJST1JTID0gbmV3IFN0cmluZ1tdIHsgIkVycm9yIiwgIldhcm5pbmciLCAiSWdub3JlIiB9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIEVSUk9SX1ZBTFVFUyA9IG5ldyBpbnRbXSB7IElNYXJrZXIuU0VWRVJJVFlfRVJST1IsIElNYXJrZXIuU0VWRVJJVFlfV0FSTklORywgSU1hcmtlci5TRVZFUklUWV9JTkZPIH07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPEludGVnZXIsIEludGVnZXI+IEVSUk9SX01BUCA9IG5ldyBIYXNoTWFwPEludGVnZXIsIEludGVnZXI+KCk7Ci0JcHJpdmF0ZSBUZXh0IG1heEVycm9yc1RleHQ7Ci0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBDb21ibz4gY29tYm9zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDb21ibz4oKTsKLQlwcml2YXRlIExpc3Q8RXhwYW5kYWJsZUNvbXBvc2l0ZT4gRXhwYW5kYWJsZXMgPSBuZXcgQXJyYXlMaXN0PEV4cGFuZGFibGVDb21wb3NpdGU+KCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVFRJTkdTX1NFQ1RJT05fTkFNRSA9ICJYU0xWYWxpZGF0aW9uU2V2ZXJpdGllcyI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgUGl4ZWxDb252ZXJ0ZXIgZlBpeGVsQ29udmVydGVyOwotCi0KLQlzdGF0aWMKLQl7Ci0JCUVSUk9SX01BUC5wdXQoSU1hcmtlci5TRVZFUklUWV9FUlJPUiwgMCk7Ci0JCUVSUk9SX01BUC5wdXQoSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HLCAxKTsKLQkJRVJST1JfTUFQLnB1dChJTWFya2VyLlNFVkVSSVRZX0lORk8sIDIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb21tb25Db250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZpbmFsIENvbXBvc2l0ZSBwYWdlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJCi0JCS8vR3JpZExheW91dAotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJcGFnZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCWZQaXhlbENvbnZlcnRlciA9IG5ldyBQaXhlbENvbnZlcnRlcihwYXJlbnQpOwotCQkKLQkJZmluYWwgQ29tcG9zaXRlIGNvbnRlbnQgPSBjcmVhdGVWYWxpZGF0aW9uU2VjdGlvbihwYWdlKTsKLQotCQlsb2FkUHJlZmVyZW5jZXMoKTsKLQkJcmVzdG9yZVNlY3Rpb25FeHBhbnNpb25TdGF0ZXMoZ2V0RGlhbG9nU2V0dGluZ3MoKS5nZXRTZWN0aW9uKFNFVFRJTkdTX1NFQ1RJT05fTkFNRSkpOwotCQkKLQkJR3JpZERhdGEgZ3JpZERhdGE9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IGZQaXhlbENvbnZlcnRlci5jb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKDIwKTsKLQkJY29udGVudC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCi0JCXJldHVybiBwYWdlOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVZhbGlkYXRpb25TZWN0aW9uKENvbXBvc2l0ZSBwYXJlbnQpCi0JewotCQlHcmlkTGF5b3V0IGxheW91dD0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnM9IDI7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQ9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aD0gMDsKLQkJCi0JCWZpbmFsIFNjcm9sbGVkUGFnZUNvbnRlbnQgcGFnZUNvbnRlbnQgPSBuZXcgU2Nyb2xsZWRQYWdlQ29udGVudChwYXJlbnQpOwotCQlwYWdlQ29udGVudC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJcGFnZUNvbnRlbnQuc2V0RXhwYW5kSG9yaXpvbnRhbCh0cnVlKTsKLQkJcGFnZUNvbnRlbnQuc2V0RXhwYW5kVmVydGljYWwodHJ1ZSk7Ci0JCQotCQlDb21wb3NpdGUgYm9keSA9IHBhZ2VDb250ZW50LmdldEJvZHkoKTsKLQkJYm9keS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlHcmlkRGF0YSBnZD0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkNFTlRFUiwgdHJ1ZSwgZmFsc2UsIDIsIDEpOwotCQlnZC5ob3Jpem9udGFsSW5kZW50PSAwOwotCi0JCUxhYmVsIGRlc2NyaXB0aW9uID0gbmV3IExhYmVsKGJvZHksIFNXVC5OT05FKTsKLQkJZGVzY3JpcHRpb24uc2V0VGV4dCgiU2VsZWN0IHRoZSBzZXJ2ZXJpdHkgbGV2ZWwgZm9yIHRoZSBmb2xsb3dpbmcgdmFsaWRhdGlvbiBwcm9ibGVtczoiKTsKLQkJZGVzY3JpcHRpb24uc2V0Rm9udChwYWdlQ29udGVudC5nZXRGb250KCkpOwotCQlkZXNjcmlwdGlvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCi0KLQkJY3JlYXRlTGFiZWwoYm9keSwgIk1heGltdW0gbnVtYmVyIG9mIGVycm9ycyByZXBvcnRlZCBwZXIgc3R5bGVzaGVldDoiKTsKLQkJbWF4RXJyb3JzVGV4dCA9IGNyZWF0ZVRleHRGaWVsZChib2R5KTsKLQkJbWF4RXJyb3JzVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQotCQlFeHBhbmRhYmxlQ29tcG9zaXRlIHR3aXN0aWU7Ci0JCQotCQlpbnQgY29sdW1ucyA9IDM7Ci0JCXR3aXN0aWUgPSBjcmVhdGVUd2lzdGllKGJvZHksIkltcG9ydHMgYW5kIEluY2x1ZGVzIixjb2x1bW5zKTsKLQkJQ29tcG9zaXRlIGlubmVyID0gY3JlYXRlSW5uZXJDb21wb3NpdGUocGFyZW50LCB0d2lzdGllLCBjb2x1bW5zKTsKLQkJCi0JCVN0cmluZyBsYWJlbCA9ICJVbnJlc29sdmVkIGluY2x1ZGUvaW1wb3J0OiI7Ci0JCWNyZWF0ZUNvbWJvKGlubmVyLCBsYWJlbCwgVmFsaWRhdGlvblByZWZlcmVuY2VzLk1JU1NJTkdfSU5DTFVERSk7Ci0KLQkJbGFiZWwgPSAiVW5yZXNvbHZlZCBpbmNsdWRlL2ltcG9ydDoiOwotCQlpbm5lciA9IGNyZWF0ZUlubmVyQ29tcG9zaXRlKHBhcmVudCwgdHdpc3RpZSwgY29sdW1ucyk7Ci0JCWNyZWF0ZUNvbWJvKGlubmVyLCBsYWJlbCwgVmFsaWRhdGlvblByZWZlcmVuY2VzLk1JU1NJTkdfSU5DTFVERSk7Ci0JCWNyZWF0ZUNvbWJvKGlubmVyLCAiQ2lyY3VsYXIgcmVmZXJlbmNlczoiLCBWYWxpZGF0aW9uUHJlZmVyZW5jZXMuQ0lSQ1VMQVJfUkVGKTsKLQotCQl0d2lzdGllID0gY3JlYXRlVHdpc3RpZShib2R5LCJOYW1lZCBUZW1wbGF0ZXMiLGNvbHVtbnMpOwotCQlpbm5lciA9IGNyZWF0ZUlubmVyQ29tcG9zaXRlKHBhcmVudCwgdHdpc3RpZSwgY29sdW1ucyk7Ci0JCQotCQljcmVhdGVDb21ibyhpbm5lciwgIlRlbXBsYXRlIG5hbWUgY29uZmxpY3RzOiIsIFZhbGlkYXRpb25QcmVmZXJlbmNlcy5URU1QTEFURV9DT05GTElDVCk7Ci0JCWNyZWF0ZUNvbWJvKGlubmVyLCAiRHVwbGljYXRlIHBhcmFtZXRlcnc6IiwgVmFsaWRhdGlvblByZWZlcmVuY2VzLkRVUExJQ0FURV9QQVJBTUVURVIpOwotCQljcmVhdGVDb21ibyhpbm5lciwgIlBhcmFtZXRlciB3aXRob3V0IG5hbWUgYXR0cmlidXRlOiIsIFZhbGlkYXRpb25QcmVmZXJlbmNlcy5OQU1FX0FUVFJJQlVURV9NSVNTSU5HKTsKLQkJY3JlYXRlQ29tYm8oaW5uZXIsICJQYXJhbWV0ZXIgd2l0aCBlbXB0eSBuYW1lIGF0dHJpYnV0ZToiLCBWYWxpZGF0aW9uUHJlZmVyZW5jZXMuTkFNRV9BVFRSSUJVVEVfRU1QVFkpOwotCQkKLQkJdHdpc3RpZSA9IGNyZWF0ZVR3aXN0aWUoYm9keSwiVGVtcGxhdGUgQ2FsbHMiLGNvbHVtbnMpOwotCQlpbm5lciA9IGNyZWF0ZUlubmVyQ29tcG9zaXRlKHBhcmVudCwgdHdpc3RpZSwgY29sdW1ucyk7Ci0JCQotCQljcmVhdGVDb21ibyhpbm5lciwgIlVucmVzb2x2ZWQgdGVtcGxhdGVzOiIsIFZhbGlkYXRpb25QcmVmZXJlbmNlcy5DQUxMX1RFTVBMQVRFUyk7Ci0JCWNyZWF0ZUNvbWJvKGlubmVyLCAiTWlzc2luZyBwYXJhbWV0ZXJzOiIsIFZhbGlkYXRpb25QcmVmZXJlbmNlcy5NSVNTSU5HX1BBUkFNKTsKLQkJY3JlYXRlQ29tYm8oaW5uZXIsICJQYXJhbWV0ZXJzIHdpdGhvdXQgdmFsdWU6IiwgVmFsaWRhdGlvblByZWZlcmVuY2VzLkVNUFRZX1BBUkFNKTsKLQotCQl0d2lzdGllID0gY3JlYXRlVHdpc3RpZShib2R5LCJYUGF0aCBQcm9ibGVtcyIsY29sdW1ucyk7Ci0JCWlubmVyID0gY3JlYXRlSW5uZXJDb21wb3NpdGUocGFyZW50LCB0d2lzdGllLCBjb2x1bW5zKTsKLQkJY3JlYXRlQ29tYm8oaW5uZXIsICJJbmNvcnJlY3QgWFBhdGggc3ludGF4OiIsIFZhbGlkYXRpb25QcmVmZXJlbmNlcy5YUEFUSFMpOwotCQkKLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVJbm5lckNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LAotCQkJRXhwYW5kYWJsZUNvbXBvc2l0ZSB0d2lzdGllLCBpbnQgY29sdW1ucykgewotCQlDb21wb3NpdGUgaW5uZXIgPSBuZXcgQ29tcG9zaXRlKHR3aXN0aWUsIFNXVC5OT05FKTsKLQkJaW5uZXIuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJaW5uZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KGNvbHVtbnMsIGZhbHNlKSk7Ci0JCXR3aXN0aWUuc2V0Q2xpZW50KGlubmVyKTsKLQkJcmV0dXJuIGlubmVyOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29tYm8gY3JlYXRlQ29tYm8oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsLCBTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBhZGRDb21ib0JveChwYXJlbnQsIGxhYmVsLCBrZXksIEVSUk9SX1ZBTFVFUywgRVJST1JTLCAwKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQpOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCi0KLQkJLy9HcmlkRGF0YQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwpOwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQ0VOVEVSOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXJldHVybiBsYWJlbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIFRleHQgY3JlYXRlVGV4dEZpZWxkKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0KLQkJLy9HcmlkRGF0YQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5DRU5URVI7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEV4cGFuZGFibGVDb21wb3NpdGUgY3JlYXRlVHdpc3RpZShDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwsIGludCBuQ29sdW1ucykgewotCQlFeHBhbmRhYmxlQ29tcG9zaXRlIGV4Y29tcG9zaXRlPSBuZXcgRXhwYW5kYWJsZUNvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FLCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRXSVNUSUUgfCBFeHBhbmRhYmxlQ29tcG9zaXRlLkNMSUVOVF9JTkRFTlQpOwotCQlleGNvbXBvc2l0ZS5zZXRUZXh0KGxhYmVsKTsKLQkJZXhjb21wb3NpdGUuc2V0RXhwYW5kZWQoZmFsc2UpOwotCQlleGNvbXBvc2l0ZS5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldEZvbnRSZWdpc3RyeSgpLmdldEJvbGQoSkZhY2VSZXNvdXJjZXMuRElBTE9HX0ZPTlQpKTsKLQkJZXhjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuRklMTCwgdHJ1ZSwgZmFsc2UsIG5Db2x1bW5zLCAxKSk7Ci0JCWV4Y29tcG9zaXRlLmFkZEV4cGFuc2lvbkxpc3RlbmVyKG5ldyBFeHBhbnNpb25BZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBleHBhbnNpb25TdGF0ZUNoYW5nZWQoRXhwYW5zaW9uRXZlbnQgZSkgewotCQkJCWV4cGFuZGVkU3RhdGVDaGFuZ2VkKChFeHBhbmRhYmxlQ29tcG9zaXRlKSBlLmdldFNvdXJjZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCUV4cGFuZGFibGVzLmFkZChleGNvbXBvc2l0ZSk7Ci0JCW1ha2VTY3JvbGxhYmxlQ29tcG9zaXRlQXdhcmUoZXhjb21wb3NpdGUpOwotCQlyZXR1cm4gZXhjb21wb3NpdGU7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBtYWtlU2Nyb2xsYWJsZUNvbXBvc2l0ZUF3YXJlKENvbnRyb2wgY29udHJvbCkKLQl7Ci0JCVNjcm9sbGVkUGFnZUNvbnRlbnQgcGFyZW50U2Nyb2xsZWRDb21wb3NpdGUgPSBnZXRQYXJlbnRTY3JvbGxlZENvbXBvc2l0ZShjb250cm9sKTsKLQkJaWYgKHBhcmVudFNjcm9sbGVkQ29tcG9zaXRlICE9IG51bGwpCi0JCXsKLQkJCXBhcmVudFNjcm9sbGVkQ29tcG9zaXRlLmFkYXB0Q2hpbGQoY29udHJvbCk7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3RvcmVTZWN0aW9uRXhwYW5zaW9uU3RhdGVzKGdldERpYWxvZ1NldHRpbmdzKCkuYWRkTmV3U2VjdGlvbihTRVRUSU5HU19TRUNUSU9OX05BTUUpKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFF1YWxpZmllcigpIHsKLQkJcmV0dXJuIFhTTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCkgewotCQlyZXR1cm4gWFNMQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcmVmZXJlbmNlUGFnZUlEKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLndzdC54c2wudWkucHJlZmVyZW5jZXMuVmFsaWRhdGlvbiI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9qZWN0U2V0dGluZ3NLZXkoKSB7Ci0JCXJldHVybiBYU0xDb3JlUGx1Z2luLlVTRV9QUk9KRUNUX1NFVFRJTkdTOwotCX0KLQkKLQlwcm90ZWN0ZWQgSURpYWxvZ1NldHRpbmdzIGdldERpYWxvZ1NldHRpbmdzKCkgewotCQlyZXR1cm4gWFNMVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JfQkKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvcGVydHlQYWdlSUQoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2Uud3N0LnhzbC51aS5wcm9wZXJ0eVBhZ2UucHJvamVjdC52YWxpZGF0aW9uIjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJLy8gSWYgd2UgYXJlIGNhbGxlZCB0b28gZWFybHksIGkuZS4gYmVmb3JlIHRoZSBjb250cm9scyBhcmUgY3JlYXRlZAotCQkvLyB0aGVuIHJldHVybgotCQkvLyB0byBhdm9pZCBudWxsIHBvaW50ZXIgZXhjZXB0aW9ucwotCQlpZiAoZS53aWRnZXQgIT0gbnVsbCAmJiBlLndpZGdldC5pc0Rpc3Bvc2VkKCkpCi0JCQlyZXR1cm47Ci0KLQkJdmFsaWRhdGVWYWx1ZXMoKTsKLQkJZW5hYmxlVmFsdWVzKCk7Ci0JfQotCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZVZhbHVlcygpCi0JewotCQlpbnQgbWF4RXJyb3JzID0gSW50ZWdlci5wYXJzZUludChtYXhFcnJvcnNUZXh0LmdldFRleHQoKSk7Ci0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShWYWxpZGF0aW9uUHJlZmVyZW5jZXMuTUFYX0VSUk9SUywgbWF4RXJyb3JzKTsKLQkJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBDb21ibz4gZW50cnkgOiBjb21ib3MuZW50cnlTZXQoKSkKLQkJewotCQkJaW50IGluZGV4ID0gZW50cnkuZ2V0VmFsdWUoKS5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKGVudHJ5LmdldEtleSgpLCBFUlJPUl9WQUxVRVNbaW5kZXhdKTsKLQkJfQotCQlzdXBlci5zdG9yZVZhbHVlcygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZXMgZ2V0TW9kZWxQcmVmZXJlbmNlcygpCi0JewotCQlyZXR1cm4gWFNMQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBsb2FkUHJlZmVyZW5jZXMoKSB7Ci0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGdldENvbnRyb2woKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpbml0aWFsaXplVmFsdWVzKCk7Ci0JCQkJdmFsaWRhdGVWYWx1ZXMoKTsKLQkJCQllbmFibGVWYWx1ZXMoKTsKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVmFsdWVzKCkKLQl7Ci0JCWludCBtYXhFcnJvcnMgPSBnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0SW50KFZhbGlkYXRpb25QcmVmZXJlbmNlcy5NQVhfRVJST1JTKTsKLQkJbWF4RXJyb3JzVGV4dC5zZXRUZXh0KFN0cmluZy52YWx1ZU9mKG1heEVycm9ycykpOwotCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIENvbWJvPiBlbnRyeSA6IGNvbWJvcy5lbnRyeVNldCgpKQotCQl7Ci0JCQlpbnQgdmFsID0gZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldEludChlbnRyeS5nZXRLZXkoKSk7Ci0JCQllbnRyeS5nZXRWYWx1ZSgpLnNlbGVjdChFUlJPUl9NQVAuZ2V0KHZhbCkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlVmFsdWVzKCkKLQl7Ci0JCVN0cmluZyBlcnJvck1lc3NhZ2UgPSBudWxsOwotCQl0cnkKLQkJewotCQkJaW50IG1heEVycm9ycyA9IEludGVnZXIucGFyc2VJbnQobWF4RXJyb3JzVGV4dC5nZXRUZXh0KCkpOwotCQkJaWYgKG1heEVycm9ycyA8IDApCi0JCQkJZXJyb3JNZXNzYWdlID0gIk1heCBlcnJvcnMgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIiOwotCQl9Ci0JCWNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkKLQkJewotCQkJZXJyb3JNZXNzYWdlID0gIk1heCBlcnJvcnMgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIiOwotCQl9Ci0JCXNldEVycm9yTWVzc2FnZShlcnJvck1lc3NhZ2UpOwotCQlzZXRWYWxpZChlcnJvck1lc3NhZ2UgPT0gbnVsbCk7Ci0JfQkKLQkKLQlwcm90ZWN0ZWQgdm9pZCBlbmFibGVWYWx1ZXMoKSB7Ci0JfQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXJlc2V0U2V2ZXJpdGllcygpOwotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQl9Ci0JCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuQWJzdHJhY3RWYWxpZGF0aW9uU2V0dGluZ3NQYWdlI3BlcmZvcm1PaygpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlib29sZWFuIHJlc3VsdCA9IHN1cGVyLnBlcmZvcm1PaygpOwotCQlzdG9yZVZhbHVlcygpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvcXVpY2thc3Npc3QvT3ZlcnJpZGVRdWlja0Fzc2lzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3F1aWNrYXNzaXN0L092ZXJyaWRlUXVpY2tBc3Npc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM3YmI3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvcXVpY2thc3Npc3QvT3ZlcnJpZGVRdWlja0Fzc2lzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLnF1aWNrYXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5xdWlja2Fzc2lzdC5JUXVpY2tBc3Npc3RJbnZvY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnF1aWNrYXNzaXN0LklRdWlja0Fzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Bbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgT3ZlcnJpZGVRdWlja0Fzc2lzdCBpbXBsZW1lbnRzIElRdWlja0Fzc2lzdFByb2Nlc3NvcgotewotCi0JcHVibGljIE92ZXJyaWRlUXVpY2tBc3Npc3QoKQotCXsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuQXNzaXN0KElRdWlja0Fzc2lzdEludm9jYXRpb25Db250ZXh0IGludm9jYXRpb25Db250ZXh0KQotCXsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRml4KEFubm90YXRpb24gYW5ub3RhdGlvbikKLQl7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gY29tcHV0ZVF1aWNrQXNzaXN0UHJvcG9zYWxzKElRdWlja0Fzc2lzdEludm9jYXRpb25Db250ZXh0IGludm9jYXRpb25Db250ZXh0KQotCXsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpCi0JewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3F1aWNrYXNzaXN0L1ZhbGlkYXRpb25RdWlja0Fzc2lzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3F1aWNrYXNzaXN0L1ZhbGlkYXRpb25RdWlja0Fzc2lzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTJhM2ViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9xdWlja2Fzc2lzdC9WYWxpZGF0aW9uUXVpY2tBc3Npc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5xdWlja2Fzc2lzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5Db21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5xdWlja2Fzc2lzdC5JUXVpY2tBc3Npc3RJbnZvY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnF1aWNrYXNzaXN0LklRdWlja0Fzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Bbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvblF1aWNrQXNzaXN0IGltcGxlbWVudHMgSVF1aWNrQXNzaXN0UHJvY2Vzc29yCi17Ci0JcHJpdmF0ZSBTdHJpbmcgcHJvYmxlbUlkOwotCi0JcHVibGljIFZhbGlkYXRpb25RdWlja0Fzc2lzdCgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkFzc2lzdChJUXVpY2tBc3Npc3RJbnZvY2F0aW9uQ29udGV4dCBpbnZvY2F0aW9uQ29udGV4dCkKLQl7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRml4KEFubm90YXRpb24gYW5ub3RhdGlvbikKLQl7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlUXVpY2tBc3Npc3RQcm9wb3NhbHMoSVF1aWNrQXNzaXN0SW52b2NhdGlvbkNvbnRleHQgaW52b2NhdGlvbkNvbnRleHQpCi0JewotCQlDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBuZXcgQ29tcGxldGlvblByb3Bvc2FsKCJkb3VnIiw1LDEwLDExKTsKLQkJcmV0dXJuIG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW117cHJvcG9zYWx9OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkKLQl7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByb2JsZW1JZChTdHJpbmcgaWQpCi0JewotCQl0aGlzLnByb2JsZW1JZCA9IGlkOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3N0eWxlL0lTdHlsZUNvbnN0YW50c1hTTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3N0eWxlL0lTdHlsZUNvbnN0YW50c1hTTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYzIyMmRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9zdHlsZS9JU3R5bGVDb25zdGFudHNYU0wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgQmVuamFtaW4gTXVza2FsbGEsIGIubXVza2FsbGFAZ214Lm5ldCAtIFsxNTg2NjBdIGNoYXJhY3RlciBlbnRpdGllcyBzaG91bGQgaGF2ZSB0aGVpciBvd24gc3ludGF4IGhpZ2hsaWdodGluZyBwcmVmZXJlbmNlICAgICAgCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5zdHlsZTsKLQotLyoqCi0gKiBDb250YWlucyB0aGUgc3ltYm9saWMgbmFtZSBvZiBzdHlsZXMgdXNlZCBieSBMaW5lU3R5bGVQcm92aWRlciwKLSAqIENvbG9yTWFuYWdlciwgYW5kIGFueSBvdGhlcnMgd2hvIG1heSBiZSBpbnRlcmVzdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0eWxlQ29uc3RhbnRzWFNMIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQUNLR1JPVU5EID0gInhzbGJhY2tncm91bmQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVDTF9CT1JERVIgPSAieHNsZGVjbEJvZGVyIjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JFR1JPVU5EID0gInhzbGZvcmVncm91bmQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQVRUUklCVVRFX0VRVUFMUyA9ICJ4c2x0YWdBdHRyaWJ1dGVFcXVhbHMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0FUVFJJQlVURV9OQU1FID0gInhzbHRhZ0F0dHJpYnV0ZU5hbWUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQVRUUklCVVRFX1ZBTFVFID0gInhzbHRhZ0F0dHJpYnV0ZVZhbHVlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0JPUkRFUiA9ICJ4c2x0YWdCb3JkZXIiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfTkFNRSA9ICJ4c2x0YWdOYW1lIjsvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JYU0wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9zdHlsZS9MaW5lU3R5bGVQcm92aWRlckZvclhTTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMjlkYzRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9zdHlsZS9MaW5lU3R5bGVQcm92aWRlckZvclhTTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAJCURhdmlkIENhcnZlciAoU1RBUikgLSBpbml0aWFsIGFwaSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLnN0eWxlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUeXBlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQ2hhaW5lZFByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkNvbG9ySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuQWJzdHJhY3RMaW5lU3R5bGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkhpZ2hsaWdodGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5SZWNvbmNpbGVySGlnaGxpZ2h0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLkVkaXRvclV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnN0eWxlLklTdHlsZUNvbnN0YW50c1hNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLlhTTFVJUGx1Z2luOwotCi0vKioKLSAqIFRoaXMgaW1wbGVtZW50cyBhIFN5bnRheCBMaW5lIFN0eWxlIFByb3ZpZGVyIGZvciBYU0wuIEl0IGxldmVyYWdlcyBzb21lCi0gKiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBYTUwgU3ludGF4IENvbG9yaW5nLCBidXQgYWRkcyBzcGVjaWZpYyBjb2xvcmluZyBmb3IgWFNMCi0gKiBzcGVjaWZpYyBlbGVtZW50cyBhbmQgYXR0cmlidXRlcy4KLSAqIAotICogQGF1dGhvciBEYXZpZCBDYXJ2ZXIKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTGluZVN0eWxlUHJvdmlkZXJGb3JYU0wgZXh0ZW5kcyBBYnN0cmFjdExpbmVTdHlsZVByb3ZpZGVyIGltcGxlbWVudHMgTGluZVN0eWxlUHJvdmlkZXIgewotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50OwotCXByb3RlY3RlZCBIaWdobGlnaHRlciBoaWdobGlnaHRlcjsKLQlwcml2YXRlIGJvb2xlYW4gaW5pdGlhbGl6ZWQ7Ci0JcHJvdGVjdGVkIFJlY29uY2lsZXJIaWdobGlnaHRlciByZWNIaWdobGlnaHRlciA9IG51bGw7Ci0KLQlwcml2YXRlIElQcmVmZXJlbmNlU3RvcmUgeG1sUHJlZmVyZW5jZVN0b3JlID0gbnVsbDsKLQlwcml2YXRlIElQcmVmZXJlbmNlU3RvcmUgeHNsUHJlZmVyZW5jZVN0b3JlID0gbnVsbDsKLQlwcml2YXRlIElQcmVmZXJlbmNlU3RvcmUgY29tYmluZWRQcmVmZXJlbmNlU3RvcmUgPSBudWxsOwotCXByaXZhdGUgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcHJlZmVyZW5jZUxpc3RlbmVyICA9IG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7Ci0JCi0JcHJpdmF0ZSBjbGFzcyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgewotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIjcHJvcGVydHlDaGFuZ2Uob3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJLy8gaGF2ZSB0byBkbyBpdCB0aGlzIHdheSBzbyBvdGhlcnMgY2FuIG92ZXJyaWRlIHRoZSBtZXRob2QKLQkJCWhhbmRsZVByb3BlcnR5Q2hhbmdlKGV2ZW50KTsKLQkJfQotCX0JCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb21tb25Jbml0KElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsCi0JCQlIaWdobGlnaHRlciBoaWdobGlnaHRlcikgewotCi0JCXN0cnVjdHVyZWREb2N1bWVudCA9IGRvY3VtZW50OwotCQl0aGlzLmhpZ2hsaWdodGVyID0gaGlnaGxpZ2h0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZW9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXIjCi0JICogcHJlcGFyZVJlZ2lvbnMob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb24sIGludCwgaW50LAotCSAqIGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHByZXBhcmVSZWdpb25zKElUeXBlZFJlZ2lvbiB0eXBlZFJlZ2lvbiwKLQkJCWludCBsaW5lUmVxdWVzdFN0YXJ0LCBpbnQgbGluZVJlcXVlc3RMZW5ndGgsIENvbGxlY3Rpb24gaG9sZFJlc3VsdHMpIHsKLQkJZmluYWwgaW50IHBhcnRpdGlvblN0YXJ0T2Zmc2V0ID0gdHlwZWRSZWdpb24uZ2V0T2Zmc2V0KCk7Ci0JCWZpbmFsIGludCBwYXJ0aXRpb25MZW5ndGggPSB0eXBlZFJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBnZXREb2N1bWVudCgpCi0JCQkJLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHBhcnRpdGlvblN0YXJ0T2Zmc2V0KTsKLQkJYm9vbGVhbiBoYW5kbGVkID0gZmFsc2U7Ci0KLQkJaGFuZGxlZCA9IHByZXBhcmVUZXh0UmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sCi0JCQkJcGFydGl0aW9uU3RhcnRPZmZzZXQsIHBhcnRpdGlvbkxlbmd0aCwgaG9sZFJlc3VsdHMpOwotCi0JCXJldHVybiBoYW5kbGVkOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZWdpb24KLQkgKiBAcGFyYW0gc3RhcnQKLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogQHBhcmFtIGhvbGRSZXN1bHRzCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmVUZXh0UmVnaW9uKElUZXh0UmVnaW9uQ29sbGVjdGlvbiBibG9ja2VkUmVnaW9uLAotCQkJaW50IHBhcnRpdGlvblN0YXJ0T2Zmc2V0LCBpbnQgcGFydGl0aW9uTGVuZ3RoLAotCQkJQ29sbGVjdGlvbiBob2xkUmVzdWx0cykgewotCQlib29sZWFuIGhhbmRsZWQgPSBmYWxzZTsKLQkJZmluYWwgaW50IHBhcnRpdGlvbkVuZE9mZnNldCA9IHBhcnRpdGlvblN0YXJ0T2Zmc2V0ICsgcGFydGl0aW9uTGVuZ3RoCi0JCQkJLSAxOwotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGJsb2NrZWRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2UgPSBudWxsOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQlUZXh0QXR0cmlidXRlIGF0dHIgPSBudWxsOwotCQkJVGV4dEF0dHJpYnV0ZSBwcmV2aW91c0F0dHIgPSBudWxsOwotCQkJaWYgKGJsb2NrZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSA+IHBhcnRpdGlvbkVuZE9mZnNldCkKLQkJCQlicmVhazsKLQkJCWlmIChibG9ja2VkUmVnaW9uLmdldEVuZE9mZnNldChyZWdpb24pIDw9IHBhcnRpdGlvblN0YXJ0T2Zmc2V0KQotCQkJCWNvbnRpbnVlOwotCi0JCQlpZiAocmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db2xsZWN0aW9uKSB7Ci0JCQkJaGFuZGxlZCA9IHByZXBhcmVUZXh0UmVnaW9uKChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIHJlZ2lvbiwKLQkJCQkJCXBhcnRpdGlvblN0YXJ0T2Zmc2V0LCBwYXJ0aXRpb25MZW5ndGgsIGhvbGRSZXN1bHRzKTsKLQkJCX0gZWxzZSB7Ci0KLQkJCQlhdHRyID0gZ2V0QXR0cmlidXRlRm9yKGJsb2NrZWRSZWdpb24sIHJlZ2lvbik7Ci0JCQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJCQloYW5kbGVkID0gdHJ1ZTsKLQkJCQkJc3R5bGVSYW5nZSA9IGFwcGx5U3R5bGVSYW5nZShibG9ja2VkUmVnaW9uLAotCQkJCQkJCXBhcnRpdGlvblN0YXJ0T2Zmc2V0LCBwYXJ0aXRpb25MZW5ndGgsIGhvbGRSZXN1bHRzLAotCQkJCQkJCXJlZ2lvbiwgc3R5bGVSYW5nZSwgYXR0ciwgcHJldmlvdXNBdHRyKTsKLQkJCQl9IGVsc2UgewotCQkJCQlwcmV2aW91c0F0dHIgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaGFuZGxlZDsKLQl9Ci0KLQlwcml2YXRlIFN0eWxlUmFuZ2UgYXBwbHlTdHlsZVJhbmdlKElUZXh0UmVnaW9uQ29sbGVjdGlvbiBibG9ja2VkUmVnaW9uLAotCQkJaW50IHBhcnRpdGlvblN0YXJ0T2Zmc2V0LCBpbnQgcGFydGl0aW9uTGVuZ3RoLAotCQkJQ29sbGVjdGlvbiBob2xkUmVzdWx0cywgSVRleHRSZWdpb24gcmVnaW9uLCBTdHlsZVJhbmdlIHN0eWxlUmFuZ2UsCi0JCQlUZXh0QXR0cmlidXRlIGF0dHIsIFRleHRBdHRyaWJ1dGUgcHJldmlvdXNBdHRyKSB7Ci0JCWlmIChlcXVhbHNQcmV2aW91c0F0dHJpYnV0ZShzdHlsZVJhbmdlLCBhdHRyLCBwcmV2aW91c0F0dHIpKSB7Ci0JCQlzdHlsZVJhbmdlLmxlbmd0aCArPSByZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCX0gZWxzZSB7Ci0JCQlzdHlsZVJhbmdlID0gY3JlYXRlU3R5bGVSYW5nZShibG9ja2VkUmVnaW9uLCByZWdpb24sIGF0dHIsCi0JCQkJCXBhcnRpdGlvblN0YXJ0T2Zmc2V0LCBwYXJ0aXRpb25MZW5ndGgpOwotCQkJaG9sZFJlc3VsdHMuYWRkKHN0eWxlUmFuZ2UpOwotCQkJcHJldmlvdXNBdHRyID0gYXR0cjsKLQkJfQotCQlyZXR1cm4gc3R5bGVSYW5nZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZXF1YWxzUHJldmlvdXNBdHRyaWJ1dGUoU3R5bGVSYW5nZSBzdHlsZVJhbmdlLAotCQkJVGV4dEF0dHJpYnV0ZSBhdHRyLCBUZXh0QXR0cmlidXRlIHByZXZpb3VzQXR0cikgewotCQlyZXR1cm4gKHN0eWxlUmFuZ2UgIT0gbnVsbCkgJiYgKHByZXZpb3VzQXR0ciAhPSBudWxsKQotCQkJCSYmIChwcmV2aW91c0F0dHIuZXF1YWxzKGF0dHIpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlVGV4dFJlZ2lvbnMoCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwKLQkJCWludCBwYXJ0aXRpb25TdGFydE9mZnNldCwgaW50IHBhcnRpdGlvbkxlbmd0aCwKLQkJCUNvbGxlY3Rpb24gaG9sZFJlc3VsdHMpIHsKLQkJYm9vbGVhbiBoYW5kbGVkID0gZmFsc2U7Ci0JCWZpbmFsIGludCBwYXJ0aXRpb25FbmRPZmZzZXQgPSBwYXJ0aXRpb25TdGFydE9mZnNldCArIHBhcnRpdGlvbkxlbmd0aAotCQkJCS0gMTsKLQkJd2hpbGUgKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsCi0JCQkJJiYgc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkgPD0gcGFydGl0aW9uRW5kT2Zmc2V0KSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCi0JCQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2UgPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQkJcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkJVGV4dEF0dHJpYnV0ZSBhdHRyID0gbnVsbDsKLQkJCQlUZXh0QXR0cmlidXRlIHByZXZpb3VzQXR0ciA9IG51bGw7Ci0JCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChyZWdpb24pID4gcGFydGl0aW9uRW5kT2Zmc2V0KQotCQkJCQlicmVhazsKLQkJCQlpZiAoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZE9mZnNldChyZWdpb24pIDw9IHBhcnRpdGlvblN0YXJ0T2Zmc2V0KQotCQkJCQljb250aW51ZTsKLQotCQkJCWlmIChyZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIHsKLQkJCQkJYm9vbGVhbiBoYW5kbGVkQ29sbGVjdGlvbiA9IChwcmVwYXJlVGV4dFJlZ2lvbigKLQkJCQkJCQkoSVRleHRSZWdpb25Db2xsZWN0aW9uKSByZWdpb24sCi0JCQkJCQkJcGFydGl0aW9uU3RhcnRPZmZzZXQsIHBhcnRpdGlvbkxlbmd0aCwgaG9sZFJlc3VsdHMpKTsKLQkJCQkJaGFuZGxlZCA9ICghaGFuZGxlZCkgPyBoYW5kbGVkQ29sbGVjdGlvbiA6IGhhbmRsZWQ7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYXR0ciA9IGdldEF0dHJpYnV0ZUZvcihzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHJlZ2lvbik7Ci0JCQkJCWlmIChhdHRyID09IG51bGwpIHsKLQkJCQkJCXByZXZpb3VzQXR0ciA9IG51bGw7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQloYW5kbGVkID0gdHJ1ZTsKLQkJCQkJCXN0eWxlUmFuZ2UgPSBhcHBseVN0eWxlUmFuZ2Uoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLAotCQkJCQkJCQlwYXJ0aXRpb25TdGFydE9mZnNldCwgcGFydGl0aW9uTGVuZ3RoLAotCQkJCQkJCQlob2xkUmVzdWx0cywgcmVnaW9uLCBzdHlsZVJhbmdlLCBhdHRyLAotCQkJCQkJCQlwcmV2aW91c0F0dHIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJc3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldE5leHQoKTsKLQkJfQotCQlyZXR1cm4gaGFuZGxlZDsKLQl9Ci0KLQlwcml2YXRlIFN0eWxlUmFuZ2UgY3JlYXRlU3R5bGVSYW5nZSgKLQkJCUlUZXh0UmVnaW9uQ29sbGVjdGlvbiB0ZXh0UmVnaW9uQ29sbGVjdGlvbiwgSVRleHRSZWdpb24gdGV4dFJlZ2lvbiwKLQkJCVRleHRBdHRyaWJ1dGUgYXR0ciwgaW50IHN0YXJ0T2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCWludCBzdGFydGluZ09mZnNldCA9IHRleHRSZWdpb25Db2xsZWN0aW9uLmdldFN0YXJ0T2Zmc2V0KHRleHRSZWdpb24pOwotCQlpZiAoc3RhcnRpbmdPZmZzZXQgPCBzdGFydE9mZnNldCkKLQkJCXN0YXJ0aW5nT2Zmc2V0ID0gc3RhcnRPZmZzZXQ7Ci0KLQkJaW50IHRleHRFbmQgPSBzdGFydGluZ09mZnNldAotCQkJCSsgdGV4dFJlZ2lvbkNvbGxlY3Rpb24uZ2V0VGV4dCh0ZXh0UmVnaW9uKS5sZW5ndGgoKTsKLQkJaW50IG1heE9mZnNldCA9IHN0YXJ0T2Zmc2V0ICsgbGVuZ3RoOwotCQlpbnQgZW5kaW5nT2Zmc2V0ID0gdGV4dFJlZ2lvbkNvbGxlY3Rpb24uZ2V0RW5kT2Zmc2V0KHRleHRSZWdpb24pOwotCi0JCWlmICh0ZXh0RW5kIDwgZW5kaW5nT2Zmc2V0KQotCQkJZW5kaW5nT2Zmc2V0ID0gdGV4dEVuZDsKLQkJaWYgKGVuZGluZ09mZnNldCA+IG1heE9mZnNldCkKLQkJCWVuZGluZ09mZnNldCA9IG1heE9mZnNldDsKLQkJU3R5bGVSYW5nZSByZXN1bHQgPSBuZXcgU3R5bGVSYW5nZShzdGFydGluZ09mZnNldCwgZW5kaW5nT2Zmc2V0Ci0JCQkJLSBzdGFydGluZ09mZnNldCwgYXR0ci5nZXRGb3JlZ3JvdW5kKCksIGF0dHIuZ2V0QmFja2dyb3VuZCgpLAotCQkJCWF0dHIuZ2V0U3R5bGUoKSk7Ci0JCWlmICgoYXR0ci5nZXRTdHlsZSgpICYgVGV4dEF0dHJpYnV0ZS5TVFJJS0VUSFJPVUdIKSAhPSAwKSB7Ci0JCQlyZXN1bHQuc3RyaWtlb3V0ID0gdHJ1ZTsKLQkJfQotCQlpZiAoKGF0dHIuZ2V0U3R5bGUoKSAmIFRleHRBdHRyaWJ1dGUuVU5ERVJMSU5FKSAhPSAwKSB7Ci0JCQlyZXN1bHQudW5kZXJsaW5lID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFRleHRBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlRm9yKElUZXh0UmVnaW9uQ29sbGVjdGlvbiBjb2xsZWN0aW9uLAotCQkJSVRleHRSZWdpb24gdGV4dFJlZ2lvbikgewotCQlpZiAodGV4dFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gWE1MVGV4dEF0dHJpYnV0ZU1hcC5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRUZXh0QXR0cmlidXRlTWFwKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9URVhUKTsKLQkJfQotCi0JCVN0cmluZyB0eXBlID0gdGV4dFJlZ2lvbi5nZXRUeXBlKCk7Ci0JCWlmIChjb2xsZWN0aW9uLmdldFRleHQoKS5jb250YWlucygieHNsOiIpKSB7Ci0JCQlyZXR1cm4gZ2V0WFNMQXR0cmlidXRlKHR5cGUpOwotCQl9Ci0KLQkJcmV0dXJuIGdldFhNTEF0dHJpYnV0ZSh0eXBlKTsKLQl9Ci0KLQlwcml2YXRlIFRleHRBdHRyaWJ1dGUgZ2V0WFNMQXR0cmlidXRlKFN0cmluZyB0eXBlKSB7Ci0JCU1hcDxTdHJpbmcsIFN0cmluZz4gcmVnaW9uTWFwID0gWFNMUmVnaW9uTWFwLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0UmVnaW9uTWFwKCk7Ci0JCU1hcDxTdHJpbmcsIFRleHRBdHRyaWJ1dGU+IHRleHRBdHRyaWJ1dGVzID0gWFNMVGV4dEF0dHJpYnV0ZU1hcAotCQkJCS5nZXRJbnN0YW5jZSgpLmdldFRleHRBdHRyaWJ1dGVNYXAoKTsKLQkJcmV0dXJuIGdldFRleHRBdHRyaWJ1dGUodHlwZSwgcmVnaW9uTWFwLCB0ZXh0QXR0cmlidXRlcyk7Ci0JfQotCi0JcHJpdmF0ZSBUZXh0QXR0cmlidXRlIGdldFhNTEF0dHJpYnV0ZShTdHJpbmcgdHlwZSkgewotCQlNYXA8U3RyaW5nLCBTdHJpbmc+IHJlZ2lvbk1hcCA9IFhNTFJlZ2lvbk1hcC5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldFJlZ2lvbk1hcCgpOwotCQlNYXA8U3RyaW5nLCBUZXh0QXR0cmlidXRlPiB0ZXh0QXR0cmlidXRlcyA9IFhNTFRleHRBdHRyaWJ1dGVNYXAKLQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRUZXh0QXR0cmlidXRlTWFwKCk7Ci0KLQkJcmV0dXJuIGdldFRleHRBdHRyaWJ1dGUodHlwZSwgcmVnaW9uTWFwLCB0ZXh0QXR0cmlidXRlcyk7Ci0JfQotCi0JcHJpdmF0ZSBUZXh0QXR0cmlidXRlIGdldFRleHRBdHRyaWJ1dGUoU3RyaW5nIHR5cGUsCi0JCQlNYXA8U3RyaW5nLCBTdHJpbmc+IHJlZ2lvbk1hcCwKLQkJCU1hcDxTdHJpbmcsIFRleHRBdHRyaWJ1dGU+IHRleHRBdHRyTWFwKSB7Ci0JCXJldHVybiB0ZXh0QXR0ck1hcC5nZXQocmVnaW9uTWFwLmdldCh0eXBlKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgc3R5bGVLZXkgPSBudWxsOwotCQlpZiAoZXZlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlTdHJpbmcgcHJlZktleSA9IGV2ZW50LmdldFByb3BlcnR5KCk7Ci0JCS8vIGNoZWNrIGlmIHByZWZlcmVuY2UgY2hhbmdlZCBpcyBhIHN0eWxlIHByZWZlcmVuY2UKLQkJaWYgKElTdHlsZUNvbnN0YW50c1hTTC5UQUdfTkFNRS5lcXVhbHMocHJlZktleSkpIHsKLQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWFNMLlRBR19OQU1FOwotCQl9Ci0JCWlmIChJU3R5bGVDb25zdGFudHNYU0wuVEFHX0JPUkRFUi5lcXVhbHMocHJlZktleSkpIHsKLQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWFNMLlRBR19CT1JERVI7Ci0JCX0KLQkJaWYgKElTdHlsZUNvbnN0YW50c1hTTC5UQUdfQVRUUklCVVRFX05BTUUuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hTTC5UQUdfQVRUUklCVVRFX05BTUU7Ci0JCX0KLQkJaWYgKElTdHlsZUNvbnN0YW50c1hTTC5UQUdfQVRUUklCVVRFX1ZBTFVFLmVxdWFscyhwcmVmS2V5KSkgewotCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYU0wuVEFHX0FUVFJJQlVURV9WQUxVRTsKLQkJfQotCQlpZiAoc3R5bGVLZXkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAoc3R5bGVLZXkgIT0gbnVsbCkgewotCQkJLy8gb3ZlcndyaXRlIHN0eWxlIHByZWZlcmVuY2Ugd2l0aCBuZXcgdmFsdWUKLQkJCWFkZFRleHRBdHRyaWJ1dGUoc3R5bGVLZXkpOwotCQl9Ci0JCQotCQlpZihyZWNIaWdobGlnaHRlciAhPSBudWxsKQotCQkJcmVjSGlnaGxpZ2h0ZXIucmVmcmVzaERpc3BsYXkoKTsKLQkJCi0JfQotCQotCS8qKgotCSAqIExvb2tzIHVwIHRoZSBjb2xvcktleSBpbiB0aGUgcHJlZmVyZW5jZSBzdG9yZSBhbmQgYWRkcyB0aGUgc3R5bGUKLQkgKiBpbmZvcm1hdGlvbiB0byBsaXN0IG9mIFRleHRBdHRyaWJ1dGVzCi0JICogCi0JICogQHBhcmFtIGNvbG9yS2V5Ci0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkVGV4dEF0dHJpYnV0ZShTdHJpbmcgY29sb3JLZXkpIHsKLQkJaWYgKGdldENvbG9yUHJlZmVyZW5jZXMoKSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldENvbG9yUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoY29sb3JLZXkpOwotCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJUkdCIGZvcmVncm91bmQgPSBDb2xvckhlbHBlci50b1JHQihzdHlsZVByZWZzWzBdKTsKLQkJCQlSR0IgYmFja2dyb3VuZCA9IENvbG9ySGVscGVyLnRvUkdCKHN0eWxlUHJlZnNbMV0pOwotCQkJCWJvb2xlYW4gYm9sZCA9IEJvb2xlYW4udmFsdWVPZihzdHlsZVByZWZzWzJdKS5ib29sZWFuVmFsdWUoKTsKLQkJCQlib29sZWFuIGl0YWxpYyA9IEJvb2xlYW4udmFsdWVPZihzdHlsZVByZWZzWzNdKS5ib29sZWFuVmFsdWUoKTsKLQkJCQlib29sZWFuIHN0cmlrZXRocm91Z2ggPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1s0XSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJYm9vbGVhbiB1bmRlcmxpbmUgPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1s1XSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJaW50IHN0eWxlID0gU1dULk5PUk1BTDsKLQkJCQlpZiAoYm9sZCkgewotCQkJCQlzdHlsZSA9IHN0eWxlIHwgU1dULkJPTEQ7Ci0JCQkJfQotCQkJCWlmIChpdGFsaWMpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFNXVC5JVEFMSUM7Ci0JCQkJfQotCQkJCWlmIChzdHJpa2V0aHJvdWdoKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBUZXh0QXR0cmlidXRlLlNUUklLRVRIUk9VR0g7Ci0JCQkJfQotCQkJCWlmICh1bmRlcmxpbmUpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFRleHRBdHRyaWJ1dGUuVU5ERVJMSU5FOwotCQkJCX0KLQotCQkJCXVwZGF0ZVRleHRBdHRyaWJ1dGUoY29sb3JLZXksIGZvcmVncm91bmQsIGJhY2tncm91bmQsIHN0eWxlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVUZXh0QXR0cmlidXRlKFN0cmluZyBjb2xvcktleSwgUkdCIGZvcmVncm91bmQsCi0JCQlSR0IgYmFja2dyb3VuZCwgaW50IHN0eWxlKSB7Ci0JCVRleHRBdHRyaWJ1dGUgY3JlYXRlVGV4dEF0dHJpYnV0ZSA9IGNyZWF0ZVRleHRBdHRyaWJ1dGUoZm9yZWdyb3VuZCwgYmFja2dyb3VuZCwgc3R5bGUpOwotCQkKLQkJVGV4dEF0dHJpYnV0ZSB0ZXh0QXR0cmlidXRlID0KLQkJCVhTTFRleHRBdHRyaWJ1dGVNYXAuZ2V0SW5zdGFuY2UoKS5nZXRUZXh0QXR0cmlidXRlTWFwKCkuZ2V0KGNvbG9yS2V5KTsKLQkJaWYgKHRleHRBdHRyaWJ1dGUgIT0gbnVsbCkgewotCQkJWFNMVGV4dEF0dHJpYnV0ZU1hcC5nZXRJbnN0YW5jZSgpLmdldFRleHRBdHRyaWJ1dGVNYXAoKS5wdXQoY29sb3JLZXksIGNyZWF0ZVRleHRBdHRyaWJ1dGUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQl0ZXh0QXR0cmlidXRlID0KLQkJCQlYTUxUZXh0QXR0cmlidXRlTWFwLmdldEluc3RhbmNlKCkuZ2V0VGV4dEF0dHJpYnV0ZU1hcCgpLmdldChjb2xvcktleSk7Ci0JCWlmICh0ZXh0QXR0cmlidXRlICE9IG51bGwpIHsKLQkJCVhNTFRleHRBdHRyaWJ1dGVNYXAuZ2V0SW5zdGFuY2UoKS5nZXRUZXh0QXR0cmlidXRlTWFwKCkucHV0KGNvbG9yS2V5LCBjcmVhdGVUZXh0QXR0cmlidXRlKTsKLQkJfQotCX0JCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlCi0JICogb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5MaW5lU3R5bGVQcm92aWRlciNpbml0Ci0JICogKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQsCi0JICogb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5IaWdobGlnaHRlcikKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0KElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIEhpZ2hsaWdodGVyIGhpZ2hsaWdodGVyKSB7Ci0JCWNvbW1vbkluaXQoc3RydWN0dXJlZERvY3VtZW50LCBoaWdobGlnaHRlcik7Ci0KLQkJaWYgKGlzSW5pdGlhbGl6ZWQoKSkKLQkJCXJldHVybjsKLQotCQlyZWdpc3RlclByZWZlcmVuY2VNYW5hZ2VyKCk7Ci0KLQkJc2V0SW5pdGlhbGl6ZWQodHJ1ZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZQotCSAqIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuQWJzdHJhY3RMaW5lU3R5bGVQcm92aWRlcgotCSAqICMKLQkgKiBpbml0KG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQKLQkgKiAsIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXIpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdChJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCwKLQkJCUlTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCWluaXQoc3RydWN0dXJlZERvY3VtZW50LCAoSGlnaGxpZ2h0ZXIpIG51bGwpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUKLQkgKiBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkFic3RyYWN0TGluZVN0eWxlUHJvdmlkZXIKLQkgKiAjCi0JICogaW5pdChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50Ci0JICogLAotCSAqIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuUmVjb25jaWxlckhpZ2hsaWdodGVyKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXQoSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQsCi0JCQlSZWNvbmNpbGVySGlnaGxpZ2h0ZXIgaGlnaGxpZ2h0ZXIpIHsKLQkJdGhpcy5zdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0JCXJlY0hpZ2hsaWdodGVyID0gaGlnaGxpZ2h0ZXI7Ci0KLQkJaWYgKGlzSW5pdGlhbGl6ZWQoKSkKLQkJCXJldHVybjsKLQotCQlyZWdpc3RlclByZWZlcmVuY2VNYW5hZ2VyKCk7Ci0KLQkJc2V0SW5pdGlhbGl6ZWQodHJ1ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJdW5SZWdpc3RlclByZWZlcmVuY2VNYW5hZ2VyKCk7Ci0JCXNldEluaXRpYWxpemVkKGZhbHNlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB1blJlZ2lzdGVyUHJlZmVyZW5jZU1hbmFnZXIoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgcHJlZiA9IGdldENvbG9yUHJlZmVyZW5jZXMoKTsKLQkJaWYgKHByZWYgIT0gbnVsbCkgewotCQkJcHJlZi5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByZWZlcmVuY2VMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCByZWdpc3RlclByZWZlcmVuY2VNYW5hZ2VyKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHByZWYgPSBnZXRDb2xvclByZWZlcmVuY2VzKCk7Ci0JCWlmIChwcmVmICE9IG51bGwpIHsKLQkJCXByZWYuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcmVmZXJlbmNlTGlzdGVuZXIgICk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbml0aWFsaXplZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0luaXRpYWxpemVkKCkgewotCQlyZXR1cm4gaW5pdGlhbGl6ZWQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW5pdGlhbGl6ZWQuCi0JICogCi0JICogQHBhcmFtIGluaXRpYWxpemVkCi0JICogICAgICAgICAgICBUaGUgaW5pdGlhbGl6ZWQgdG8gc2V0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEluaXRpYWxpemVkKGJvb2xlYW4gaW5pdGlhbGl6ZWQpIHsKLQkJdGhpcy5pbml0aWFsaXplZCA9IGluaXRpYWxpemVkOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJU3RydWN0dXJlZERvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50OwotCX0KLQotCS8qKgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBIaWdobGlnaHRlciBnZXRIaWdobGlnaHRlcigpIHsKLQkJcmV0dXJuIGhpZ2hsaWdodGVyOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBnZXRDb2xvclByZWZlcmVuY2VzKCkgewotCQlpZiAoeG1sUHJlZmVyZW5jZVN0b3JlID09IG51bGwpIHsKLQkJCXhtbFByZWZlcmVuY2VTdG9yZSA9IFhNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJfQotCQlpZiAoeHNsUHJlZmVyZW5jZVN0b3JlID09IG51bGwpIHsKLQkJCXhzbFByZWZlcmVuY2VTdG9yZSA9IFhTTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJfQotCQljb21iaW5lZFByZWZlcmVuY2VTdG9yZSA9IG5ldyBDaGFpbmVkUHJlZmVyZW5jZVN0b3JlKG5ldyBJUHJlZmVyZW5jZVN0b3JlW10geyB4bWxQcmVmZXJlbmNlU3RvcmUsIHhzbFByZWZlcmVuY2VTdG9yZSB9KTsKLQkJcmV0dXJuIGNvbWJpbmVkUHJlZmVyZW5jZVN0b3JlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBUZXh0QXR0cmlidXRlIGNyZWF0ZVRleHRBdHRyaWJ1dGUoUkdCIGZvcmVncm91bmQsIFJHQiBiYWNrZ3JvdW5kLCBib29sZWFuIGJvbGQpIHsKLQkJcmV0dXJuIG5ldyBUZXh0QXR0cmlidXRlKChmb3JlZ3JvdW5kICE9IG51bGwpID8gRWRpdG9yVXRpbGl0eS5nZXRDb2xvcihmb3JlZ3JvdW5kKSA6IG51bGwsIChiYWNrZ3JvdW5kICE9IG51bGwpID8gRWRpdG9yVXRpbGl0eS5nZXRDb2xvcihiYWNrZ3JvdW5kKSA6IG51bGwsIGJvbGQgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUwpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBUZXh0QXR0cmlidXRlIGNyZWF0ZVRleHRBdHRyaWJ1dGUoUkdCIGZvcmVncm91bmQsIFJHQiBiYWNrZ3JvdW5kLCBpbnQgc3R5bGUpIHsKLQkJcmV0dXJuIG5ldyBUZXh0QXR0cmlidXRlKChmb3JlZ3JvdW5kICE9IG51bGwpID8gRWRpdG9yVXRpbGl0eS5nZXRDb2xvcihmb3JlZ3JvdW5kKSA6IG51bGwsIChiYWNrZ3JvdW5kICE9IG51bGwpID8gRWRpdG9yVXRpbGl0eS5nZXRDb2xvcihiYWNrZ3JvdW5kKSA6IG51bGwsIHN0eWxlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVGV4dEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGVGb3IoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgbG9hZENvbG9ycygpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvc3R5bGUvWE1MUmVnaW9uTWFwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvc3R5bGUvWE1MUmVnaW9uTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzYjQ5NGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3N0eWxlL1hNTFJlZ2lvbk1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqQ29weXJpZ2h0IChjKSAyMDA4IFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCBhbmQgb3RoZXJzLgotICpBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKmFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICp3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICpodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqQ29udHJpYnV0b3JzOgotICogICAgRGF2aWQgQ2FydmVyIChTVEFSKSAgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLnN0eWxlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNYTUw7Ci0KLS8qKgotICogVGhlIFhNTFJlZ2lvbk1hcCBjbGFzcyBoYW5kbGVzIG1hcHBpbmcgZHV0aWVzIGZyb20gYW4gWE1MIFJlZ2lvbiB0bwotICogYSBMaW5lIFN0eWxlIENvbnN0YW50LgotICogCi0gKiBAYXV0aG9yIERhdmlkIENhcnZlcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgWE1MUmVnaW9uTWFwIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBIYXNoTWFwPFN0cmluZyxTdHJpbmc+IHJlZ2lvbk1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZyxTdHJpbmc+KCk7Ci0JcHJpdmF0ZSBzdGF0aWMgWE1MUmVnaW9uTWFwIHhtbFJlZ2lvbk1hcCA9IG5ldyBYTUxSZWdpb25NYXAoKTsgCi0JCi0JcHJpdmF0ZSBYTUxSZWdpb25NYXAoKSB7Ci0JCQotCQlyZWdpb25NYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQsIElTdHlsZUNvbnN0YW50c1hNTC5YTUxfQ09OVEVOVCk7Ci0JCXJlZ2lvbk1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9JTlRFUk5BTF9TVUJTRVQsIElTdHlsZUNvbnN0YW50c1hNTC5YTUxfQ09OVEVOVCk7Ci0JCXJlZ2lvbk1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4sIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQk9SREVSKTsKLQkJcmVnaW9uTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UsIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQk9SREVSKTsKLQkJcmVnaW9uTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4sIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQk9SREVSKTsKLQkJcmVnaW9uTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9PUEVOLCBJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfQk9SREVSKTsKLQkJcmVnaW9uTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9DTE9TRSwgSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX0JPUkRFUik7Ci0JCXJlZ2lvbk1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfVEVYVCwgSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX1RFWFQpOwotCQlyZWdpb25NYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfTkFNRSk7Ci0JCXJlZ2lvbk1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9ERUNMQVJBVElPTiwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19OQU1FKTsKLQkJcmVnaW9uTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19OQU1FKTsKLQkJcmVnaW9uTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRSk7Ci0JCXJlZ2lvbk1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMsIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX0VRVUFMUyk7Ci0JCXJlZ2lvbk1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9PUEVOLCBJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9CT1JERVIpOwotCQlyZWdpb25NYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfQ0xPU0UsIElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUik7Ci0JCXJlZ2lvbk1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9URVhULCBJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9URVhUKTsKLQkJcmVnaW9uTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX05BTUUsIElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX05BTUUpOwotCQlyZWdpb25NYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0NIQVJfUkVGRVJFTkNFLCBJU3R5bGVDb25zdGFudHNYTUwuRU5USVRZX1JFRkVSRU5DRSk7Ci0JCXJlZ2lvbk1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfUEVfUkVGRVJFTkNFLCBJU3R5bGVDb25zdGFudHNYTUwuRU5USVRZX1JFRkVSRU5DRSk7Ci0JCXJlZ2lvbk1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfQ09OVEVOVCwgSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0NPTlRFTlQpOwotCQlyZWdpb25NYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX09QRU4sIElTdHlsZUNvbnN0YW50c1hNTC5QSV9CT1JERVIpOwotCQlyZWdpb25NYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX0NMT1NFLCBJU3R5bGVDb25zdGFudHNYTUwuUElfQk9SREVSKTsKLQkJcmVnaW9uTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9ERUNMQVJBVElPTl9PUEVOLCBJU3R5bGVDb25zdGFudHNYTUwuREVDTF9CT1JERVIpOwotCQlyZWdpb25NYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0RFQ0xBUkFUSU9OX0NMT1NFLCBJU3R5bGVDb25zdGFudHNYTUwuREVDTF9CT1JERVIpOwotCQlyZWdpb25NYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGLCBJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUYpOwotCQlyZWdpb25NYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGLCBJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUYpOwotCQlyZWdpb25NYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCTElDLCBJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRCk7Ci0JCXJlZ2lvbk1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNURU0sIElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEKTsKLQkJcmVnaW9uTWFwLnB1dChET01SZWdpb25Db250ZXh0LlVOREVGSU5FRCwgSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX1RFWFQpOwotCQlyZWdpb25NYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuV0hJVEVfU1BBQ0UsIElTdHlsZUNvbnN0YW50c1hNTC5YTUxfQ09OVEVOVCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhlIFhNTFJlZ2lvbk1hcCBDbGFzcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFhNTFJlZ2lvbk1hcCBnZXRJbnN0YW5jZSgpIHsKLQkJICByZXR1cm4geG1sUmVnaW9uTWFwOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbWFwcGluZyBvZiBYTUwgUmVnaW9ucyB0byBTdHlsZSBDb25zdGFudHMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIE1hcDxTdHJpbmcsU3RyaW5nPiBnZXRSZWdpb25NYXAoKSB7Ci0JCXJldHVybiByZWdpb25NYXA7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvc3R5bGUvWE1MVGV4dEF0dHJpYnV0ZU1hcC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3N0eWxlL1hNTFRleHRBdHRyaWJ1dGVNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzExNzlmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvc3R5bGUvWE1MVGV4dEF0dHJpYnV0ZU1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKkNvcHlyaWdodCAoYykgMjAwOCBTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwgYW5kIG90aGVycy4KLSAqQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICphcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKkNvbnRyaWJ1dG9yczoKLSAqICAgIERhdmlkIENhcnZlciAoU1RBUikgLSBidWcgMjEzNzc1IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5zdHlsZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkNvbG9ySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbC5FZGl0b3JVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNYTUw7Ci0KLS8qKgotICogWE1sVGV4dEF0dHJpYnV0ZU1hcCBoYW5kbGVzIHRoZSBtYXBwaW5nIG9mIFhNTCBTdHlsZSBDb25zdGFudHMgdG8gVGV4dEF0dHJpYnV0ZXMuCi0gKiAKLSAqIEBhdXRob3IgRGF2aWQgQ2FydmVyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxUZXh0QXR0cmlidXRlTWFwIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBIYXNoTWFwPFN0cmluZyxUZXh0QXR0cmlidXRlPiB0ZXh0QXR0cmlidXRlTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLFRleHRBdHRyaWJ1dGU+KCk7Ci0JcHJpdmF0ZSBzdGF0aWMgWE1MVGV4dEF0dHJpYnV0ZU1hcCB4bWxUZXh0QXR0cmlidXRlTWFwID0gbmV3IFhNTFRleHRBdHRyaWJ1dGVNYXAoKTsgCi0JcHJpdmF0ZSBzdGF0aWMgSVByZWZlcmVuY2VTdG9yZSB4bWxQcmVmZXJlbmNlU3RvcmU7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSVByZWZlcmVuY2VTdG9yZSBnZXRYTUxQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiB4bWxQcmVmZXJlbmNlU3RvcmU7Ci0JfQotCXByaXZhdGUgWE1MVGV4dEF0dHJpYnV0ZU1hcCgpIHsKLQkJeG1sUHJlZmVyZW5jZVN0b3JlID0gWE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlhZGRYTUxUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfTkFNRSk7Ci0JCWFkZFhNTFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIpOwotCQlhZGRYTUxUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX05BTUUpOwotCQlhZGRYTUxUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFKTsKLQkJYWRkWE1MVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9FUVVBTFMpOwotCQlhZGRYTUxUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUik7Ci0JCWFkZFhNTFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfVEVYVCk7Ci0JCWFkZFhNTFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX0JPUkRFUik7Ci0JCWFkZFhNTFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX1RFWFQpOwotCQlhZGRYTUxUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5ERUNMX0JPUkRFUik7Ci0JCWFkZFhNTFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSUQpOwotCQlhZGRYTUxUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRik7Ci0JCWFkZFhNTFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGKTsKLQkJYWRkWE1MVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9OQU1FKTsKLQkJYWRkWE1MVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuUElfQ09OVEVOVCk7Ci0JCWFkZFhNTFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0JPUkRFUik7Ci0JCWFkZFhNTFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLlhNTF9DT05URU5UKTsKLQkJYWRkWE1MVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuRU5USVRZX1JFRkVSRU5DRSk7Ci0JfQotCQotCS8qKgotCSAqIEFuIGluc3RhbmNlIG9mIFhNTFRleHRBdHRyaWJ1dGVNYXAuCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgWE1MVGV4dEF0dHJpYnV0ZU1hcCBnZXRJbnN0YW5jZSgpIHsKLQkJICByZXR1cm4geG1sVGV4dEF0dHJpYnV0ZU1hcDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIE1hcCBvZiBTdHlsZSBDb25zdGFudHMgYW5kIHRoZSBjb3JyZXNwb25kaW5nIFRleHQgQXR0cmlidXRlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBNYXA8U3RyaW5nLFRleHRBdHRyaWJ1dGU+IGdldFRleHRBdHRyaWJ1dGVNYXAoKSB7Ci0JCXJldHVybiB0ZXh0QXR0cmlidXRlTWFwOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkWE1MVGV4dEF0dHJpYnV0ZShTdHJpbmcgY29sb3JLZXkpIHsKLQkJaWYgKGdldFhNTFByZWZlcmVuY2VTdG9yZSgpICE9IG51bGwpIHsKLQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0WE1MUHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKGNvbG9yS2V5KTsKLQkJCVN0cmluZ1tdIHN0eWxlUHJlZnMgPSBDb2xvckhlbHBlci51bnBhY2tTdHlsZVByZWZlcmVuY2VzKHByZWZTdHJpbmcpOwotCQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJCVJHQiBmb3JlZ3JvdW5kID0gQ29sb3JIZWxwZXIudG9SR0Ioc3R5bGVQcmVmc1swXSk7Ci0JCQkJUkdCIGJhY2tncm91bmQgPSBDb2xvckhlbHBlci50b1JHQihzdHlsZVByZWZzWzFdKTsKLQkJCQlib29sZWFuIGJvbGQgPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1syXSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJYm9vbGVhbiBpdGFsaWMgPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1szXSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJYm9vbGVhbiBzdHJpa2V0aHJvdWdoID0gQm9vbGVhbi52YWx1ZU9mKHN0eWxlUHJlZnNbNF0pLmJvb2xlYW5WYWx1ZSgpOwotCQkJCWJvb2xlYW4gdW5kZXJsaW5lID0gQm9vbGVhbi52YWx1ZU9mKHN0eWxlUHJlZnNbNV0pLmJvb2xlYW5WYWx1ZSgpOwotCQkJCWludCBzdHlsZSA9IFNXVC5OT1JNQUw7Ci0JCQkJaWYgKGJvbGQpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFNXVC5CT0xEOwotCQkJCX0KLQkJCQlpZiAoaXRhbGljKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBTV1QuSVRBTElDOwotCQkJCX0KLQkJCQlpZiAoc3RyaWtldGhyb3VnaCkgewotCQkJCQlzdHlsZSA9IHN0eWxlIHwgVGV4dEF0dHJpYnV0ZS5TVFJJS0VUSFJPVUdIOwotCQkJCX0KLQkJCQlpZiAodW5kZXJsaW5lKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBUZXh0QXR0cmlidXRlLlVOREVSTElORTsKLQkJCQl9Ci0KLQkJCQlUZXh0QXR0cmlidXRlIGNyZWF0ZVRleHRBdHRyaWJ1dGUgPSBjcmVhdGVUZXh0QXR0cmlidXRlKGZvcmVncm91bmQsIGJhY2tncm91bmQsIHN0eWxlKTsKLQkJCQl0ZXh0QXR0cmlidXRlTWFwLnB1dChjb2xvcktleSwgY3JlYXRlVGV4dEF0dHJpYnV0ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dEF0dHJpYnV0ZSBjcmVhdGVUZXh0QXR0cmlidXRlKFJHQiBmb3JlZ3JvdW5kLCBSR0IgYmFja2dyb3VuZCwgaW50IHN0eWxlKSB7Ci0JCXJldHVybiBuZXcgVGV4dEF0dHJpYnV0ZSgoZm9yZWdyb3VuZCAhPSBudWxsKSA/IEVkaXRvclV0aWxpdHkuZ2V0Q29sb3IoZm9yZWdyb3VuZCkgOiBudWxsLCAoYmFja2dyb3VuZCAhPSBudWxsKSA/IEVkaXRvclV0aWxpdHkuZ2V0Q29sb3IoYmFja2dyb3VuZCkgOiBudWxsLCBzdHlsZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvc3R5bGUvWFNMUmVnaW9uTWFwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvc3R5bGUvWFNMUmVnaW9uTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiYzI2YTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3N0eWxlL1hTTFJlZ2lvbk1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqQ29weXJpZ2h0IChjKSAyMDA4IFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCBhbmQgb3RoZXJzLgotICpBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKmFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICp3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICpodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqQ29udHJpYnV0b3JzOgotICogICAgRGF2aWQgQ2FydmVyIChTVEFSKSAtIGJ1ZyAyMTM3NzUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLnN0eWxlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLS8qKgotICogWFNMUmVnaW9uTWFwIGhhbmRsZXMgdGhlIG1hcHBpbmcgb2YgWE1MIFJlZ2lvbnMgdG8gWFNMIFN0eWxlIENvbnN0YW50cy4KLSAqIAotICogQGF1dGhvciBEYXZpZCBDYXJ2ZXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFhTTFJlZ2lvbk1hcCB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsU3RyaW5nPiByZWdpb25NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsU3RyaW5nPigpOwotCXByaXZhdGUgc3RhdGljIFhTTFJlZ2lvbk1hcCB4c2xSZWdpb25NYXAgPSBuZXcgWFNMUmVnaW9uTWFwKCk7IAotCQotCXByaXZhdGUgWFNMUmVnaW9uTWFwKCkgewotCQlyZWdpb25NYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOLCBJU3R5bGVDb25zdGFudHNYU0wuVEFHX0JPUkRFUik7Ci0JCXJlZ2lvbk1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOLCBJU3R5bGVDb25zdGFudHNYU0wuVEFHX0JPUkRFUik7Ci0JCXJlZ2lvbk1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFLCBJU3R5bGVDb25zdGFudHNYU0wuVEFHX0JPUkRFUik7Ci0JCXJlZ2lvbk1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFLCBJU3R5bGVDb25zdGFudHNYU0wuVEFHX0JPUkRFUik7Ci0JCXJlZ2lvbk1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FLCBJU3R5bGVDb25zdGFudHNYU0wuVEFHX0FUVFJJQlVURV9OQU1FKTsKLQkJcmVnaW9uTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSwgSVN0eWxlQ29uc3RhbnRzWFNMLlRBR19OQU1FKTsKLQkJcmVnaW9uTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFLCBJU3R5bGVDb25zdGFudHNYU0wuVEFHX0FUVFJJQlVURV9WQUxVRSk7Ci0JCi0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgWFNMUmVnaW9uTWFwLgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFhTTFJlZ2lvbk1hcCBnZXRJbnN0YW5jZSgpIHsKLQkJICByZXR1cm4geHNsUmVnaW9uTWFwOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgTUFQIG9mIFhTTCBSZWdpb25zIGFuZCBTdHlsZSBDb25zdGFudHMuCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBNYXA8U3RyaW5nLFN0cmluZz4gZ2V0UmVnaW9uTWFwKCkgewotCQlyZXR1cm4gcmVnaW9uTWFwOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3N0eWxlL1hTTFRleHRBdHRyaWJ1dGVNYXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9zdHlsZS9YU0xUZXh0QXR0cmlidXRlTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4Mjc0MDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3N0eWxlL1hTTFRleHRBdHRyaWJ1dGVNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKkNvcHlyaWdodCAoYykgMjAwOCBTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwgYW5kIG90aGVycy4KLSAqQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICphcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKkNvbnRyaWJ1dG9yczoKLSAqICAgIERhdmlkIENhcnZlciAoU1RBUikgLSBidWcgMjEzNzc1IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5zdHlsZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkNvbG9ySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbC5FZGl0b3JVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwuWFNMVUlQbHVnaW47Ci0KLS8qKgotICogSGFuZGxlcyB0aGUgbWFwcGluZyBvZiB0aGUgU3R5bGUgQ29uc3RhbnRzIHRvIFRleHQgQXR0cmlidXRlcyBmb3IgWFNMLgotICogCi0gKiBAYXV0aG9yIERhdmlkIENhcnZlcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgWFNMVGV4dEF0dHJpYnV0ZU1hcCB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsVGV4dEF0dHJpYnV0ZT4gdGV4dEF0dHJpYnV0ZU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZyxUZXh0QXR0cmlidXRlPigpOwotCXByaXZhdGUgc3RhdGljIFhTTFRleHRBdHRyaWJ1dGVNYXAgeHNsVGV4dEF0dHJpYnV0ZU1hcCA9IG5ldyBYU0xUZXh0QXR0cmlidXRlTWFwKCk7IAotCXByaXZhdGUgc3RhdGljIElQcmVmZXJlbmNlU3RvcmUgeHNsUHJlZmVyZW5jZVN0b3JlOwotCQotCXByaXZhdGUgc3RhdGljIElQcmVmZXJlbmNlU3RvcmUgZ2V0WHNsUHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4geHNsUHJlZmVyZW5jZVN0b3JlOwotCX0KLQlwcml2YXRlIFhTTFRleHRBdHRyaWJ1dGVNYXAoKSB7Ci0JCXhzbFByZWZlcmVuY2VTdG9yZSA9IFhTTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJYWRkWFNMVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYU0wuVEFHX05BTUUpOwotCQlhZGRYU0xUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hTTC5UQUdfQk9SREVSKTsKLQkJYWRkWFNMVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYU0wuVEFHX0FUVFJJQlVURV9OQU1FKTsKLQkJYWRkWFNMVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYU0wuVEFHX0FUVFJJQlVURV9WQUxVRSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgWFNMVGV4dEF0dHJpYnV0ZU1hcAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFhTTFRleHRBdHRyaWJ1dGVNYXAgZ2V0SW5zdGFuY2UoKSB7Ci0JCSAgcmV0dXJuIHhzbFRleHRBdHRyaWJ1dGVNYXA7Ci0JfQotCQotCS8qKgotCSAqIEdldCdzIGEgTWFwIG9mIFhTTCBTdHlsZSBDb25zdGFudHMgdG8gVGV4dCBBdHRyaWJ1dGVzLgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgTWFwPFN0cmluZyxUZXh0QXR0cmlidXRlPiBnZXRUZXh0QXR0cmlidXRlTWFwKCkgewotCQlyZXR1cm4gdGV4dEF0dHJpYnV0ZU1hcDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkWFNMVGV4dEF0dHJpYnV0ZShTdHJpbmcgY29sb3JLZXkpIHsKLQkJaWYgKGdldFhzbFByZWZlcmVuY2VTdG9yZSgpICE9IG51bGwpIHsKLQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0WHNsUHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKGNvbG9yS2V5KTsKLQkJCVN0cmluZ1tdIHN0eWxlUHJlZnMgPSBDb2xvckhlbHBlci51bnBhY2tTdHlsZVByZWZlcmVuY2VzKHByZWZTdHJpbmcpOwotCQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJCVJHQiBmb3JlZ3JvdW5kID0gQ29sb3JIZWxwZXIudG9SR0Ioc3R5bGVQcmVmc1swXSk7Ci0JCQkJUkdCIGJhY2tncm91bmQgPSBDb2xvckhlbHBlci50b1JHQihzdHlsZVByZWZzWzFdKTsKLQkJCQlib29sZWFuIGJvbGQgPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1syXSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJYm9vbGVhbiBpdGFsaWMgPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1szXSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJYm9vbGVhbiBzdHJpa2V0aHJvdWdoID0gQm9vbGVhbi52YWx1ZU9mKHN0eWxlUHJlZnNbNF0pLmJvb2xlYW5WYWx1ZSgpOwotCQkJCWJvb2xlYW4gdW5kZXJsaW5lID0gQm9vbGVhbi52YWx1ZU9mKHN0eWxlUHJlZnNbNV0pLmJvb2xlYW5WYWx1ZSgpOwotCQkJCWludCBzdHlsZSA9IFNXVC5OT1JNQUw7Ci0JCQkJaWYgKGJvbGQpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFNXVC5CT0xEOwotCQkJCX0KLQkJCQlpZiAoaXRhbGljKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBTV1QuSVRBTElDOwotCQkJCX0KLQkJCQlpZiAoc3RyaWtldGhyb3VnaCkgewotCQkJCQlzdHlsZSA9IHN0eWxlIHwgVGV4dEF0dHJpYnV0ZS5TVFJJS0VUSFJPVUdIOwotCQkJCX0KLQkJCQlpZiAodW5kZXJsaW5lKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBUZXh0QXR0cmlidXRlLlVOREVSTElORTsKLQkJCQl9Ci0KLQkJCQlUZXh0QXR0cmlidXRlIGNyZWF0ZVRleHRBdHRyaWJ1dGUgPSBjcmVhdGVUZXh0QXR0cmlidXRlKGZvcmVncm91bmQsIGJhY2tncm91bmQsIHN0eWxlKTsKLQkJCQl0ZXh0QXR0cmlidXRlTWFwLnB1dChjb2xvcktleSwgY3JlYXRlVGV4dEF0dHJpYnV0ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dEF0dHJpYnV0ZSBjcmVhdGVUZXh0QXR0cmlidXRlKFJHQiBmb3JlZ3JvdW5kLCBSR0IgYmFja2dyb3VuZCwgaW50IHN0eWxlKSB7Ci0JCXJldHVybiBuZXcgVGV4dEF0dHJpYnV0ZSgoZm9yZWdyb3VuZCAhPSBudWxsKSA/IEVkaXRvclV0aWxpdHkuZ2V0Q29sb3IoZm9yZWdyb3VuZCkgOiBudWxsLCAoYmFja2dyb3VuZCAhPSBudWxsKSA/IEVkaXRvclV0aWxpdHkuZ2V0Q29sb3IoYmFja2dyb3VuZCkgOiBudWxsLCBzdHlsZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVYU0wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvVGVtcGxhdGVDb250ZXh0VHlwZVhTTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjFkODNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvVGVtcGxhdGVDb250ZXh0VHlwZVhTTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC50ZW1wbGF0ZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5HbG9iYWxUZW1wbGF0ZVZhcmlhYmxlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzLkVuY29kaW5nVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVyWE1MOwotCi1wdWJsaWMgY2xhc3MgVGVtcGxhdGVDb250ZXh0VHlwZVhTTCBleHRlbmRzIFRlbXBsYXRlQ29udGV4dFR5cGUKLXsKLQlwdWJsaWMgVGVtcGxhdGVDb250ZXh0VHlwZVhTTCgpCi0JewotCQlzdXBlcigpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuQ3Vyc29yKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuRGF0ZSgpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLkRvbGxhcigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLkxpbmVTZWxlY3Rpb24oKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5UaW1lKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuVXNlcigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLldvcmRTZWxlY3Rpb24oKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5ZZWFyKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgRW5jb2RpbmdUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXJYTUwoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBWZXJzaW9uVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVyWFNMKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvVmVyc2lvblRlbXBsYXRlVmFyaWFibGVSZXNvbHZlclhTTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3RlbXBsYXRlcy9WZXJzaW9uVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVyWFNMLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNThiMmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3RlbXBsYXRlcy9WZXJzaW9uVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVyWFNMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLnRlbXBsYXRlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlNpbXBsZVRlbXBsYXRlVmFyaWFibGVSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBWZXJzaW9uVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVyWFNMIGV4dGVuZHMgU2ltcGxlVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVyCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fVFlQRSA9IGdldFZlcnNpb25UeXBlKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VmVyc2lvblR5cGUoKQotCXsKLQkJcmV0dXJuICJ4c2xfdmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgVmVyc2lvblRlbXBsYXRlVmFyaWFibGVSZXNvbHZlclhTTCgpCi0JewotCQlzdXBlcihWRVJTSU9OX1RZUEUsICJYU0xUIFZlcnNpb24gcHJlZmVyZW5jZSIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZShUZW1wbGF0ZUNvbnRleHQgY29udGV4dCkKLQl7Ci0JCS8vIFRPRE8KLQkJcmV0dXJuICIxLjAiOwotCQkvLyByZXR1cm4KLQkJLy8gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuT1VUUFVUX0NPREVTRVQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvWFNMVGVtcGxhdGVzUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3RlbXBsYXRlcy9YU0xUZW1wbGF0ZXNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkOTM4YjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3RlbXBsYXRlcy9YU0xUZW1wbGF0ZXNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLnRlbXBsYXRlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuQ29udGV4dFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5Eb2N1bWVudFRlbXBsYXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLnBlcnNpc3RlbmNlLlRlbXBsYXRlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci50ZW1wbGF0ZXMuQWJzdHJhY3RUZW1wbGF0ZXNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwueHBhdGgudWkuaW50ZXJuYWwuWFBhdGhVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlSWRzWFBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLmVkaXRvci5YU0xFZGl0b3I7Ci0KLS8qKgotICogVGhlIFhTTCBUZW1wbGF0ZXMgUGFnZSBpcyB1c2VkIGJ5IHRoZSBUZW1wbGF0ZXNWaWV3ZXIgdG8gZGlzcGxheSBhdmFpbGFibGUKLSAqIFhTTCBUZW1wbGF0ZXMgZm9yIHVzZSB3aXRoaW4gYSBYU0wgU3RydWN0dXJlZCBUZXh0IEVkaXRvci4gSXQgaXMgcHJvdmlkZWQgYXMKLSAqIGFuIGV4YW1wbGUgb24gaG93IG90aGVyIFNTRSBlZGl0b3JzIGNhbiBjb250cmlidXRlIHRoZWlyIHRlbXBsYXRlcyB0byB0aGUKLSAqIHBhZ2UuCi0gKiAKLSAqIEBhdXRob3IgZGNhcnZlcgotICogCi0gKi8KLQotcHVibGljIGNsYXNzIFhTTFRlbXBsYXRlc1BhZ2UgZXh0ZW5kcyBBYnN0cmFjdFRlbXBsYXRlc1BhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfUEFHRV9JRCA9ICJvcmcuZWNsaXBzZS53c3QueHNsLnVpLlhQYXRoIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGVtcGxhdGVTdG9yZSBURU1QTEFURV9TVE9SRSA9IFhQYXRoVUlQbHVnaW4KLQkJCS5nZXREZWZhdWx0KCkuZ2V0WFBhdGhUZW1wbGF0ZVN0b3JlKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJUHJlZmVyZW5jZVN0b3JlIFBSRUZFUkVOQ0VfU1RPUkUgPSBYUGF0aFVJUGx1Z2luCi0JCQkuZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29udGV4dFR5cGVSZWdpc3RyeSBURU1QTEFURV9DT05URVhUX1JFR0lTVFJZID0gWFBhdGhVSVBsdWdpbgotCQkJLmdldERlZmF1bHQoKS5nZXRYUGF0aFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCk7Ci0KLQlwcml2YXRlIFhTTEVkaXRvciBmVGV4dEVkaXRvcjsKLQotCXB1YmxpYyBYU0xUZW1wbGF0ZXNQYWdlKFhTTEVkaXRvciB4c2xUZXh0RWRpdG9yKSB7Ci0JCXN1cGVyKHhzbFRleHRFZGl0b3IsIHhzbFRleHRFZGl0b3IuZ2V0VGV4dFZpZXdlcigpKTsKLQkJZlRleHRFZGl0b3IgPSB4c2xUZXh0RWRpdG9yOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRDb250ZXh0VHlwZUlkcyhJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IFRlbXBsYXRlQ29udGV4dFR5cGVJZHNYUGF0aC5YUEFUSCwKLQkJCQlUZW1wbGF0ZUNvbnRleHRUeXBlSWRzWFBhdGguQVhJUywKLQkJCQlUZW1wbGF0ZUNvbnRleHRUeXBlSWRzWFBhdGguT1BFUkFUT1IgfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udGV4dFR5cGVSZWdpc3RyeSBnZXRDb250ZXh0VHlwZVJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gVEVNUExBVEVfQ09OVEVYVF9SRUdJU1RSWTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByZWZlcmVuY2VQYWdlSWQoKSB7Ci0JCXJldHVybiBQUkVGRVJFTkNFX1BBR0VfSUQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZ2V0VGVtcGxhdGVQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBQUkVGRVJFTkNFX1NUT1JFOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBUZW1wbGF0ZVN0b3JlIGdldFRlbXBsYXRlU3RvcmUoKSB7Ci0JCXJldHVybiBURU1QTEFURV9TVE9SRTsKLQl9Ci0KLQkvLyBUaGlzIGNvZGUgYmFzZWQgb24gdGhlIEphdmFUZW1wbGF0ZXNQYWdlIGNvZGUuIE1vZGlmaWVkIHRvIHdvcmsgd2l0aAotCS8vIFNTRQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5zZXJ0VGVtcGxhdGUoVGVtcGxhdGUgdGVtcGxhdGUsIElEb2N1bWVudCBkb2N1bWVudCkgewotCQlJU291cmNlVmlld2VyIGNvbnRleHRWaWV3ZXIgPSBmVGV4dEVkaXRvci5nZXRUZXh0Vmlld2VyKCk7Ci0JCUlUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIGNvbnRleHRWaWV3ZXIKLQkJCQkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQotCQlpZiAoIWlzVmFsaWRUZW1wbGF0ZShkb2N1bWVudCwgdGVtcGxhdGUsIHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCksCi0JCQkJdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSkpCi0JCQlyZXR1cm47Ci0KLQkJYmVnaW5Db21wb3VuZENoYW5nZShjb250ZXh0Vmlld2VyKTsKLQotCQkvKgotCQkgKiBUaGUgRWRpdG9yIGNoZWNrcyB3aGV0aGVyIGEgY29tcGxldGlvbiBmb3IgYSB3b3JkIGV4aXN0cyBiZWZvcmUgaXQKLQkJICogYWxsb3dzIGZvciB0aGUgdGVtcGxhdGUgdG8gYmUgYXBwbGllZC4gV2UgcGlja3VwIHRoZSBjdXJyZW50IHRleHQgYXQKLQkJICogdGhlIHNlbGVjdGlvbiBwb3NpdGlvbiBhbmQgcmVwbGFjZSBpdCB3aXRoIHRoZSBmaXJzdCBjaGFyIG9mIHRoZQotCQkgKiB0ZW1wbGF0ZSBuYW1lIGZvciB0aGlzIHRvIHN1Y2NlZWQuIEFub3RoZXIgYWR2YW50YWdlIGJ5IHRoaXMgbWV0aG9kCi0JCSAqIGlzIHRoYXQgdGhlIHRlbXBsYXRlIHJlcGxhY2VzIHRoZSBzZWxlY3RlZCB0ZXh0IHByb3ZpZGVkIHRoZQotCQkgKiBzZWxlY3Rpb24gYnkgaXRzZWxmIGlzIG5vdCB1c2VkIGluIHRoZSB0ZW1wbGF0ZSBwYXR0ZXJuLgotCQkgKi8KLQotCQlTdHJpbmcgc2F2ZWRUZXh0OwotCi0JCXRyeSB7Ci0JCQlzYXZlZFRleHQgPSBkb2N1bWVudC5nZXQodGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgdGV4dFNlbGVjdGlvbgotCQkJCQkuZ2V0TGVuZ3RoKCkpOwotCi0JCQlpZiAoc2F2ZWRUZXh0Lmxlbmd0aCgpID09IDApIHsKLQkJCQlTdHJpbmcgcHJlZml4ID0gZ2V0SWRlbnRpZmllclBhcnQoZG9jdW1lbnQsIHRlbXBsYXRlLAotCQkJCQkJdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSk7Ci0KLQkJCQlpZiAocHJlZml4Lmxlbmd0aCgpID4gMAotCQkJCQkJJiYgIXRlbXBsYXRlLmdldE5hbWUoKS5zdGFydHNXaXRoKHByZWZpeCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCWlmIChwcmVmaXgubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCWNvbnRleHRWaWV3ZXIuc2V0U2VsZWN0ZWRSYW5nZSh0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpCi0JCQkJCQkJLSBwcmVmaXgubGVuZ3RoKCksIHByZWZpeC5sZW5ndGgoKSk7Ci0KLQkJCQkJdGV4dFNlbGVjdGlvbiA9IChJVGV4dFNlbGVjdGlvbikgY29udGV4dFZpZXdlcgotCQkJCQkJCS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQkJCX0KLQkJCX0KLQotCQkJZG9jdW1lbnQucmVwbGFjZSh0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpLCB0ZXh0U2VsZWN0aW9uCi0JCQkJCS5nZXRMZW5ndGgoKSwgdGVtcGxhdGUuZ2V0TmFtZSgpLnN1YnN0cmluZygwLCAxKSk7Ci0KLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJZW5kQ29tcG91bmRDaGFuZ2UoY29udGV4dFZpZXdlcik7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlSZWdpb24gcmVnaW9uID0gbmV3IFJlZ2lvbih0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpICsgMSwgMCk7Ci0KLQkJY29udGV4dFZpZXdlci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLnNldFNlbGVjdGlvbigKLQkJCQluZXcgVGV4dFNlbGVjdGlvbih0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpLCAxKSk7Ci0KLQkJRG9jdW1lbnRUZW1wbGF0ZUNvbnRleHQgY29udGV4dCA9IGdldENvbnRleHQoZG9jdW1lbnQsIHRlbXBsYXRlLAotCQkJCXRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCksIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkpOwotCi0JCWNvbnRleHQuc2V0VmFyaWFibGUoInNlbGVjdGlvbiIsIHNhdmVkVGV4dCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAoY29udGV4dC5nZXRLZXkoKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0cnkgewotCQkJCWRvY3VtZW50LnJlcGxhY2UodGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgMSwgc2F2ZWRUZXh0KTsKLQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQllbmRDb21wb3VuZENoYW5nZShjb250ZXh0Vmlld2VyKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQlJVGV4dFZpZXdlciB2aWV3ZXIgPSBmVGV4dEVkaXRvci5nZXRUZXh0Vmlld2VyKCk7Ci0JCWludCBvZmZzZXQgPSB2aWV3ZXIuZ2V0VGV4dFdpZGdldCgpLmdldENhcmV0T2Zmc2V0KCk7Ci0JCWludCBzdGFydExlbmd0aCA9IG9mZnNldCAtIHJlZ2lvbi5nZXRPZmZzZXQoKTsKLQkJU3RyaW5nIHBhdHRlcm4gPSB0ZW1wbGF0ZS5nZXRQYXR0ZXJuKCkucmVwbGFjZSgiJHtjdXJzb3J9IiwgIiIpOwotCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKAotCQkJCXBhdHRlcm4sIG9mZnNldCwgMCwgc3RhcnRMZW5ndGggKyBwYXR0ZXJuLmxlbmd0aCgpLAotCQkJCWdldEltYWdlKHRlbXBsYXRlKSwgdGVtcGxhdGUuZ2V0TmFtZSgpLCBudWxsLCBudWxsLCAwKTsKLQotCQlmVGV4dEVkaXRvci5nZXRTaXRlKCkuZ2V0UGFnZSgpLmFjdGl2YXRlKGZUZXh0RWRpdG9yKTsKLQkJcHJvcG9zYWwuYXBwbHkoZlRleHRFZGl0b3IuZ2V0VGV4dFZpZXdlcigpLCAnICcsIDAsIG9mZnNldCk7Ci0JCXZpZXdlci5nZXRUZXh0V2lkZ2V0KCkuc2V0Q2FyZXRPZmZzZXQob2Zmc2V0ICsgcGF0dGVybi5sZW5ndGgoKSAtIDEpOwotCQllbmRDb21wb3VuZENoYW5nZShjb250ZXh0Vmlld2VyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkVGVtcGxhdGUoSURvY3VtZW50IGRvY3VtZW50LCBUZW1wbGF0ZSB0ZW1wbGF0ZSwKLQkJCWludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQotCQlTdHJpbmdbXSBjb250ZXh0SWRzID0gZ2V0Q29udGV4dFR5cGVJZHMoZG9jdW1lbnQsIG9mZnNldCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZXh0SWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY29udGV4dElkc1tpXS5lcXVhbHModGVtcGxhdGUuZ2V0Q29udGV4dFR5cGVJZCgpKSkgewotCQkJCURvY3VtZW50VGVtcGxhdGVDb250ZXh0IGNvbnRleHQgPSBnZXRDb250ZXh0KGRvY3VtZW50LAotCQkJCQkJdGVtcGxhdGUsIG9mZnNldCwgbGVuZ3RoKTsKLQkJCQlyZXR1cm4gY29udGV4dC5jYW5FdmFsdWF0ZSh0ZW1wbGF0ZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVW5kb21hbmFnZXIgLSBlbmQgY29tcG91bmQgY2hhbmdlCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqLwotCi0JcHJpdmF0ZSB2b2lkIGVuZENvbXBvdW5kQ2hhbmdlKElTb3VyY2VWaWV3ZXIgdmlld2VyKSB7Ci0KLQkJaWYgKHZpZXdlciBpbnN0YW5jZW9mIElUZXh0Vmlld2VyRXh0ZW5zaW9uKQotCQkJKChJVGV4dFZpZXdlckV4dGVuc2lvbikgdmlld2VyKS5nZXRSZXdyaXRlVGFyZ2V0KCkKLQkJCQkJLmVuZENvbXBvdW5kQ2hhbmdlKCk7Ci0JfQotCi0JLyoqCi0JICogVW5kb21hbmFnZXIgLSBiZWdpbiBhIGNvbXBvdW5kIGNoYW5nZQotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKi8KLQotCXByaXZhdGUgdm9pZCBiZWdpbkNvbXBvdW5kQ2hhbmdlKElTb3VyY2VWaWV3ZXIgdmlld2VyKSB7Ci0KLQkJaWYgKHZpZXdlciBpbnN0YW5jZW9mIElUZXh0Vmlld2VyRXh0ZW5zaW9uKQotCQkJKChJVGV4dFZpZXdlckV4dGVuc2lvbikgdmlld2VyKS5nZXRSZXdyaXRlVGFyZ2V0KCkKLQkJCQkJLmJlZ2luQ29tcG91bmRDaGFuZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgY29udGV4dAotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqIEBwYXJhbSB0ZW1wbGF0ZQotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogQHJldHVybiB0aGUgY29udGV4dAotCSAqLwotCi0JcHJpdmF0ZSBEb2N1bWVudFRlbXBsYXRlQ29udGV4dCBnZXRDb250ZXh0KElEb2N1bWVudCBkb2N1bWVudCwKLQkJCVRlbXBsYXRlIHRlbXBsYXRlLCBmaW5hbCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0KLQkJVGVtcGxhdGVDb250ZXh0VHlwZSBjb250ZXh0VHlwZSA9IFhQYXRoVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFhQYXRoVGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKS5nZXRDb250ZXh0VHlwZSgKLQkJCQkJCXRlbXBsYXRlLmdldENvbnRleHRUeXBlSWQoKSk7Ci0KLQkJcmV0dXJuIG5ldyBEb2N1bWVudFRlbXBsYXRlQ29udGV4dChjb250ZXh0VHlwZSwgZG9jdW1lbnQsIG9mZnNldCwKLQkJCQlsZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgeG1sIGlkZW50aWZpZXIgdGVybWluYXRlZCBhdCB0aGUgZ2l2ZW4gb2Zmc2V0Ci0JICogCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogQHBhcmFtIHRlbXBsYXRlCi0JICogQHBhcmFtIG9mZnNldAotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiBAcmV0dXJuIHRoZSBpZGVudGlmaWVyIHBhcnQKLQkgKiBAdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uCi0JICovCi0KLQlwcml2YXRlIFN0cmluZyBnZXRJZGVudGlmaWVyUGFydChJRG9jdW1lbnQgZG9jdW1lbnQsIFRlbXBsYXRlIHRlbXBsYXRlLAotCQkJaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldENvbnRleHQoZG9jdW1lbnQsIHRlbXBsYXRlLCBvZmZzZXQsIGxlbmd0aCkuZ2V0S2V5KCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC91dGlsL1hTTFBsdWdpbkltYWdlSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvdXRpbC9YU0xQbHVnaW5JbWFnZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMmZlNjdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC91dGlsL1hTTFBsdWdpbkltYWdlSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERhdmlkIENhcnZlciAtIFNUQVIgLSBidWcgMjEzODQ5IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5YU0xVSVBsdWdpbjsKLQotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0byBoYW5kbGUgaW1hZ2VzIHByb3ZpZGVkIGJ5IHRoaXMgcGx1Zy1pbi4KLSAqIAotICogTk9URTogRm9yIGludGVybmFsIHVzZSBvbmx5LiBGb3IgaW1hZ2VzIHVzZWQgZXh0ZXJuYWxseSwgcGxlYXNlIHVzZSB0aGUKLSAqIFNoYXJlZCoqKkltYWdlSGVscGVyIGNsYXNzIGluc3RlYWQuCi0gKiAKLSAqIEBhdXRob3IgZGF2aWQgY2FydmVyIGJhc2VkIG9uIHdvcmsgYnkgYW15d3UKLSAqLwotcHVibGljIGNsYXNzIFhTTFBsdWdpbkltYWdlSGVscGVyIHsKLQlwcml2YXRlIHN0YXRpYyBYU0xQbHVnaW5JbWFnZUhlbHBlciBpbnN0YW5jZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFhTTFBsdWdpbkltYWdlSGVscGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgWFNMUGx1Z2luSW1hZ2VIZWxwZXIoKTsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLy8gc2F2ZSBhIGRlc2NyaXB0b3IgZm9yIGVhY2ggaW1hZ2UKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIEhhc2hNYXAgZkltYWdlRGVzY1JlZ2lzdHJ5ID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW1hZ2UgZnJvbSB0aGUgZ2l2ZW4gcmVzb3VyY2UgYW5kIGFkZHMgdGhlIGltYWdlIHRvIHRoZQotCSAqIGltYWdlIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEByZXR1cm4gSW1hZ2UKLQkgKi8KLQlwcml2YXRlIEltYWdlIGNyZWF0ZUltYWdlKFN0cmluZyByZXNvdXJjZSkgewotCQlJbWFnZURlc2NyaXB0b3IgZGVzYyA9IGdldEltYWdlRGVzY3JpcHRvcihyZXNvdXJjZSk7Ci0JCUltYWdlIGltYWdlID0gbnVsbDsKLQotCQlpZiAoZGVzYyAhPSBudWxsKSB7Ci0JCQlpbWFnZSA9IGRlc2MuY3JlYXRlSW1hZ2UoKTsKLQkJCS8vIGRvbnQgYWRkIHRoZSBtaXNzaW5nIGltYWdlIGRlc2NyaXB0b3IgaW1hZ2UgdG8gdGhlIGltYWdlCi0JCQkvLyByZWdpc3RyeQotCQkJaWYgKCFkZXNjLmVxdWFscyhJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpKSkgewotCQkJCWdldEltYWdlUmVnaXN0cnkoKS5wdXQocmVzb3VyY2UsIGltYWdlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZyb20gdGhlIGdpdmVuIGltYWdlRmlsZVBhdGggYW5kIGFkZHMgdGhlCi0JICogaW1hZ2UgZGVzY3JpcHRvciB0byB0aGUgaW1hZ2UgZGVzY3JpcHRvciByZWdpc3RyeS4gSWYgYW4gaW1hZ2UKLQkgKiBkZXNjcmlwdG9yIGNvdWxkIG5vdCBiZSBjcmVhdGVkLCB0aGUgZGVmYXVsdCAibWlzc2luZyIgaW1hZ2UgZGVzY3JpcHRvcgotCSAqIGlzIHJldHVybmVkIGJ1dCBub3QgYWRkZWQgdG8gdGhlIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkuCi0JICogCi0JICogQHBhcmFtIGltYWdlRmlsZVBhdGgKLQkgKiBAcmV0dXJuIEltYWdlRGVzY3JpcHRvciBpbWFnZSBkZXNjcmlwdG9yIGZvciBpbWFnZUZpbGVQYXRoIG9yIGRlZmF1bHQKLQkgKiAgICAgICAgICJtaXNzaW5nIiBpbWFnZSBkZXNjcmlwdG9yIGlmIHJlc291cmNlIGNvdWxkIG5vdCBiZSBmb3VuZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIGNyZWF0ZUltYWdlRGVzY3JpcHRvcihTdHJpbmcgaW1hZ2VGaWxlUGF0aCkgewotCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKFhTTFVJUGx1Z2luLlBMVUdJTl9JRCwgaW1hZ2VGaWxlUGF0aCk7Ci0JCWlmIChpbWFnZURlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJZ2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKS5wdXQoaW1hZ2VGaWxlUGF0aCwgaW1hZ2VEZXNjcmlwdG9yKTsKLQkJfQotCQllbHNlIHsKLQkJCWltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCX0KLQotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgaW1hZ2UgYXNzb2NpYXRlZCB3aXRoIHJlc291cmNlIGZyb20gdGhlIGltYWdlIHJlZ2lzdHJ5LgotCSAqIElmIHRoZSBpbWFnZSBjYW5ub3QgYmUgcmV0cmlldmVkLCBhdHRlbXB0IHRvIGZpbmQgYW5kIGxvYWQgdGhlIGltYWdlIGF0Ci0JICogdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBpbiByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIHRoZSBpbWFnZSB0byByZXRyaWV2ZQotCSAqIEByZXR1cm4gSW1hZ2UgdGhlIGltYWdlIGFzc29jaWF0ZWQgd2l0aCByZXNvdXJjZSBvciBudWxsIGlmIG9uZSBjb3VsZAotCSAqICAgICAgICAgbm90IGJlIGZvdW5kCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKFN0cmluZyByZXNvdXJjZSkgewotCQlJbWFnZSBpbWFnZSA9IGdldEltYWdlUmVnaXN0cnkoKS5nZXQocmVzb3VyY2UpOwotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJLy8gY3JlYXRlIGFuIGltYWdlCi0JCQlpbWFnZSA9IGNyZWF0ZUltYWdlKHJlc291cmNlKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGFzc29jaWF0ZWQgd2l0aCByZXNvdXJjZSBmcm9tIHRoZSBpbWFnZQotCSAqIGRlc2NyaXB0b3IgcmVnaXN0cnkuIElmIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGNhbm5vdCBiZSByZXRyaWV2ZWQsCi0JICogYXR0ZW1wdCB0byBmaW5kIGFuZCBsb2FkIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGF0IHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQKLQkgKiBpbiByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHRvIHJldHJpZXZlCi0JICogQHJldHVybiBJbWFnZURlc2NyaXB0b3IgdGhlIGltYWdlIGRlc2NyaXB0b3IgYXNzb2NhdGVkIHdpdGggcmVzb3VyY2Ugb3IKLQkgKiAgICAgICAgIHRoZSBkZWZhdWx0ICJtaXNzaW5nIiBpbWFnZSBkZXNjcmlwdG9yIGlmIG9uZSBjb3VsZCBub3QgYmUKLQkgKiAgICAgICAgIGZvdW5kCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHJlc291cmNlKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBudWxsOwotCQlPYmplY3QgbyA9IGdldEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkuZ2V0KHJlc291cmNlKTsKLQkJaWYgKG8gPT0gbnVsbCkgewotCQkJLy8gY3JlYXRlIGEgZGVzY3JpcHRvcgotCQkJaW1hZ2VEZXNjcmlwdG9yID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKHJlc291cmNlKTsKLQkJfQotCQllbHNlIHsKLQkJCWltYWdlRGVzY3JpcHRvciA9IChJbWFnZURlc2NyaXB0b3IpIG87Ci0JCX0KLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbi4KLQkgKiAKLQkgKiBAcmV0dXJuIEhhc2hNYXAgLSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgSGFzaE1hcCBnZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpIHsKLQkJaWYgKGZJbWFnZURlc2NSZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQlmSW1hZ2VEZXNjUmVnaXN0cnkgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0JCXJldHVybiBmSW1hZ2VEZXNjUmVnaXN0cnk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Z2luLgotCSAqIAotCSAqIEByZXR1cm4gSW1hZ2VSZWdpc3RyeSAtIGltYWdlIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbgotCSAqLwotCXByaXZhdGUgSW1hZ2VSZWdpc3RyeSBnZXRJbWFnZVJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gSkZhY2VSZXNvdXJjZXMuZ2V0SW1hZ2VSZWdpc3RyeSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC91dGlsL1hTTFBsdWdpbkltYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3V0aWwvWFNMUGx1Z2luSW1hZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMwZDA2OGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3V0aWwvWFNMUGx1Z2luSW1hZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRGF2aWQgQ2FydmVyIC0gU1RBUiAtIGJ1ZyAyMTM4NDkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLnV0aWw7Ci0KLS8qKgotICogQnVuZGxlIG9mIG1vc3QgaW1hZ2VzIHVzZWQgYnkgdGhlIFhTTCBQbHVnaW5zCi0gKi8KLXB1YmxpYyBjbGFzcyBYU0xQbHVnaW5JbWFnZXMgewotCi0JLyoqCi0JICogUGF0aCB0byB0aGUgWFBBVEggSW1hZ2VzIHVzZWQgZm9yIENvbnRlbnQgQXNzaXN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1hQQVRIX0ZVTkNUSU9OID0gImljb25zL2Z1bGwvZnVuY3Rpb24uZ2lmIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFBhdGggdG8gdGhlIFhQQVRIIEltYWdlcyB1c2VkIGZvciBDb250ZW50IEFzc2lzdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19YUEFUSF9BWElTID0gImljb25zL2Z1bGwvZGlyZWN0aW9uYWwuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFBhdGggdG8gdGhlIFhQQVRIIEltYWdlcyB1c2VkIGZvciBDb250ZW50IEFzc2lzdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19WQVJJQUJMRVMgPSAiaWNvbnMvZnVsbC92YXJpYWJsZS5naWYiOyAvLyROT04tTkxTLTEkCQotCi0JLyoqCi0JICogUGF0aCB0byB0aGUgWFBBVEggSW1hZ2VzIHVzZWQgZm9yIENvbnRlbnQgQXNzaXN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09QRVJBVE9SID0gImljb25zL2Z1bGwvb3BlcmF0aW9uLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBQYXRoIHRvIHRoZSBYTUwgUHJlZml4IEltYWdlIHVzZWQgZm9yIENvbnRlbnQgQXNzaXN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1BSRUZJWCA9ICJpY29ucy9mdWxsL3BhY2thZ2Vfb2JqLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBQYXRoIHRvIHRoZSBYU0wgbW9kZSBJbWFnZSB1c2VkIGZvciBDb250ZW50IEFzc2lzdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19NT0RFID0gImljb25zL2Z1bGwvbW9kZS5naWYiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogUGF0aCB0byB0aGUgWFNMIEZpbGUgaW1hZ2UgdXNlIGZvciBDb250ZW50IEFzc2lzdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1hTTF9GSUxFID0gImljb25zL2Z1bGwveHNsdF9maWxlLmdpZiI7IC8vJE5PTi1OTFMtMSQgCi0KLQkvKioKLQkgKiBQYXRoIHRvIHRoZSB4c2wgdGVtcGxhdGUgaW1hZ2UgdXNlIGZvciBDb250ZW50IEFzc2lzdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1RFTVBMQVRFID0gImljb25zL2Z1bGwvdGVtcGxhdGUuZ2lmIjsgLy8kTk9OLU5MUy0xJCAKLQkKLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL0RlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3JGb3JYU0wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL0RlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3JGb3JYU0wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVjNDVhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9EZWxlZ2F0aW5nU291cmNlVmFsaWRhdG9yRm9yWFNMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnF1aWNrYXNzaXN0LklRdWlja0Fzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uRnJhbWV3b3JrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb24uRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLmVkaXRvci5YU0xFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5xdWlja2Fzc2lzdC5WYWxpZGF0aW9uUXVpY2tBc3Npc3Q7Ci0KLS8qKgotICogVGhpcyBwZXJmb3JtcyB0aGUgYXMteW91LXR5cGUgdmFsaWRhdGlvbiBmb3IgeHNsIGZpbGVzCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIERlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3JGb3JYU0wgZXh0ZW5kcyBEZWxlZ2F0aW5nU291cmNlVmFsaWRhdG9yCi17Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIElkID0gIm9yZy5lY2xpcHNlLndzdC54c2wuY29yZS54c2wiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUVVJQ0tBU1NJU1RQUk9DRVNTT1IgPSBJUXVpY2tBc3Npc3RQcm9jZXNzb3IuY2xhc3MuZ2V0TmFtZSgpOwotCQotCXByaXZhdGUgVmFsaWRhdG9yIF92YWxpZGF0b3I7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBEZWxlZ2F0aW5nU291cmNlVmFsaWRhdG9yRm9yWFNMKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVZhbGlkYXRpb25NZXNzYWdlcyhMaXN0IG1lc3NhZ2VzLCBJRE9NRG9jdW1lbnQgZG9jdW1lbnQsIElSZXBvcnRlciByZXBvcnRlcikKLQl7Ci0JCXN1cGVyLnVwZGF0ZVZhbGlkYXRpb25NZXNzYWdlcyhtZXNzYWdlcywgZG9jdW1lbnQsIHJlcG9ydGVyKTsKLQkJLy8gaW5zZXJ0IHRoZSBxdWljayBhc3Npc3QgaW5mb3JtYXRpb24gYXMgYW4gYXR0cmlidXRlIGZvciB0aGUgbWVzc2FnZXMKLS8vCQlmb3IgKE9iamVjdCBtc2cgOiByZXBvcnRlci5nZXRNZXNzYWdlcygpKQotLy8JCXsKLS8vCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IChJTWVzc2FnZSltc2c7Ci0vLwotLy8JCQlWYWxpZGF0aW9uUXVpY2tBc3Npc3QgcHJvY2Vzc29yID0gbmV3IFZhbGlkYXRpb25RdWlja0Fzc2lzdCgpOwotLy8JCQkKLS8vCQkJU3RyaW5nIGlkID0gKFN0cmluZyltZXNzYWdlLmdldEF0dHJpYnV0ZSgidmFsaWRhdGlvbkVycm9ySWQiKTsKLS8vCQkJcHJvY2Vzc29yLnNldFByb2JsZW1JZChpZCk7Ci0vLwkJCQotLy8JCQltZXNzYWdlLnNldEF0dHJpYnV0ZShRVUlDS0FTU0lTVFBST0NFU1NPUiwgcHJvY2Vzc29yKTsKLS8vCQl9CQkKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uCi0JewotCQlzdXBlci52YWxpZGF0ZShoZWxwZXIsIHJlcG9ydGVyKTsKLQkJCi0JCS8vIHZhbGlkYXRpbmcgd2lsbCByZWZyZXNoIHRoZSBtb2RlbCwgc28gbm93IGNhbGN1bGF0ZSB0aGUgb3ZlcnJpZGVzLgotCQkvLyAod2Ugb25seSBjYWxjdWxhdGUgb3ZlcnJpZGVzIGZvciBzb3VyY2UgdmFsaWRhdGlvbiBhcyB3ZSBvbmx5IHdhbnQgdG8gZG8gaXQgZm9yIGZpbGVzIG9wZW4gaW4gYW4gZWRpdG9yKQotCQkvLyBUaGVyZSBmb2xsb3dzIGEgdmVyeSBjb21wbGljYXRlZCB3YXkgb2YgY3JlYXRpbmcgdGhlIHJlcXVpcmVkIGFubm90YXRpb25zIGluIGFuIGVkaXRvci4KLQkJLy8gVE9ETyByZXNvbHZlIHRoaXMgd2hlbiBidWcgMjQ3MjIyIGlzIHNvcnRlZAotCQkKLQkJU3RyaW5nW10gZGVsdGEgPSBoZWxwZXIuZ2V0VVJJcygpOwotCQlpZiAoZGVsdGEubGVuZ3RoID4gMCkKLQkJewotCQkJSUZpbGUgZmlsZSA9IGdldEZpbGUoZGVsdGFbMF0pOwotCQkJLy8gZmluZCBhbnkgZmlsZXMgd2l0aCBvcGVuIGVkaXRvcnMuLi4KLQkJCUlXb3JrYmVuY2hXaW5kb3dbXSB3aW5kb3dzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRXb3JrYmVuY2hXaW5kb3dzKCk7Ci0JCQlmb3IgKElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93IDogd2luZG93cykKLQkJCXsKLQkJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQlpZiAocGFnZSAhPSBudWxsKQotCQkJCXsKLQkJCQkJSUVkaXRvclJlZmVyZW5jZVtdIHJlZnMgPSBwYWdlLmZpbmRFZGl0b3JzKG5ldyBGaWxlRWRpdG9ySW5wdXQoZmlsZSksICJvcmcuZWNsaXBzZS53c3QueHNsLnVpLlhTTEVkaXRvciIsIElXb3JrYmVuY2hQYWdlLk1BVENIX0lEIHwgSVdvcmtiZW5jaFBhZ2UuTUFUQ0hfSU5QVVQpOwotCQkJCQkvLyBsZXRzIGhvcGUgd2Ugb25seSBoYXZlIG9uZSBYU0wgZWRpdG9yIG9wZW4gb24gdGhlIGZpbGUsIG9yIGVsc2Ugd2UgZG9uJ3Qga25vdyB3aGljaCBvbmUgc3RhcnRlZCB0aGlzIHZhbGlkYXRpb24uLi4KLQkJCQkJaWYgKHJlZnMubGVuZ3RoID09IDEpCi0JCQkJCXsKLQkJCQkJCVhTTEVkaXRvciBlZGl0b3IgPSAoWFNMRWRpdG9yKSByZWZzWzBdLmdldEVkaXRvcihmYWxzZSk7Ci0JCQkJCQlpZiAoZWRpdG9yICE9IG51bGwpCi0JCQkJCQl7Ly8gYWxsIHRoaXMgd29yayBqdXN0IHRvIGdldCBoZXJlLi4uCi0JCQkJCQkJZWRpdG9yLmdldE92ZXJyaWRlSW5kaWNhdG9yTWFuYWdlcigpLnVwZGF0ZUFubm90YXRpb25zKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKQotCXsKLQkJaWYgKF92YWxpZGF0b3IgPT0gbnVsbCkKLQkJCV92YWxpZGF0b3IgPSBWYWxpZGF0aW9uRnJhbWV3b3JrLmdldERlZmF1bHQoKS5nZXRWYWxpZGF0b3IoSWQsIG51bGwpOwotCQlyZXR1cm4gX3ZhbGlkYXRvcjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSVZhbGlkYXRvciBnZXREZWxlZ2F0ZVZhbGlkYXRvcigpCi0JewotCQlWYWxpZGF0b3IgdiA9IGdldFZhbGlkYXRvcigpOwotCQlpZiAodiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiB2LmFzSVZhbGlkYXRvcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL1hTTEVycm9yTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL1hTTEVycm9yTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ExNDU2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9YU0xFcnJvckxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCBhbmQgb3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBTVEFSIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLio7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGxpc3RlbnMgZm9yIEVycm9ycyB0b3NzZWQgYnkgYSBYU0wgUHJvY2Vzc29yLgotICogCi0gKiBAYXV0aG9yIGRjYXJ2ZXIKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgWFNMRXJyb3JMaXN0ZW5lciBpbXBsZW1lbnRzIEVycm9yTGlzdGVuZXIgewotCi0JcHJpdmF0ZSBMb2dnZXIgbG9nZ2VyOwotCi0JLyoqCi0JICogVE9ETzogQWRkIEphdmFkb2MKLQkgKiBAcGFyYW0gbG9nZ2VyCi0JICovCi0JcHVibGljIFhTTEVycm9yTGlzdGVuZXIoTG9nZ2VyIGxvZ2dlcikgewotCQl0aGlzLmxvZ2dlciA9IGxvZ2dlcjsKLQl9Ci0KLQkvKioKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZheC54bWwudHJhbnNmb3JtLkVycm9yTGlzdGVuZXIjd2FybmluZyhqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHdhcm5pbmcoVHJhbnNmb3JtZXJFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0KLQkJbG9nZ2VyLmxvZyhMZXZlbC5XQVJOSU5HLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCi0JCS8vIERvbid0IHRocm93IGFuIGV4Y2VwdGlvbiBhbmQgc3RvcCB0aGUgcHJvY2Vzc29yCi0JCS8vIGp1c3QgZm9yIGEgd2FybmluZzsgYnV0IGRvIGxvZyB0aGUgcHJvYmxlbQotCX0KLQotCS8qKiAKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZheC54bWwudHJhbnNmb3JtLkVycm9yTGlzdGVuZXIjZXJyb3IoamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBlcnJvcihUcmFuc2Zvcm1lckV4Y2VwdGlvbiBleGNlcHRpb24pCi0JCQl0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24gewotCi0JCWxvZ2dlci5sb2coTGV2ZWwuU0VWRVJFLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCQkvLyBYU0xUIGlzIG5vdCBhcyBkcmFjb25pYW4gYXMgWE1MLiBUaGVyZSBhcmUgbnVtZXJvdXMgZXJyb3JzCi0JCS8vIHdoaWNoIHRoZSBwcm9jZXNzb3IgbWF5IGJ1dCBkb2VzIG5vdCBoYXZlIHRvIHJlY292ZXIgZnJvbTsKLQkJLy8gZS5nLiBtdWx0aXBsZSB0ZW1wbGF0ZXMgdGhhdCBtYXRjaCBhIG5vZGUgd2l0aCB0aGUgc2FtZQotCQkvLyBwcmlvcml0eS4gSSBkbyBub3Qgd2FudCB0byBhbGxvdyB0aGF0IHNvIEkgdGhyb3cgdGhpcwotCQkvLyBleGNlcHRpb24gaGVyZS4KLQkJdGhyb3cgZXhjZXB0aW9uOwotCi0JfQotCi0JLyoqCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmF4LnhtbC50cmFuc2Zvcm0uRXJyb3JMaXN0ZW5lciNmYXRhbEVycm9yKGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb24pCi0JICovCi0JcHVibGljIHZvaWQgZmF0YWxFcnJvcihUcmFuc2Zvcm1lckV4Y2VwdGlvbiBleGNlcHRpb24pCi0JCQl0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24gewotCi0JCWxvZ2dlci5sb2coTGV2ZWwuU0VWRVJFLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCi0JCS8vIFRoaXMgaXMgYW4gZXJyb3Igd2hpY2ggdGhlIHByb2Nlc3NvciBjYW5ub3QgcmVjb3ZlciBmcm9tOwotCQkvLyBlLmcuIGEgbWFsZm9ybWVkIHN0eWxlc2hlZXQgb3IgaW5wdXQgZG9jdW1lbnQKLQkJLy8gc28gSSBtdXN0IHRocm93IHRoaXMgZXhjZXB0aW9uIGhlcmUuCi0JCXRocm93IGV4Y2VwdGlvbjsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vWFNMTWFya3VwVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9YU0xNYXJrdXBWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE4NWI4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9YU0xNYXJrdXBWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsIGFuZCBvdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERhdmlkIENhcnZlciAtIFNUQVIgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLnZhbGlkYXRvci5JU291cmNlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLk1hcmt1cFZhbGlkYXRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIGRjYXJ2ZXIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBYU0xNYXJrdXBWYWxpZGF0b3IgZXh0ZW5kcyBNYXJrdXBWYWxpZGF0b3IgaW1wbGVtZW50cyBJVmFsaWRhdG9yLCBJU291cmNlVmFsaWRhdG9yIHsKLQotCi0JLyoqCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvciNjbGVhbnVwKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNsZWFudXAoSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJc3VwZXIuY2xlYW51cChyZXBvcnRlcik7Ci0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gaGVscGVyIAotCSAqIEBwYXJhbSByZXBvcnRlciAKLQkgKiBAdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gCi0JICogCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKQotCQkJdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXN1cGVyLnZhbGlkYXRlKGhlbHBlciwgcmVwb3J0ZXIpOwotCX0KLQotCS8qKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudmFsaWRhdGlvbi5NYXJrdXBWYWxpZGF0b3IjY29ubmVjdChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBjb25uZWN0KElEb2N1bWVudCBkb2N1bWVudCkgewotICAgICAgICBzdXBlci5jb25uZWN0KGRvY3VtZW50KTsKLQl9Ci0KLQkvKiogCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLk1hcmt1cFZhbGlkYXRvciNkaXNjb25uZWN0KG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50KQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc2Nvbm5lY3QoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXN1cGVyLmRpc2Nvbm5lY3QoZG9jdW1lbnQpOwotCX0KLQotCS8qKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb24uTWFya3VwVmFsaWRhdG9yI3ZhbGlkYXRlKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbiwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElSZWdpb24gZGlydHlSZWdpb24sIElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsCi0JCQlJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJc3VwZXIudmFsaWRhdGUoZGlydHlSZWdpb24sIGhlbHBlciwgcmVwb3J0ZXIpOwotCX0KLQkKLQkvKiogCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLk1hcmt1cFZhbGlkYXRvciN2YWxpZGF0ZShvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcikKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwKLQkJCUlSZXBvcnRlciByZXBvcnRlcikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXN1cGVyLnZhbGlkYXRlKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcmVwb3J0ZXIpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC93aXphcmRzL05ld1hTTEZpbGVUZW1wbGF0ZXNXaXphcmRQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdYU0xGaWxlVGVtcGxhdGVzV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzFiYTY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC93aXphcmRzL05ld1hTTEZpbGVUZW1wbGF0ZXNXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5Eb2N1bWVudFRlbXBsYXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5wZXJzaXN0ZW5jZS5UZW1wbGF0ZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZXNVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5MaW5lU3R5bGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvclhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhTTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLlhTTFVJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwuWFNMVUlQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBOZXdYU0xGaWxlVGVtcGxhdGVzV2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UKLXsKLQlwcml2YXRlIFN0cmluZyBmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lOwotCXByaXZhdGUgU291cmNlVmlld2VyIGZQYXR0ZXJuVmlld2VyOwotCXByaXZhdGUgVGFibGVWaWV3ZXIgZlRhYmxlVmlld2VyOwotCXByaXZhdGUgVGVtcGxhdGVTdG9yZSBmVGVtcGxhdGVTdG9yZTsKLQlwcml2YXRlIEJ1dHRvbiBmVXNlVGVtcGxhdGVCdXR0b247Ci0KLQlwdWJsaWMgTmV3WFNMRmlsZVRlbXBsYXRlc1dpemFyZFBhZ2UoKQotCXsKLQkJc3VwZXIoIk5ld1N0eWxlc2hlZXRUZW1wbGF0ZXNXaXphcmRQYWdlIiwgIlNlbGVjdCBYU0wgVGVtcGxhdGUiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQlzZXREZXNjcmlwdGlvbigiU2VsZWN0IGEgdGVtcGxhdGUgYXMgaW5pdGlhbCBjb250ZW50IGZvciB0aGUgc3R5bGVzaGVldCIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjb25maWd1cmVUYWJsZVJlc2l6aW5nKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIFRhYmxlIHRhYmxlLCBmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4xLCBmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4yKQotCXsKLQkJcGFyZW50LmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKQotCQkJewotCQkJCVJlY3RhbmdsZSBhcmVhID0gcGFyZW50LmdldENsaWVudEFyZWEoKTsKLQkJCQlQb2ludCBwcmVmZXJyZWRTaXplID0gdGFibGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJCQlpbnQgd2lkdGggPSBhcmVhLndpZHRoIC0gMiAqIHRhYmxlLmdldEJvcmRlcldpZHRoKCk7Ci0JCQkJaWYgKHByZWZlcnJlZFNpemUueSA+IGFyZWEuaGVpZ2h0KQotCQkJCXsKLQkJCQkJLy8gU3VidHJhY3QgdGhlIHNjcm9sbGJhciB3aWR0aCBmcm9tIHRoZSB0b3RhbCBjb2x1bW4KLQkJCQkJLy8gd2lkdGgKLQkJCQkJLy8gaWYgYSB2ZXJ0aWNhbCBzY3JvbGxiYXIgd2lsbCBiZSByZXF1aXJlZAotCQkJCQlQb2ludCB2QmFyU2l6ZSA9IHRhYmxlLmdldFZlcnRpY2FsQmFyKCkuZ2V0U2l6ZSgpOwotCQkJCQl3aWR0aCAtPSB2QmFyU2l6ZS54OwotCQkJCX0KLQotCQkJCVBvaW50IG9sZFNpemUgPSB0YWJsZS5nZXRTaXplKCk7Ci0JCQkJaWYgKG9sZFNpemUueCA+IHdpZHRoKQotCQkJCXsKLQkJCQkJLy8gdGFibGUgaXMgZ2V0dGluZyBzbWFsbGVyIHNvIG1ha2UgdGhlIGNvbHVtbnMKLQkJCQkJLy8gc21hbGxlciBmaXJzdCBhbmQgdGhlbiByZXNpemUgdGhlIHRhYmxlIHRvCi0JCQkJCS8vIG1hdGNoIHRoZSBjbGllbnQgYXJlYSB3aWR0aAotCQkJCQljb2x1bW4xLnNldFdpZHRoKHdpZHRoIC8gMik7Ci0JCQkJCWNvbHVtbjIuc2V0V2lkdGgod2lkdGggLyAyKTsKLQkJCQkJdGFibGUuc2V0U2l6ZSh3aWR0aCwgYXJlYS5oZWlnaHQpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQkvLyB0YWJsZSBpcyBnZXR0aW5nIGJpZ2dlciBzbyBtYWtlIHRoZSB0YWJsZQotCQkJCQkvLyBiaWdnZXIgZmlyc3QgYW5kIHRoZW4gbWFrZSB0aGUgY29sdW1ucyB3aWRlcgotCQkJCQkvLyB0byBtYXRjaCB0aGUgY2xpZW50IGFyZWEgd2lkdGgKLQkJCQkJdGFibGUuc2V0U2l6ZSh3aWR0aCwgYXJlYS5oZWlnaHQpOwotCQkJCQljb2x1bW4xLnNldFdpZHRoKHdpZHRoIC8gMik7Ci0JCQkJCWNvbHVtbjIuc2V0V2lkdGgod2lkdGggLyAyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIGFuY2VzdG9yKQotCXsKLQkJQ29tcG9zaXRlIHBhcmVudCA9IG5ldyBDb21wb3NpdGUoYW5jZXN0b3IsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCXBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvLyBjcmVhdGUgY2hlY2tib3ggZm9yIHVzZXIgdG8gdXNlIEpTUCBUZW1wbGF0ZQotCQlmVXNlVGVtcGxhdGVCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJZlVzZVRlbXBsYXRlQnV0dG9uLnNldFRleHQoIlVzZSB0ZW1wbGF0ZSIpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UsIDIsIDEpOwotCQlmVXNlVGVtcGxhdGVCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZlVzZVRlbXBsYXRlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotCQkJewotCQkJCWVuYWJsZVRlbXBsYXRlcygpOwotCQkJfQotCQl9KTsKLQotCQkvLyBjcmVhdGUgY29tcG9zaXRlIGZvciBUZW1wbGF0ZXMgdGFibGUKLQkJQ29tcG9zaXRlIGlubmVyUGFyZW50ID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBpbm5lckxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWlubmVyTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlpbm5lckxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlpbm5lckxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWlubmVyUGFyZW50LnNldExheW91dChpbm5lckxheW91dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMiwgMSk7Ci0JCWlubmVyUGFyZW50LnNldExheW91dERhdGEoZ2QpOwotCi0JCS8vIENyZWF0ZSBsaW5rZWQgdGV4dCB0byBqdXN0IHRvIHRlbXBsYXRlcyBwcmVmZXJlbmNlIHBhZ2UKLQkJTGluayBsaW5rID0gbmV3IExpbmsoaW5uZXJQYXJlbnQsIFNXVC5OT05FKTsKLQkJbGluay5zZXRUZXh0KCJUZW1wbGF0ZXMgYXJlICdOZXcgU3R5bGVzaGVldCcgdGVtcGxhdGVzIGZvdW5kIGluIHRoZSA8YT5YU0w8L2E+IHByZWZlcmVuY2UgcGFnZSIpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UsIDIsIDEpOwotCQlsaW5rLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWxpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0JCQl7Ci0JCQkJbGlua0NsaWNrZWQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gY3JlYXRlIHRhYmxlIHRoYXQgZGlzcGxheXMgdGVtcGxhdGVzCi0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKGlubmVyUGFyZW50LCBTV1QuQk9SREVSIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKDIpOwotCQlkYXRhLmhlaWdodEhpbnQgPSBjb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKDEwKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXRhYmxlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJVGFibGVMYXlvdXQgdGFibGVMYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLQkJdGFibGUuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLQotCQlUYWJsZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbjEuc2V0VGV4dCgiTmFtZSIpOwotCi0JCVRhYmxlQ29sdW1uIGNvbHVtbjIgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uMi5zZXRUZXh0KCJEZXNjcmlwdGlvbiIpOwotCi0JCWZUYWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcih0YWJsZSk7Ci0JCWZUYWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBUZW1wbGF0ZUxhYmVsUHJvdmlkZXIoKSk7Ci0JCWZUYWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFRlbXBsYXRlQ29udGVudFByb3ZpZGVyKCkpOwotCi0JCWZUYWJsZVZpZXdlci5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvYmplY3QxLCBPYmplY3Qgb2JqZWN0MikKLQkJCXsKLQkJCQlpZiAoKG9iamVjdDEgaW5zdGFuY2VvZiBUZW1wbGF0ZSkgJiYgKG9iamVjdDIgaW5zdGFuY2VvZiBUZW1wbGF0ZSkpCi0JCQkJewotCQkJCQlUZW1wbGF0ZSBsZWZ0ID0gKFRlbXBsYXRlKSBvYmplY3QxOwotCQkJCQlUZW1wbGF0ZSByaWdodCA9IChUZW1wbGF0ZSkgb2JqZWN0MjsKLQkJCQkJaW50IHJlc3VsdCA9IGxlZnQuZ2V0TmFtZSgpLmNvbXBhcmVUb0lnbm9yZUNhc2UocmlnaHQuZ2V0TmFtZSgpKTsKLQkJCQkJaWYgKHJlc3VsdCAhPSAwKQotCQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQkJcmV0dXJuIGxlZnQuZ2V0RGVzY3JpcHRpb24oKS5jb21wYXJlVG9JZ25vcmVDYXNlKHJpZ2h0LmdldERlc2NyaXB0aW9uKCkpOwotCQkJCX0KLQkJCQlyZXR1cm4gc3VwZXIuY29tcGFyZSh2aWV3ZXIsIG9iamVjdDEsIG9iamVjdDIpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIGlzU29ydGVyUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkKLQkJCXsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0KLQkJZlRhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpCi0JCXsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGUpCi0JCQl7Ci0JCQkJdXBkYXRlVmlld2VySW5wdXQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gY3JlYXRlIHZpZXdlciB0aGF0IGRpc3BsYXlzIGN1cnJlbnRseSBzZWxlY3RlZCB0ZW1wbGF0ZSdzIGNvbnRlbnRzCi0JCWZQYXR0ZXJuVmlld2VyID0gZG9DcmVhdGVWaWV3ZXIocGFyZW50KTsKLQotCQlmVGVtcGxhdGVTdG9yZSA9IFhTTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZW1wbGF0ZVN0b3JlKCk7Ci0JCWZUYWJsZVZpZXdlci5zZXRJbnB1dChmVGVtcGxhdGVTdG9yZSk7Ci0KLQkJY29uZmlndXJlVGFibGVSZXNpemluZyhpbm5lclBhcmVudCwgdGFibGUsIGNvbHVtbjEsIGNvbHVtbjIpOwotCQlsb2FkTGFzdFNhdmVkUHJlZmVyZW5jZXMoKTsKLQotCQkvLyBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwgSUhlbHBDb250ZXh0SWRzLkpTUF9ORVdXSVpBUkRfVEVNUExBVEVfSEVMUElEKTsKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCQlzZXRDb250cm9sKHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBTb3VyY2VWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpCi0JewotCQlTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uKCkgewotCQkJU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIGJhc2VDb25maWd1cmF0aW9uID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhTTCgpOwotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmdbXSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCQkJcmV0dXJuIGJhc2VDb25maWd1cmF0aW9uLmdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoc291cmNlVmlld2VyKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgTGluZVN0eWxlUHJvdmlkZXJbXSBnZXRMaW5lU3R5bGVQcm92aWRlcnMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCQkJcmV0dXJuIGJhc2VDb25maWd1cmF0aW9uLmdldExpbmVTdHlsZVByb3ZpZGVycyhzb3VyY2VWaWV3ZXIsIHBhcnRpdGlvblR5cGUpOwotCQkJfQotCQl9OwotCQlTb3VyY2VWaWV3ZXIgdmlld2VyID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyKHBhcmVudCwgbnVsbCwgbnVsbCwgZmFsc2UsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQkoKFN0cnVjdHVyZWRUZXh0Vmlld2VyKSB2aWV3ZXIpLmdldFRleHRXaWRnZXQoKS5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldEZvbnQoIm9yZy5lY2xpcHNlLndzdC5zc2UudWkudGV4dGZvbnQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJSVN0cnVjdHVyZWRNb2RlbCBzY3JhdGNoTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmNyZWF0ZVVuTWFuYWdlZFN0cnVjdHVyZWRNb2RlbEZvcihDb250ZW50VHlwZUlkRm9yWE1MLkNvbnRlbnRUeXBlSURfWE1MKTsKLQkJSURvY3VtZW50IGRvY3VtZW50ID0gc2NyYXRjaE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQl2aWV3ZXIuY29uZmlndXJlKHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24pOwotCQl2aWV3ZXIuc2V0RG9jdW1lbnQoZG9jdW1lbnQpOwotCQlyZXR1cm4gdmlld2VyOwotCX0KLQotCXByaXZhdGUgU291cmNlVmlld2VyIGRvQ3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpCi0JewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dCgiUHJldmlldyIpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCVNvdXJjZVZpZXdlciB2aWV3ZXIgPSBjcmVhdGVWaWV3ZXIocGFyZW50KTsKLQkJdmlld2VyLnNldEVkaXRhYmxlKGZhbHNlKTsKLQotCQlDb250cm9sIGNvbnRyb2wgPSB2aWV3ZXIuZ2V0Q29udHJvbCgpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlkYXRhLmhlaWdodEhpbnQgPSBjb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKDUpOwotCQljb250cm9sLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcmV0dXJuIHZpZXdlcjsKLQl9Ci0KLQl2b2lkIGVuYWJsZVRlbXBsYXRlcygpCi0JewotCQlib29sZWFuIGVuYWJsZWQgPSBmVXNlVGVtcGxhdGVCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0KLQkJaWYgKGVuYWJsZWQpCi0JCXsKLQkJCXNldFNlbGVjdGVkVGVtcGxhdGUoZkxhc3RTZWxlY3RlZFRlbXBsYXRlTmFtZSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvLyBzYXZlIGxhc3Qgc2VsZWN0ZWQgdGVtcGxhdGUKLQkJCVRlbXBsYXRlIHRlbXBsYXRlID0gZ2V0U2VsZWN0ZWRUZW1wbGF0ZSgpOwotCQkJaWYgKHRlbXBsYXRlICE9IG51bGwpCi0JCQkJZkxhc3RTZWxlY3RlZFRlbXBsYXRlTmFtZSA9IHRlbXBsYXRlLmdldE5hbWUoKTsKLQkJCWVsc2UKLQkJCQlmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQkJZlRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihudWxsKTsKLQkJfQotCi0JCWZUYWJsZVZpZXdlci5nZXRDb250cm9sKCkuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJZlBhdHRlcm5WaWV3ZXIuZ2V0Q29udHJvbCgpLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JfQotCi0JcHJpdmF0ZSBUZW1wbGF0ZSBnZXRTZWxlY3RlZFRlbXBsYXRlKCkKLQl7Ci0JCVRlbXBsYXRlIHRlbXBsYXRlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmVGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0KLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkKLQkJewotCQkJdGVtcGxhdGUgPSAoVGVtcGxhdGUpIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gdGVtcGxhdGU7Ci0JfQotCi0JU3RyaW5nIGdldFRlbXBsYXRlU3RyaW5nKCkKLQl7Ci0JCVN0cmluZyB0ZW1wbGF0ZVN0cmluZyA9IG51bGw7Ci0KLQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBnZXRTZWxlY3RlZFRlbXBsYXRlKCk7Ci0JCWlmICh0ZW1wbGF0ZSAhPSBudWxsKQotCQl7Ci0JCQlUZW1wbGF0ZUNvbnRleHRUeXBlIGNvbnRleHRUeXBlID0gWFNMVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCkuZ2V0Q29udGV4dFR5cGUoWFNMVUlDb25zdGFudHMuVEVNUExBVEVfQ09OVEVYVF9YU0xfTkVXKTsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IG5ldyBEb2N1bWVudCgpOwotCQkJVGVtcGxhdGVDb250ZXh0IGNvbnRleHQgPSBuZXcgRG9jdW1lbnRUZW1wbGF0ZUNvbnRleHQoY29udGV4dFR5cGUsIGRvY3VtZW50LCAwLCAwKTsKLQkJCXRyeQotCQkJewotCQkJCVRlbXBsYXRlQnVmZmVyIGJ1ZmZlciA9IGNvbnRleHQuZXZhbHVhdGUodGVtcGxhdGUpOwotCQkJCXRlbXBsYXRlU3RyaW5nID0gYnVmZmVyLmdldFN0cmluZygpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQkJewotCQkJCVhTTFVJUGx1Z2luLmxvZyhlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB0ZW1wbGF0ZVN0cmluZzsKLQl9Ci0KLQl2b2lkIGxpbmtDbGlja2VkKCkKLQl7Ci0JCVN0cmluZyBwYWdlSWQgPSAib3JnLmVjbGlwc2Uud3N0LnhzbC51aS50ZW1wbGF0ZS5wcmVmZXJlbmNlUGFnZSI7Ci0JCVByZWZlcmVuY2VEaWFsb2cgZGlhbG9nID0gUHJlZmVyZW5jZXNVdGlsLmNyZWF0ZVByZWZlcmVuY2VEaWFsb2dPbihnZXRTaGVsbCgpLCBwYWdlSWQsIG5ldyBTdHJpbmdbXSB7IHBhZ2VJZCB9LCBudWxsKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQkJZlRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9hZExhc3RTYXZlZFByZWZlcmVuY2VzKCkKLQl7Ci0JCVN0cmluZyB0ZW1wbGF0ZU5hbWUgPSBYU0xVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKFhTTFVJQ29uc3RhbnRzLk5FV19GSUxFX1RFTVBMQVRFX05BTUUpOwotCQlpZiAodGVtcGxhdGVOYW1lID09IG51bGwgfHwgdGVtcGxhdGVOYW1lLmxlbmd0aCgpID09IDApCi0JCXsKLQkJCWZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJZlVzZVRlbXBsYXRlQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lID0gdGVtcGxhdGVOYW1lOwotCQkJZlVzZVRlbXBsYXRlQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfQotCQllbmFibGVUZW1wbGF0ZXMoKTsKLQl9Ci0KLQl2b2lkIHNhdmVMYXN0U2F2ZWRQcmVmZXJlbmNlcygpCi0JewotCQlTdHJpbmcgdGVtcGxhdGVOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IGdldFNlbGVjdGVkVGVtcGxhdGUoKTsKLQkJaWYgKHRlbXBsYXRlICE9IG51bGwpCi0JCXsKLQkJCXRlbXBsYXRlTmFtZSA9IHRlbXBsYXRlLmdldE5hbWUoKTsKLQkJfQotCi0JCVhTTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShYU0xVSUNvbnN0YW50cy5ORVdfRklMRV9URU1QTEFURV9OQU1FLCB0ZW1wbGF0ZU5hbWUpOwotCQlYU0xVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFNlbGVjdGVkVGVtcGxhdGUoU3RyaW5nIHRlbXBsYXRlTmFtZSkKLQl7Ci0JCU9iamVjdCB0ZW1wbGF0ZSA9IG51bGw7Ci0KLQkJaWYgKHRlbXBsYXRlTmFtZSAhPSBudWxsICYmIHRlbXBsYXRlTmFtZS5sZW5ndGgoKSA+IDApCi0JCXsKLQkJCS8vIHBpY2sgdGhlIGxhc3QgdXNlZCB0ZW1wbGF0ZQotCQkJdGVtcGxhdGUgPSBmVGVtcGxhdGVTdG9yZS5maW5kVGVtcGxhdGUodGVtcGxhdGVOYW1lLCBYU0xVSUNvbnN0YW50cy5URU1QTEFURV9DT05URVhUX1hTTF9ORVcpOwotCQl9Ci0KLQkJLy8gbm8gcmVjb3JkIG9mIGxhc3QgdXNlZCB0ZW1wbGF0ZSBzbyBqdXN0IHBpY2sgZmlyc3QgZWxlbWVudAotCQlpZiAodGVtcGxhdGUgPT0gbnVsbCkKLQkJewotCQkJLy8ganVzdCBwaWNrIGZpcnN0IGVsZW1lbnQKLQkJCXRlbXBsYXRlID0gZlRhYmxlVmlld2VyLmdldEVsZW1lbnRBdCgwKTsKLQkJfQotCi0JCWlmICh0ZW1wbGF0ZSAhPSBudWxsKQotCQl7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih0ZW1wbGF0ZSk7Ci0JCQlmVGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgdHJ1ZSk7Ci0JCX0KLQl9Ci0KLQl2b2lkIHVwZGF0ZVZpZXdlcklucHV0KCkKLQl7Ci0JCVRlbXBsYXRlIHRlbXBsYXRlID0gZ2V0U2VsZWN0ZWRUZW1wbGF0ZSgpOwotCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkKLQkJewotCQkJZlBhdHRlcm5WaWV3ZXIuZ2V0RG9jdW1lbnQoKS5zZXQodGVtcGxhdGUuZ2V0UGF0dGVybigpKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWZQYXR0ZXJuVmlld2VyLmdldERvY3VtZW50KCkuc2V0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdYU0xGaWxlV2l6YXJkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdYU0xGaWxlV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwM2U1MjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3dpemFyZHMvTmV3WFNMRmlsZVdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5YU0xVSVBsdWdpbjsKLQotcHVibGljIGNsYXNzIE5ld1hTTEZpbGVXaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkCi17Ci0JcHJpdmF0ZSBOZXdYU0xGaWxlV2l6YXJkUGFnZSBmTmV3RmlsZVBhZ2U7Ci0JcHJpdmF0ZSBOZXdYU0xGaWxlVGVtcGxhdGVzV2l6YXJkUGFnZSBmTmV3RmlsZVRlbXBsYXRlc1BhZ2U7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBmU2VsZWN0aW9uOwotCXByaXZhdGUgSVdvcmtiZW5jaCB3b3JrYmVuY2g7Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpCi0JewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzc2VsID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oSURFLmNvbXB1dGVTZWxlY3RlZFJlc291cmNlcyhmU2VsZWN0aW9uKSk7Ci0JCS8vIGlmIG5vIHNlbGVjdGlvbiwgdGhlbiBqdXN0IHNlbGVjdCB0aGUgZmlyc3QgcHJvamVjdCB3ZSBjb21lIGFjcm9zcwotCQlpZiAoc3NlbC5pc0VtcHR5KCkpCi0JCQlzc2VsID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpWzBdKTsKLQkJCi0JCWZOZXdGaWxlUGFnZSA9IG5ldyBOZXdYU0xGaWxlV2l6YXJkUGFnZSgiTmV3RmlsZUNyZWF0aW9uUGFnZSIsIHNzZWwpOyAvLyROT04tTkxTLTEkIAotCQlmTmV3RmlsZVBhZ2Uuc2V0VGl0bGUoIlhTTCBTdHlsZXNoZWV0Iik7Ci0JCWZOZXdGaWxlUGFnZS5zZXREZXNjcmlwdGlvbigiQ3JlYXRlIGEgbmV3IFhTTCBTdHlsZXNoZWV0LiIpOwotCQlhZGRQYWdlKGZOZXdGaWxlUGFnZSk7Ci0KLQkJZk5ld0ZpbGVUZW1wbGF0ZXNQYWdlID0gbmV3IE5ld1hTTEZpbGVUZW1wbGF0ZXNXaXphcmRQYWdlKCk7Ci0JCWFkZFBhZ2UoZk5ld0ZpbGVUZW1wbGF0ZXNQYWdlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggYVdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gYVNlbGVjdGlvbikKLQl7Ci0JCXRoaXMud29ya2JlbmNoID0gYVdvcmtiZW5jaDsKLQkJZlNlbGVjdGlvbiA9IGFTZWxlY3Rpb247Ci0JCXNldFdpbmRvd1RpdGxlKCJOZXcgWFNMIFN0eWxlc2hlZXQiKTsKLQotCQkvLyBUT0RPIGltYWdlIGZvciB3aXphcmQKLQkJLy8gSW1hZ2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPQotCQkvLyBKU1BFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihKU1BFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9XSVpCQU5fTkVXSlNQRklMRSk7Ci0JCS8vIHNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKGRlc2NyaXB0b3IpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKQotCXsKLQkJYm9vbGVhbiBwZXJmb3JtZWRPSyA9IGZhbHNlOwotCi0JCS8vIHNhdmUgdXNlciBvcHRpb25zIGZvciBuZXh0IHVzZQotCQlmTmV3RmlsZVRlbXBsYXRlc1BhZ2Uuc2F2ZUxhc3RTYXZlZFByZWZlcmVuY2VzKCk7Ci0KLQkJLy8gbm8gZmlsZSBleHRlbnNpb24gc3BlY2lmaWVkIHNvIGFkZCBkZWZhdWx0IGV4dGVuc2lvbgotCQlTdHJpbmcgZmlsZU5hbWUgPSBmTmV3RmlsZVBhZ2UuZ2V0RmlsZU5hbWUoKTsKLQkJaWYgKGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykgPT0gLTEpCi0JCXsKLQkJCVN0cmluZyBuZXdGaWxlTmFtZSA9IGZOZXdGaWxlUGFnZS5hZGREZWZhdWx0RXh0ZW5zaW9uKGZpbGVOYW1lKTsKLQkJCWZOZXdGaWxlUGFnZS5zZXRGaWxlTmFtZShuZXdGaWxlTmFtZSk7Ci0JCX0KLQotCQkvLyBjcmVhdGUgYSBuZXcgZW1wdHkgZmlsZQotCQlJRmlsZSBmaWxlID0gZk5ld0ZpbGVQYWdlLmNyZWF0ZU5ld0ZpbGUoKTsKLQotCQkvLyBpZiB0aGVyZSB3YXMgcHJvYmxlbSB3aXRoIGNyZWF0aW5nIGZpbGUsIGl0IHdpbGwgYmUgbnVsbCwgc28gbWFrZQotCQkvLyBzdXJlIHRvIGNoZWNrCi0JCWlmIChmaWxlICE9IG51bGwpCi0JCXsKLQkJCS8vIHB1dCB0ZW1wbGF0ZSBjb250ZW50cyBpbnRvIGZpbGUKLQkJCVN0cmluZyB0ZW1wbGF0ZVN0cmluZyA9IGZOZXdGaWxlVGVtcGxhdGVzUGFnZS5nZXRUZW1wbGF0ZVN0cmluZygpOwotCQkJaWYgKHRlbXBsYXRlU3RyaW5nICE9IG51bGwpCi0JCQl7Ci0JCQkJLy8gZGV0ZXJtaW5lIHRoZSBlbmNvZGluZyBmb3IgdGhlIG5ldyBmaWxlCi0JCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZSA9IFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCQkJU3RyaW5nIGNoYXJTZXQgPSBwcmVmZXJlbmNlLmdldFN0cmluZyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5PVVRQVVRfQ09ERVNFVCk7Ci0KLQkJCQl0cnkKLQkJCQl7Ci0JCQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQkJCU91dHB1dFN0cmVhbVdyaXRlciBvdXRwdXRTdHJlYW1Xcml0ZXIgPSBudWxsOwotCQkJCQlpZiAoY2hhclNldCA9PSBudWxsIHx8IGNoYXJTZXQudHJpbSgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJLy8ganVzdCB1c2UgZGVmYXVsdCBlbmNvZGluZwotCQkJCQkJb3V0cHV0U3RyZWFtV3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXRwdXRTdHJlYW0pOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJb3V0cHV0U3RyZWFtV3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXRwdXRTdHJlYW0sIGNoYXJTZXQpOwotCQkJCQl9Ci0JCQkJCW91dHB1dFN0cmVhbVdyaXRlci53cml0ZSh0ZW1wbGF0ZVN0cmluZyk7Ci0JCQkJCW91dHB1dFN0cmVhbVdyaXRlci5mbHVzaCgpOwotCQkJCQlvdXRwdXRTdHJlYW1Xcml0ZXIuY2xvc2UoKTsKLQkJCQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob3V0cHV0U3RyZWFtLnRvQnl0ZUFycmF5KCkpOwotCQkJCQlmaWxlLnNldENvbnRlbnRzKGlucHV0U3RyZWFtLCB0cnVlLCBmYWxzZSwgbnVsbCk7Ci0JCQkJCWlucHV0U3RyZWFtLmNsb3NlKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkKLQkJCQl7Ci0JCQkJCVhTTFVJUGx1Z2luLmxvZyhlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIG9wZW4gdGhlIGZpbGUgaW4gZWRpdG9yCi0JCQlvcGVuRWRpdG9yKGZpbGUpOwotCi0JCQkvLyBldmVyeXRoaW5nJ3MgZmluZQotCQkJcGVyZm9ybWVkT0sgPSB0cnVlOwotCQl9Ci0JCXJldHVybiBwZXJmb3JtZWRPSzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3BlbkVkaXRvcihmaW5hbCBJRmlsZSBmaWxlKQotCXsKLQkJaWYgKGZpbGUgIT0gbnVsbCkKLQkJewotCQkJZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpCi0JCQl7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkKLQkJCQl7Ci0JCQkJCXRyeQotCQkJCQl7Ci0JCQkJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCQkJCQlJREUub3BlbkVkaXRvcihwYWdlLCBmaWxlLCB0cnVlKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkKLQkJCQkJewotCQkJCQkJWFNMVUlQbHVnaW4ubG9nKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3dpemFyZHMvTmV3WFNMRmlsZVdpemFyZFBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC93aXphcmRzL05ld1hTTEZpbGVXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNTViZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3dpemFyZHMvTmV3WFNMRmlsZVdpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5XaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5YU0xDb3JlOwotCi1jbGFzcyBOZXdYU0xGaWxlV2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UKLXsKLQlwcml2YXRlIElDb250ZW50VHlwZSBmQ29udGVudFR5cGU7Ci0JcHJpdmF0ZSBMaXN0IGZWYWxpZEV4dGVuc2lvbnMgPSBudWxsOwotCi0JcHVibGljIE5ld1hTTEZpbGVXaXphcmRQYWdlKFN0cmluZyBwYWdlTmFtZSwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKQotCXsKLQkJc3VwZXIocGFnZU5hbWUsIHNlbGVjdGlvbik7Ci0JCS8vIGZpbmQgYW4gdW51c2VkIGZpbGUgbmFtZQotCQlzZXRGaWxlTmFtZShnZXRVbnVzZWRGaWxlbmFtZSgiTmV3U3R5bGVzaGVldCIsc2VsZWN0aW9uKSk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldFVudXNlZEZpbGVuYW1lKFN0cmluZyBwcmVmaXgsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikKLQl7Ci0JCVN0cmluZyBuYW1lID0gcHJlZml4KyIueHNsIjsKLQkJaWYgKHNlbGVjdGlvbi5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gbmFtZTsKLQkJT2JqZWN0IGVsZW1lbnQgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUNvbnRhaW5lcikKLQkJewotCQkJSUNvbnRhaW5lciBjID0gKElDb250YWluZXIpZWxlbWVudDsKLQkJCWludCBpPTA7Ci0JCQlkbwotCQkJewotCQkJCWlmIChjLmZpbmRNZW1iZXIobmFtZSkgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIG5hbWU7Ci0JCQkJaSsrOwotCQkJCW5hbWUgPSBwcmVmaXgraSsiLnhzbCI7Ci0JCQl9Ci0JCQl3aGlsZSh0cnVlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVBhZ2UoKQotCXsKLQkJc2V0TWVzc2FnZShudWxsKTsKLQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCi0JCWlmICghc3VwZXIudmFsaWRhdGVQYWdlKCkpCi0JCXsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVN0cmluZyBmaWxlTmFtZSA9IGdldEZpbGVOYW1lKCk7Ci0JCUlQYXRoIGZ1bGxQYXRoID0gZ2V0Q29udGFpbmVyRnVsbFBhdGgoKTsKLQkJaWYgKChmdWxsUGF0aCAhPSBudWxsKSAmJiAoZnVsbFBhdGguaXNFbXB0eSgpID09IGZhbHNlKSAmJiAoZmlsZU5hbWUgIT0gbnVsbCkpCi0JCXsKLQkJCS8vIGNoZWNrIHRoYXQgZmlsZW5hbWUgZG9lcyBub3QgY29udGFpbiBpbnZhbGlkIGV4dGVuc2lvbgotCQkJaWYgKCFleHRlbnNpb25WYWxpZEZvckNvbnRlbnRUeXBlKGZpbGVOYW1lKSkKLQkJCXsKLQkJCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoIlRoZSBmaWxlIG5hbWUgbXVzdCBlbmQgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgZXh0ZW5zaW9ucyB7MH0uIiwgZ2V0VmFsaWRFeHRlbnNpb25zKCkudG9TdHJpbmcoKSkpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCS8vIG5vIGZpbGUgZXh0ZW5zaW9uIHNwZWNpZmllZCBzbyBjaGVjayBhZGRpbmcgZGVmYXVsdAotCQkJLy8gZXh0ZW5zaW9uIGRvZXNuJ3QgZXF1YWwgYSBmaWxlIHRoYXQgYWxyZWFkeSBleGlzdHMKLQkJCWlmIChmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpID09IC0xKQotCQkJewotCQkJCVN0cmluZyBuZXdGaWxlTmFtZSA9IGFkZERlZmF1bHRFeHRlbnNpb24oZmlsZU5hbWUpOwotCQkJCUlQYXRoIHJlc291cmNlUGF0aCA9IGZ1bGxQYXRoLmFwcGVuZChuZXdGaWxlTmFtZSk7Ci0KLQkJCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJCQlJU3RhdHVzIHJlc3VsdCA9IHdvcmtzcGFjZS52YWxpZGF0ZVBhdGgocmVzb3VyY2VQYXRoLnRvU3RyaW5nKCksIElSZXNvdXJjZS5GT0xERVIpOwotCQkJCWlmICghcmVzdWx0LmlzT0soKSkKLQkJCQl7Ci0JCQkJCS8vIHBhdGggaW52YWxpZAotCQkJCQlzZXRFcnJvck1lc3NhZ2UocmVzdWx0LmdldE1lc3NhZ2UoKSk7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0KLQkJCQlpZiAoKHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0Rm9sZGVyKHJlc291cmNlUGF0aCkuZXhpc3RzKCkgfHwgd29ya3NwYWNlLmdldFJvb3QoKS5nZXRGaWxlKHJlc291cmNlUGF0aCkuZXhpc3RzKCkpKQotCQkJCXsKLQkJCQkJc2V0RXJyb3JNZXNzYWdlKCJUaGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLiIpOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlTdHJpbmcgYWRkRGVmYXVsdEV4dGVuc2lvbihTdHJpbmcgZmlsZW5hbWUpCi0JewotCQlTdHJpbmdCdWZmZXIgbmV3RmlsZU5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKGZpbGVuYW1lKTsKLQotCQkvLyBQcmVmZXJlbmNlcyBwcmVmZXJlbmNlID0KLQkJLy8gWFNMVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCS8vIFN0cmluZyBleHQgPQotCQkvLyBwcmVmZXJlbmNlLmdldFN0cmluZyhKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLkRFRkFVTFRfRVhURU5TSU9OKTsKLQotCQlTdHJpbmcgZXh0ID0gInhzbCI7Ci0JCW5ld0ZpbGVOYW1lLmFwcGVuZCgiLiIpOwotCQluZXdGaWxlTmFtZS5hcHBlbmQoZXh0KTsKLQotCQlyZXR1cm4gbmV3RmlsZU5hbWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgY29udGVudCB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5ldyBmaWxlIHdpemFyZAotCSAqIAotCSAqIEByZXR1cm4gSUNvbnRlbnRUeXBlCi0JICovCi0JcHJpdmF0ZSBJQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoKQotCXsKLQkJaWYgKGZDb250ZW50VHlwZSA9PSBudWxsKQotCQkJZkNvbnRlbnRUeXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoWFNMQ29yZS5YU0xfQ09OVEVOVF9UWVBFKTsKLQkJcmV0dXJuIGZDb250ZW50VHlwZTsKLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0VmFsaWRFeHRlbnNpb25zKCkKLQl7Ci0JCWlmIChmVmFsaWRFeHRlbnNpb25zID09IG51bGwpCi0JCXsKLQkJCUlDb250ZW50VHlwZSB0eXBlID0gZ2V0Q29udGVudFR5cGUoKTsKLQkJCWZWYWxpZEV4dGVuc2lvbnMgPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QodHlwZS5nZXRGaWxlU3BlY3MoSUNvbnRlbnRUeXBlLkZJTEVfRVhURU5TSU9OX1NQRUMpKSk7Ci0JCX0KLQkJcmV0dXJuIGZWYWxpZEV4dGVuc2lvbnM7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGV4dGVuc2lvblZhbGlkRm9yQ29udGVudFR5cGUoU3RyaW5nIGZpbGVOYW1lKQotCXsKLQkJYm9vbGVhbiB2YWxpZCA9IGZhbHNlOwotCi0JCUlDb250ZW50VHlwZSB0eXBlID0gZ2V0Q29udGVudFR5cGUoKTsKLQkJLy8gdGhlcmUgaXMgY3VycmVudGx5IGFuIGV4dGVuc2lvbgotCQlpZiAoZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKSAhPSAtMSkKLQkJewotCQkJLy8gY2hlY2sgd2hhdCBjb250ZW50IHR5cGVzIGFyZSBhc3NvY2lhdGVkIHdpdGggY3VycmVudCBleHRlbnNpb24KLQkJCUlDb250ZW50VHlwZVtdIHR5cGVzID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZmluZENvbnRlbnRUeXBlc0ZvcihmaWxlTmFtZSk7Ci0JCQlpbnQgaSA9IDA7Ci0JCQl3aGlsZSAoaSA8IHR5cGVzLmxlbmd0aCAmJiAhdmFsaWQpCi0JCQl7Ci0JCQkJdmFsaWQgPSB0eXBlc1tpXS5pc0tpbmRPZih0eXBlKTsKLQkJCQkrK2k7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQkJdmFsaWQgPSB0cnVlOyAvLyBubyBleHRlbnNpb24gc28gdmFsaWQKLQkJcmV0dXJuIHZhbGlkOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC93aXphcmRzL1RlbXBsYXRlQ29udGVudFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvd2l6YXJkcy9UZW1wbGF0ZUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmM0NWNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC93aXphcmRzL1RlbXBsYXRlQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLnBlcnNpc3RlbmNlLlRlbXBsYXRlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLlhTTFVJQ29uc3RhbnRzOwotCi1jbGFzcyBUZW1wbGF0ZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyCi17Ci0JcHJpdmF0ZSBUZW1wbGF0ZVN0b3JlIGZTdG9yZTsKLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotCXsKLQkJZlN0b3JlID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0KQotCXsKLQkJcmV0dXJuIGZTdG9yZS5nZXRUZW1wbGF0ZXMoWFNMVUlDb25zdGFudHMuVEVNUExBVEVfQ09OVEVYVF9YU0xfTkVXKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpCi0JewotCQlmU3RvcmUgPSAoVGVtcGxhdGVTdG9yZSkgbmV3SW5wdXQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3dpemFyZHMvVGVtcGxhdGVMYWJlbFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvd2l6YXJkcy9UZW1wbGF0ZUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYzYmYzZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvd2l6YXJkcy9UZW1wbGF0ZUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLWNsYXNzIFRlbXBsYXRlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyCi17Ci0JcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpCi0JewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkKLQl7Ci0JCVRlbXBsYXRlIHRlbXBsYXRlID0gKFRlbXBsYXRlKSBlbGVtZW50OwotCi0JCXN3aXRjaCAoY29sdW1uSW5kZXgpCi0JCXsKLQkJY2FzZSAwOgotCQkJcmV0dXJuIHRlbXBsYXRlLmdldE5hbWUoKTsKLQkJY2FzZSAxOgotCQkJcmV0dXJuIHRlbXBsYXRlLmdldERlc2NyaXB0aW9uKCk7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gIiI7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvdGVtcGxhdGVzL2ZpbGVfdGVtcGxhdGVzLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS90ZW1wbGF0ZXMvZmlsZV90ZW1wbGF0ZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTU2NTYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS90ZW1wbGF0ZXMvZmlsZV90ZW1wbGF0ZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx0ZW1wbGF0ZXM+Ci08dGVtcGxhdGUgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2x0LnRlbXBsYXRlcy54c2xfYmFzaWMiCi0gICAgICAgbmFtZT0iQmFzaWMgc3R5bGVzaGVldCIKLSAgICAgICBjb250ZXh0PSJ4c2xfbmV3IgotICAgICAgIGF1dG9pbnNlcnQ9InRydWUiCi0gICAgICAgZGVsZXRlZD0iZmFsc2UiCi0gICAgICAgZW5hYmxlZD0idHJ1ZSIKLSAgICAgICBkZXNjcmlwdGlvbj0iTWF0Y2hlcyB0aGUgcm9vdCBvZiB0aGUgaW5wdXQiPjwhW0NEQVRBWzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IiR7ZW5jb2Rpbmd9Ij8+Ci08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iJHt4c2xfdmVyc2lvbn0iIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIj4KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KLQkJPCEtLSBUT0RPOiBBdXRvLWdlbmVyYXRlZCB0ZW1wbGF0ZSAtLT4ke2N1cnNvcn0KLQk8L3hzbDp0ZW1wbGF0ZT4KLTwveHNsOnN0eWxlc2hlZXQ+XV0+PC90ZW1wbGF0ZT4KLTx0ZW1wbGF0ZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbHQudGVtcGxhdGVzLnhzbF9jb3B5IgotICAgICBuYW1lPSJDb3B5IHN0eWxlc2hlZXQiCi0gICAgIGNvbnRleHQ9InhzbF9uZXciCi0gICAgIGF1dG9pbnNlcnQ9InRydWUiCi0gICAgIGRlbGV0ZWQ9ImZhbHNlIgotICAgICBlbmFibGVkPSJ0cnVlIgotICAgICBkZXNjcmlwdGlvbj0iTWFrZXMgYSBjb3B5IG9mIHRoZSBpbnB1dCI+PCFbQ0RBVEFbPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iJHtlbmNvZGluZ30iPz4KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIke3hzbF92ZXJzaW9ufSIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iPgotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9IiR7Y3Vyc29yfSI+Ci0JCTwhLS0gVE9ETzogQXV0by1nZW5lcmF0ZWQgdGVtcGxhdGUgLS0+Ci0JPC94c2w6dGVtcGxhdGU+Ci0JPCEtLSBzdGFuZGFyZCBjb3B5IHRlbXBsYXRlIC0tPgotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9IkAqfG5vZGUoKSI+Ci0JCTx4c2w6Y29weT4KLQkJCTx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCoiLz4KLQkJCTx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLQkJPC94c2w6Y29weT4KLQk8L3hzbDp0ZW1wbGF0ZT4JCi08L3hzbDpzdHlsZXNoZWV0Pl1dPjwvdGVtcGxhdGU+Ci08L3RlbXBsYXRlcz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkveHNsZmlsZXMvc3ludGF4Y29sb3JpbmcueHNsIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3hzbGZpbGVzL3N5bnRheGNvbG9yaW5nLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVjOGI1OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkveHNsZmlsZXMvc3ludGF4Y29sb3JpbmcueHNsCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzb212ZVZhbHVlIj4xMjM0PC94c2w6dmFyaWFibGU+Ci0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+Ci0gICAgICAgICA8eHNsOmlmIHRlc3Q9IiRzb21lVmFsdWUiPgotICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgLz4KLSAgICAgICAgIDwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmRmOGU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLWRlYnVnZ2VyIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYjc2YmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWphdmFDb21waWxlci54YWxhbi1kZWJ1Z2dlci5qYXIuYXJncwotYnVpbGQueG1sCi14YWxhbi1kZWJ1Z2dlci5qYXIKLXRlbXAuZm9sZGVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNTZiYzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLmFwaS50b29scy5hcGlBbmFseXNpc0J1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLmFwaS50b29scy5hcGlBbmFseXNpc05hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiYTEzMDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1RodSBKYW4gMDMgMjI6MjQ6NTAgRVNUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYmMzNDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSNTdW4gRGVjIDE2IDA4OjQ4OjUyIEdNVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWU2OGI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotI1dlZCBKdWwgMzAgMjA6NTc6MTUgQlNUIDIwMDgKLWNvbXBpbGVycy5mLnVucmVzb2x2ZWQtZmVhdHVyZXM9MQotY29tcGlsZXJzLmYudW5yZXNvbHZlZC1wbHVnaW5zPTEKLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MQotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5kaXNjb3VyYWdlZC1jbGFzcz0xCi1jb21waWxlcnMucC5pbnRlcm5hbD0xCi1jb21waWxlcnMucC5taXNzaW5nLWJ1bmRsZS1jbGFzc3BhdGgtZW50cmllcz0wCi1jb21waWxlcnMucC5taXNzaW5nLXBhY2thZ2VzPTIKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0xCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTEKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLWlkZW50aWZpZXI9MQotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0xCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMucy5jcmVhdGUtZG9jcz1mYWxzZQotY29tcGlsZXJzLnMuZG9jLWZvbGRlcj1kb2MKLWNvbXBpbGVycy5zLm9wZW4tdGFncz0xCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdiZjNlZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbjtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi5kZWJ1Z2dlcjsKLSAgdXNlczo9Im9yZy5lY2xpcHNlLndzdC54c2wuZGVidWdnZXIsCi0gICBvcmcuYXBhY2hlLnhwYXRoLAotICAgb3JnLmFwYWNoZS54YWxhbi50cmFjZSwKLSAgIGphdmF4LnhtbC50cmFuc2Zvcm0sCi0gICBvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcyIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuYXBhY2hlLnhhbGFuO2J1bmRsZS12ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnhtbC5zZXJpYWxpemVyO2J1bmRsZS12ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWc7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiO3Jlc29sdXRpb246PW9wdGlvbmFsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vWGFsYW5BdHRyaWJ1dGVzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vWGFsYW5BdHRyaWJ1dGVzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MWI1YzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuL1hhbGFuQXR0cmlidXRlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLU9QVElNSVpFPWh0dHA6Ly94bWwuYXBhY2hlLm9yZy94YWxhbi9mZWF0dXJlcy9vcHRpbWl6ZQotT1BUSU1JWkUuVFlQRT1ib29sZWFuCi1PUFRJTUlaRS5ERVNDPU9wdGltaXplIHN0eWxlc2hlZXQgcHJvY2Vzc2luZy4gQnkgZGVmYXVsdCwgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIHRydWUuIFlvdSBtYXkgbmVlZCB0byBzZXQgaXQgdG8gZmFsc2UgZm9yIHRvb2xpbmcgYXBwbGljYXRpb25zLgotCi1JTkNSRU1FTlRBTD1odHRwOi8veG1sLmFwYWNoZS5vcmcveGFsYW4vZmVhdHVyZXMvaW5jcmVtZW50YWwKLUlOQ1JFTUVOVEFMLlRZUEU9Ym9vbGVhbgotSU5DUkVNRU5UQUwuREVTQz1Qcm9kdWNlIG91dHB1dCBpbmNyZW1lbnRhbGx5LCByYXRoZXIgdGhhbiB3YWl0aW5nIHRvIGZpbmlzaCBwYXJzaW5nIHRoZSBpbnB1dCBiZWZvcmUgZ2VuZXJhdGluZyBhbnkgb3V0cHV0LiBCeSBkZWZhdWx0IHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBmYWxzZS4gWW91IGNhbiB0dXJuIHRoaXMgYXR0cmlidXRlIG9uIHRvIHRyYW5zZm9ybSBsYXJnZSBkb2N1bWVudHMgd2hlcmUgdGhlIHN0eWxlc2hlZXQgc3RydWN0dXJlIGlzIG9wdGltaXplZCB0byBleGVjdXRlIGluZGl2aWR1YWwgdGVtcGxhdGVzIHdpdGhvdXQgaGF2aW5nIHRvIHBhcnNlIHRoZSBlbnRpcmUgZG9jdW1lbnQuCi0KLVNPVVJDRV9MT0NBVElPTj1odHRwOi8veG1sLmFwYWNoZS5vcmcveGFsYW4vZmVhdHVyZXMvc291cmNlX2xvY2F0aW9uCi1TT1VSQ0VfTE9DQVRJT04uVFlQRT1ib29sZWFuCi1TT1VSQ0VfTE9DQVRJT04uREVTQz1CeSBkZWZhdWx0LCB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gZmFsc2UuIFNldHRpbmcgdGhpcyBhdHRyaWJ1dGUgdG8gdHJ1ZSBpbnZvbHZlcyBhIHN1YnN0YW50aWFsIGluY3JlYXNlIGluIHN0b3JhZ2UgY29zdCBwZXIgc291cmNlIGRvY3VtZW50IG5vZGUuIElmIHlvdSB3YW50IHRvIHVzZSB0aGUgTm9kZUluZm8gZXh0ZW5zaW9uIGZ1bmN0aW9ucyAob3Igc29tZSBvdGhlciBtZWNoYW5pc20pIHRvIHByb3ZpZGUgdGhpcyBpbmZvcm1hdGlvbiBkdXJpbmcgYSB0cmFuc2Zvcm0sIHlvdSBtdXN0IHNldCB0aGUgYXR0cmlidXRlIHRvIHRydWUgYmVmb3JlIGdlbmVyYXRpbmcgdGhlIFRyYW5zZm9ybWVyIGFuZCBwcm9jZXNzaW5nIHRoZSBzdHlsZXNoZWV0LgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi9YYWxhbk91dHB1dFByb3BlcnRpZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi9YYWxhbk91dHB1dFByb3BlcnRpZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VlYjA3MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vWGFsYW5PdXRwdXRQcm9wZXJ0aWVzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotU19LRVlfSU5ERU5UX0FNT1VOVD17aHR0cDovL3htbC5hcGFjaGUub3JnL3hhbGFufWluZGVudC1hbW91bnQKLVNfS0VZX0lOREVOVF9BTU9VTlQuREVTQz1UaGUgbm9uLXN0YW5kYXJkIHByb3BlcnR5IGtleSB0byB1c2UgdG8gc2V0IHRoZVxuXAotCW51bWJlciBvZiB3aGl0ZXBhY2VzIHRvIGluZGVudCBieSwgcGVyIGluZGVudGF0aW9uIGxldmVsLFxuXAotICAgIGlmIGluZGVudD0ieWVzIgotCi1TX0tFWV9MSU5FX1NFUEFSQVRPUj17aHR0cDovL3htbC5hcGFjaGUub3JnL3hhbGFufWxpbmUtc2VwYXJhdG9yCi1TX0tFWV9MSU5FX1NFUEFSQVRPUi5ERVNDPVRoZSBub24tc3RhbmRhcmQgcHJvcGVydHkga2V5IHRvIHVzZSB0byBzZXQgdGhlIGNoYXJhY3RlcnMgdG8gd3JpdGUgb3V0IGFzIGF0IHRoZSBlbmQgb2YgYSBsaW5lLFxuXAotCXJhdGhlciB0aGFuIHRoZSBkZWZhdWx0IG9uZXMgZnJvbSB0aGUgcnVudGltZS4KLQotU19LRVlfQ09OVEVOVF9IQU5ETEVSPXtodHRwOi8veG1sLmFwYWNoZS5vcmcveGFsYW59Y29udGVudC1oYW5kbGVyCi1TX0tFWV9DT05URU5UX0hBTkRMRVIuREVTQz1UaGlzIG5vbi1zdGFuZGFyZCBwcm9wZXJ0eSBrZXkgaXMgdXNlZCB0byBzZXQgdGhlIG5hbWUgb2YgdGhlIGZ1bGx5IHF1YWxpZmllZFxuXAotICAgICBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgQ29udGVudEhhbmRsZXIgaW50ZXJmYWNlLlxuXAotICAgICBGdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBjbGFzcyB3aXRoIGEgZGVmYXVsdCBjb25zdHJ1Y3RvciB0aGF0XG5cCi0gICAgIGltcGxlbWVudHMgdGhlIENvbnRlbnRIYW5kbGVyIGludGVyZmFjZSwgd2hlcmUgdGhlIHJlc3VsdCB0cmVlIGV2ZW50c1xuXAotICAgICB3aWxsIGJlIHNlbnQgdG8uCi0KLVNfS0VZX0VOVElUSUVTPXtodHRwOi8veG1sLmFwYWNoZS5vcmcveGFsYW59ZW50aXRpZXMKLVNfS0VZX0VOVElUSUVTLkRFU0M9VGhpcyBub24tc3RhbmRhcmQgcHJvcGVydHkga2V5IGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgZmlsZVxuXAotICAgICB0aGF0IHNwZWNpZmllcyBjaGFyYWN0ZXIgdG8gZW50aXR5IHJlZmVyZW5jZSBtYXBwaW5ncy4KLQotU19VU0VfVVJMX0VTQ0FQSU5HPXtodHRwOi8veG1sLmFwYWNoZS5vcmcveGFsYW59dXNlLXVybC1lc2NhcGluZwotU19VU0VfVVJMX0VTQ0FQSU5HLkRFU0M9VGhpcyBub24tc3RhbmRhcmQgcHJvcGVydHkga2V5IGlzIHVzZWQgdG8gc2V0IGEgdmFsdWUgb2YgInllcyIgaWYgdGhlIGhyZWYgdmFsdWVzIGZvciBIVE1MIHNlcmlhbGl6YXRpb24gc2hvdWxkXG5cCi0gICAgIHVzZSAleHggZXNjYXBpbmcuCi0gICAgIAotU19PTUlUX01FVEFfVEFHPXtodHRwOi8veG1sLmFwYWNoZS5vcmcveGFsYW59b21pdC1tZXRhLXRhZwotU19PTUlUX01FVEFfVEFHLkRFU0M9VGhpcyBub24tc3RhbmRhcmQgcHJvcGVydHkga2V5IGlzIHVzZWQgdG8gc2V0IGEgdmFsdWUgb2YgInllcyIgaWYgdGhlIE1FVEEgdGFnIHNob3VsZCBiZSBvbWl0dGVkIHdoZXJlIGl0IHdvdWxkXG5cCi0gICAgIG90aGVyd2lzZSBiZSBzdXBwbGllZC4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjU2YzgyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotc291cmNlLi4gPSBzcmMtZGVidWdnZXIvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgWGFsYW5PdXRwdXRQcm9wZXJ0aWVzLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgWGFsYW5BdHRyaWJ1dGVzLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNGNiZTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jUHJvcGVydGllcyBmaWxlIGZvciBvcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuCi1CdW5kbGUtTmFtZS4wID0gWFNMIFhhbGFuIFN1cHBvcnQgKEluY3ViYXRpbmcpCi1wcm9jZXNzb3JUeXBlLmxhYmVsLjAgPSBYYWxhbgotcHJvY2Vzc29yLmxhYmVsLjAgPSBYYWxhbiAyLjUuMQotcHJvY2Vzc29yLmxhYmVsLjEgPSBYYWxhbiAyLjcuMQotQnVuZGxlLVZlbmRvci4wID0gRWNsaXBzZS5vcmcKLXRyYW5zZm9ybWVyRmFjdG9yeU5hbWVYYWxhbiA9IEludGVycHJldGl2ZQotdHJhbnNmb3JtZXJGYWN0b3J5TmFtZVhhbGFuWFNMVEMgPSBDb21waWxpbmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTYwMjk3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5wcm9jZXNzb3JUeXBlIj4KLSAgICAgIDxwcm9jZXNzb3JUeXBlCi0gICAgICAgICAgICBhdHRyaWJ1dGVQcm9wZXJ0aWVzPSJYYWxhbkF0dHJpYnV0ZXMucHJvcGVydGllcyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLnByb2Nlc3NvclR5cGUiCi0gICAgICAgICAgICBsYWJlbD0iJXByb2Nlc3NvclR5cGUubGFiZWwuMCIKLSAgICAgICAgICAgIG91dHB1dFByb3BlcnRpZXM9IlhhbGFuT3V0cHV0UHJvcGVydGllcy5wcm9wZXJ0aWVzIj4KLSAgICAgICAgIDx0cmFuc2Zvcm1lckZhY3RvcnkKLSAgICAgICAgICAgICAgIGZhY3RvcnlDbGFzcz0ib3JnLmFwYWNoZS54YWxhbi5wcm9jZXNzb3IuVHJhbnNmb3JtZXJGYWN0b3J5SW1wbCIKLSAgICAgICAgICAgICAgIG5hbWU9IiV0cmFuc2Zvcm1lckZhY3RvcnlOYW1lWGFsYW4iPgotICAgICAgICAgPC90cmFuc2Zvcm1lckZhY3Rvcnk+Ci0gICAgICAgICA8dHJhbnNmb3JtZXJGYWN0b3J5Ci0gICAgICAgICAgICAgICBmYWN0b3J5Q2xhc3M9Im9yZy5hcGFjaGUueGFsYW4ueHNsdGMudHJheC5UcmFuc2Zvcm1lckZhY3RvcnlJbXBsIgotICAgICAgICAgICAgICAgbmFtZT0iJXRyYW5zZm9ybWVyRmFjdG9yeU5hbWVYYWxhblhTTFRDIj4KLSAgICAgICAgIDwvdHJhbnNmb3JtZXJGYWN0b3J5PgotICAgICAgPC9wcm9jZXNzb3JUeXBlPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5kZWJ1Z2dlciI+Ci0gICAgICA8ZGVidWdnZXIKLSAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi5kZWJ1Z2dlci5YYWxhbkRlYnVnZ2VyIgotICAgICAgICAgICAgY2xhc3NwYXRoPSIke2VjbGlwc2Vfb3JiaXQ6b3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbn0iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi5kZWJ1Z2dlciIKLSAgICAgICAgICAgIG5hbWU9IlhhbGFuIDIuNS4xIG9yIGdyZWF0ZXIiCi0gICAgICAgICAgICBwcm9jZXNzb3JUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC54c2wueGFsYW4ucHJvY2Vzc29yVHlwZSIKLSAgICAgICAgICAgIHRyYW5zZm9ybWVyRmFjdG9yeUNsYXNzPSJvcmcuYXBhY2hlLnhhbGFuLnByb2Nlc3Nvci5UcmFuc2Zvcm1lckZhY3RvcnlJbXBsIj4KLSAgICAgIDwvZGVidWdnZXI+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLnByb2Nlc3NvciI+Ci0gICAgICA8IS0tIEFuIGFkb3B0ZXIgY2FuIHNwZWNpZnkgdGhlICR7ZWNsaXBzZV9vcmJpdDogfSB2YXJpYWJsZSB0byBpbmRpY2F0ZSB3aGljaCBlY2xpcHNlCi0gICAgICAgICAgIGJ1bmRsZSBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIGNsYXNzIHBhdGguIC0tPgotICAgICAgPHByb2Nlc3NvcgotICAgICAgICAgICAgY2xhc3NwYXRoPSIke2VjbGlwc2Vfb3JiaXQ6b3JnLmFwYWNoZS54YWxhbn07JHtlY2xpcHNlX29yYml0Om9yZy5hcGFjaGUueG1sLnNlcmlhbGl6ZXJ9OyR7ZWNsaXBzZV9vcmJpdDpvcmcuYXBhY2hlLmJjZWx9OyR7ZWNsaXBzZV9vcmJpdDpqYXZhX2N1cC5ydW50aW1lfSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy54YWxhbi5wcm9jZXNzb3IiCi0gICAgICAgICAgICBsYWJlbD0iJXByb2Nlc3Nvci5sYWJlbC4xIgotICAgICAgICAgICAgcHJvY2Vzc29yVHlwZUlkPSJvcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLnByb2Nlc3NvclR5cGUiCi0gICAgICAgICAgICBkZWJ1Z2dlcklkPSJvcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLmRlYnVnZ2VyIgotICAgICAgICAgICAgc3VwcG9ydHM9IjEuMCI+Ci0gICAgICA8L3Byb2Nlc3Nvcj4KLSAgIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vc3JjLWRlYnVnZ2VyL29yZy9lY2xpcHNlL3dzdC94c2wveGFsYW4vZGVidWdnZXIvWGFsYW5EZWJ1Z2dlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuL3NyYy1kZWJ1Z2dlci9vcmcvZWNsaXBzZS93c3QveHNsL3hhbGFuL2RlYnVnZ2VyL1hhbGFuRGVidWdnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYyZWFiMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vc3JjLWRlYnVnZ2VyL29yZy9lY2xpcHNlL3dzdC94c2wveGFsYW4vZGVidWdnZXIvWGFsYW5EZWJ1Z2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi5kZWJ1Z2dlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Ub29NYW55TGlzdGVuZXJzRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4ucHJvY2Vzc29yLlRyYW5zZm9ybWVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50cmFjZS5UcmFjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50cmFuc2Zvcm1lci5UcmFuc2Zvcm1lckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLmRlYnVnZ2VyLkFic3RyYWN0RGVidWdnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLmRlYnVnZ2VyLkJyZWFrUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLmRlYnVnZ2VyLlZhcmlhYmxlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFhhbGFuRGVidWdnZXIgZXh0ZW5kcyBBYnN0cmFjdERlYnVnZ2VyCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFhhbGFuRGVidWdnZXIuY2xhc3MpOwotCXByaXZhdGUgWGFsYW5UcmFjZUxpc3RlbmVyIGN1cnJlbnRUcmFjZUxpc3RlbmVyOwotCXByaXZhdGUgVHJhbnNmb3JtZXJJbXBsIGxhc3RUcmFuc2Zvcm1lckluQ2hhaW47Ci0JCi0JcHVibGljIHZvaWQgc2V0VHJhbnNmb3JtZXJGYWN0b3J5KFRyYW5zZm9ybWVyRmFjdG9yeSBmYWN0b3J5KQotCXsKLQkJVHJhbnNmb3JtZXJGYWN0b3J5SW1wbCB0ZmkgPSAoVHJhbnNmb3JtZXJGYWN0b3J5SW1wbCkgZmFjdG9yeTsKLQkJdGZpLnNldEF0dHJpYnV0ZShUcmFuc2Zvcm1lckZhY3RvcnlJbXBsLkZFQVRVUkVfU09VUkNFX0xPQ0FUSU9OLCBCb29sZWFuLlRSVUUpOwotCQl0Zmkuc2V0QXR0cmlidXRlKFRyYW5zZm9ybWVyRmFjdG9yeUltcGwuRkVBVFVSRV9PUFRJTUlaRSwgQm9vbGVhbi5GQUxTRSk7Ci0JfQotCQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBkZWJ1Z2dlclN1c3BlbmRlZChCcmVha1BvaW50IGJyZWFrcG9pbnQpCi0JewotCQkvLyBmbHVzaCB0aGUgc2VyaWFsaXplciAod2hpY2ggaXMgYnVmZmVyZWQgYnkgWGFsYW4gaXRzZWxmKQotCQl0cnkKLQkJewotCQkJbGFzdFRyYW5zZm9ybWVySW5DaGFpbi5nZXRTZXJpYWxpemF0aW9uSGFuZGxlcigpLmZsdXNoUGVuZGluZygpOwotCQl9Ci0JCWNhdGNoIChTQVhFeGNlcHRpb24gZSkKLQkJewotCQkJbG9nLmVycm9yKCJFcnJvciBmbHVzaGluZyBzZXJpYWxpemVyIiwgZSk7Ci0JCX0KLQkJc3VwZXIuZGVidWdnZXJTdXNwZW5kZWQoYnJlYWtwb2ludCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkVHJhbnNmb3JtZXIoVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIpCi0JewotCQlUcmFuc2Zvcm1lckltcGwgdHJhbnNmb3JtZXJJbXBsID0gKFRyYW5zZm9ybWVySW1wbCkgdHJhbnNmb3JtZXI7Ci0JCQotCQlsYXN0VHJhbnNmb3JtZXJJbkNoYWluID0gdHJhbnNmb3JtZXJJbXBsOwotCQkKLQkJVHJhY2VNYW5hZ2VyIHRyTWdyID0gdHJhbnNmb3JtZXJJbXBsLmdldFRyYWNlTWFuYWdlcigpOwotCQl0cnkKLQkJewotLy8JCQlYYWxhblByaW50VHJhY2VMaXN0ZW5lciBwcmludGVyID0gbmV3IFhhbGFuUHJpbnRUcmFjZUxpc3RlbmVyKG5ldyBQcmludFdyaXRlcihTeXN0ZW0uZXJyKSk7Ci0vLwkJCXByaW50ZXIubV90cmFjZUVsZW1lbnRzID0gdHJ1ZTsKLS8vCQkJcHJpbnRlci5tX3RyYWNlU2VsZWN0aW9uID0gdHJ1ZTsKLS8vCQkJcHJpbnRlci5tX3RyYWNlVGVtcGxhdGVzID0gdHJ1ZTsKLS8vCQkJdHJNZ3IuYWRkVHJhY2VMaXN0ZW5lcihwcmludGVyKTsKLQkJCQotCQkJWGFsYW5UcmFjZUxpc3RlbmVyIHRyYWNlTGlzdGVuZXIgPSBuZXcgWGFsYW5UcmFjZUxpc3RlbmVyKHRoaXMpOwotCQkJdHJNZ3IuYWRkVHJhY2VMaXN0ZW5lcih0cmFjZUxpc3RlbmVyKTsKLQkJfQotCQljYXRjaCAoVG9vTWFueUxpc3RlbmVyc0V4Y2VwdGlvbiBlKQotCQl7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgYSB2YXJpYWJsZSBieSBJRAotCSAqIEBzaW5jZSAxLjAKLQkgKi8KLQlwdWJsaWMgVmFyaWFibGUgZ2V0VmFyaWFibGUoaW50IGlkKQotCXsKLQkJcmV0dXJuIGN1cnJlbnRUcmFjZUxpc3RlbmVyLmdldFZhcmlhYmxlKGlkKTsKLQl9Ci0KLQl2b2lkIHNldEN1cnJlbnRUcmFjZUxpc3RlbmVyKFhhbGFuVHJhY2VMaXN0ZW5lciBjdXJyZW50VHJhY2VMaXN0ZW5lcikKLQl7Ci0JCWxvZy5kZWJ1ZygiU2V0dGluZyBuZXcgWGFsYW5UcmFjZUxpc3RlbmVyIik7Ci0JCXRoaXMuY3VycmVudFRyYWNlTGlzdGVuZXIgPSBjdXJyZW50VHJhY2VMaXN0ZW5lcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vc3JjLWRlYnVnZ2VyL29yZy9lY2xpcHNlL3dzdC94c2wveGFsYW4vZGVidWdnZXIvWGFsYW5QcmludFRyYWNlTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi9zcmMtZGVidWdnZXIvb3JnL2VjbGlwc2Uvd3N0L3hzbC94YWxhbi9kZWJ1Z2dlci9YYWxhblByaW50VHJhY2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDZjMDdkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi9zcmMtZGVidWdnZXIvb3JnL2VjbGlwc2Uvd3N0L3hzbC94YWxhbi9kZWJ1Z2dlci9YYWxhblByaW50VHJhY2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wueGFsYW4uZGVidWdnZXI7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcy5FbGVtVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMuRWxlbVRleHRMaXRlcmFsOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udHJhY2UuRW5kU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50cmFjZS5QcmludFRyYWNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50cmFjZS5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRyYWNlLlRyYWNlckV2ZW50OwotCi1wdWJsaWMgY2xhc3MgWGFsYW5QcmludFRyYWNlTGlzdGVuZXIgZXh0ZW5kcyBQcmludFRyYWNlTGlzdGVuZXIKLXsKLQlwcml2YXRlIGZpbmFsIFByaW50V3JpdGVyIHdyaXRlcjsKLQotCXB1YmxpYyBYYWxhblByaW50VHJhY2VMaXN0ZW5lcihQcmludFdyaXRlciBwdykKLQl7Ci0JCXN1cGVyKHB3KTsKLQkJdGhpcy53cml0ZXIgPSBwdzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBfdHJhY2UoVHJhY2VyRXZlbnQgZXYpCi0JewotCQlzd2l0Y2ggKGV2Lm1fc3R5bGVOb2RlLmdldFhTTFRva2VuKCkpCi0JCXsKLQkJCWNhc2UgQ29uc3RhbnRzLkVMRU1OQU1FX1RFWFRMSVRFUkFMUkVTVUxUOgotCQkJCWlmIChtX3RyYWNlRWxlbWVudHMpCi0JCQkJewotCQkJCQl3cml0ZXIucHJpbnQoZXYubV9zdHlsZU5vZGUuZ2V0U3lzdGVtSWQoKSArICIgTGluZSAjIiArIGV2Lm1fc3R5bGVOb2RlLmdldExpbmVOdW1iZXIoKSArICIsICIgKyAiQ29sdW1uICMiICsgZXYubV9zdHlsZU5vZGUuZ2V0Q29sdW1uTnVtYmVyKCkgKyAiIC0tICIgKyBldi5tX3N0eWxlTm9kZS5nZXROb2RlTmFtZSgpCi0JCQkJCQkJKyAiOiAiKTsKLQotCQkJCQlFbGVtVGV4dExpdGVyYWwgZXRsID0gKEVsZW1UZXh0TGl0ZXJhbCkgZXYubV9zdHlsZU5vZGU7Ci0JCQkJCVN0cmluZyBjaGFycyA9IG5ldyBTdHJpbmcoZXRsLmdldENoYXJzKCksIDAsIGV0bC5nZXRDaGFycygpLmxlbmd0aCk7Ci0KLQkJCQkJd3JpdGVyLnByaW50bG4oIiAgICAiICsgY2hhcnMudHJpbSgpKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENvbnN0YW50cy5FTEVNTkFNRV9URU1QTEFURToKLQkJCQlpZiAobV90cmFjZVRlbXBsYXRlcyB8fCBtX3RyYWNlRWxlbWVudHMpCi0JCQkJewotCQkJCQlFbGVtVGVtcGxhdGUgZXQgPSAoRWxlbVRlbXBsYXRlKSBldi5tX3N0eWxlTm9kZTsKLQotCQkJCQl3cml0ZXIucHJpbnQoZXQuZ2V0U3lzdGVtSWQoKSArICIgTGluZSAjIiArIGV0LmdldExpbmVOdW1iZXIoKSArICIsICIgKyAiQ29sdW1uICMiICsgZXQuZ2V0Q29sdW1uTnVtYmVyKCkgKyAiOiAiICsgZXQuZ2V0Tm9kZU5hbWUoKSArICIgIik7Ci0KLQkJCQkJaWYgKG51bGwgIT0gZXQuZ2V0TWF0Y2goKSkKLQkJCQkJewotCQkJCQkJd3JpdGVyLnByaW50KCJtYXRjaD0nIiArIGV0LmdldE1hdGNoKCkuZ2V0UGF0dGVyblN0cmluZygpICsgIicgIik7Ci0JCQkJCX0KLQotCQkJCQlpZiAobnVsbCAhPSBldC5nZXROYW1lKCkpCi0JCQkJCXsKLQkJCQkJCXdyaXRlci5wcmludCgibmFtZT0nIiArIGV0LmdldE5hbWUoKSArICInICIpOwotCQkJCQl9Ci0KLQkJCQkJd3JpdGVyLnByaW50bG4oKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCWlmIChtX3RyYWNlRWxlbWVudHMpCi0JCQkJewotCQkJCQl3cml0ZXIKLQkJCQkJCQkucHJpbnRsbihldi5tX3N0eWxlTm9kZS5nZXRTeXN0ZW1JZCgpICsgIiBMaW5lICMiICsgZXYubV9zdHlsZU5vZGUuZ2V0TGluZU51bWJlcigpICsgIiwgIiArICJDb2x1bW4gIyIgKyBldi5tX3N0eWxlTm9kZS5nZXRDb2x1bW5OdW1iZXIoKSArICI6ICIKLQkJCQkJCQkJCSsgZXYubV9zdHlsZU5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXYpIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgotCXsKLQkJd3JpdGVyLnByaW50KCJzZWxlY3RlZDogIik7Ci0JCXN1cGVyLnNlbGVjdGVkKGV2KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2VsZWN0RW5kKEVuZFNlbGVjdGlvbkV2ZW50IGV2KSB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KLQl7Ci0JCXdyaXRlci5wcmludCgic2VsZWN0RW5kOiAiKTsKLQkJc3VwZXIuc2VsZWN0RW5kKGV2KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdHJhY2UoVHJhY2VyRXZlbnQgZXYpCi0JewotCQl3cml0ZXIucHJpbnQoInRyYWNlOiAiKTsKLQkJc3VwZXIudHJhY2UoZXYpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0cmFjZUVuZChUcmFjZXJFdmVudCBldikKLQl7Ci0JCXdyaXRlci5wcmludCgidHJhY2VFbmQ6ICIpOwotCQlfdHJhY2UoZXYpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi9zcmMtZGVidWdnZXIvb3JnL2VjbGlwc2Uvd3N0L3hzbC94YWxhbi9kZWJ1Z2dlci9YYWxhblJvb3RTdHlsZUZyYW1lLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vc3JjLWRlYnVnZ2VyL29yZy9lY2xpcHNlL3dzdC94c2wveGFsYW4vZGVidWdnZXIvWGFsYW5Sb290U3R5bGVGcmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjViNzFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi9zcmMtZGVidWdnZXIvb3JnL2VjbGlwc2Uvd3N0L3hzbC94YWxhbi9kZWJ1Z2dlci9YYWxhblJvb3RTdHlsZUZyYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLmRlYnVnZ2VyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcy5FbGVtVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMuU3R5bGVzaGVldFJvb3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50cmFjZS5UcmFjZXJFdmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLlZhcmlhYmxlU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLmRlYnVnZ2VyLlZhcmlhYmxlOwotCi1wdWJsaWMgY2xhc3MgWGFsYW5Sb290U3R5bGVGcmFtZSBleHRlbmRzIFhhbGFuU3R5bGVGcmFtZQotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhYYWxhblJvb3RTdHlsZUZyYW1lLmNsYXNzKTsKLQlwcml2YXRlIE1hcCB2YXJpYWJsZXM7Ci0JcHJpdmF0ZSBBcnJheUxpc3QgZ2xvYmFsczsKLQotCXB1YmxpYyBYYWxhblJvb3RTdHlsZUZyYW1lKFRyYWNlckV2ZW50IGV2ZW50KQotCXsKLQkJc3VwZXIobnVsbCwgZXZlbnQpOwotCQlmaWxsR2xvYmFscyhldmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0R2xvYmFscygpCi0JewotCQlyZXR1cm4gZ2xvYmFsczsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGZpbGxHbG9iYWxzKFRyYWNlckV2ZW50IGV2ZW50KQotCXsKLQkJVmFyaWFibGVTdGFjayB2cyA9IGV2ZW50Lm1fcHJvY2Vzc29yLmdldFhQYXRoQ29udGV4dCgpLmdldFZhclN0YWNrKCk7Ci0JICAgIFN0eWxlc2hlZXRSb290IHNyID0gZXZlbnQubV9zdHlsZU5vZGUuZ2V0U3R5bGVzaGVldFJvb3QoKTsKLQkgICAgVmVjdG9yIHZhcnMgPSBzci5nZXRWYXJpYWJsZXNBbmRQYXJhbXNDb21wb3NlZCgpOwotCQl2YXJpYWJsZXMgPSBuZXcgSGFzaE1hcCh2YXJzLnNpemUoKSk7Ci0JCWdsb2JhbHMgPSBuZXcgQXJyYXlMaXN0KHZhcnMuc2l6ZSgpKTsKLQkgICAgaW50IGkgPSB2YXJzLnNpemUoKTsKLQkgICAgd2hpbGUgKC0taSA+PSAwKQotCQl7Ci0JCQlFbGVtVmFyaWFibGUgdmFyaWFibGUgPSAoRWxlbVZhcmlhYmxlKSB2YXJzLmVsZW1lbnRBdChpKTsKLQkJCVhhbGFuVmFyaWFibGUgeHZhciA9IG5ldyBYYWxhblZhcmlhYmxlKHRoaXMsdnMsVmFyaWFibGUuR0xPQkFMX1NDT1BFLGksdmFyaWFibGUpOwotCQkJYWRkVmFyaWFibGUoeHZhcik7Ci0JCQlnbG9iYWxzLmFkZCh4dmFyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgYSBWYXJpYWJsZSBieSBJRAotCSAqIEBzaW5jZSAxLjAKLQkgKi8KLQlwdWJsaWMgVmFyaWFibGUgZ2V0VmFyaWFibGUoaW50IGlkKQotCXsKLS8vCQlsb2cuZGVidWcoIkdldHRpbmcgdmFyaWFibGUgd2l0aCBpZCAiK2lkKyIgZnJvbSB2YXJpYWJsZXMgIit2YXJpYWJsZXMuc2l6ZSgpKTsKLQkJcmV0dXJuIChWYXJpYWJsZSl2YXJpYWJsZXMuZ2V0KG5ldyBJbnRlZ2VyKGlkKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkVmFyaWFibGUoWGFsYW5WYXJpYWJsZSB4dmFyKQotCXsKLS8vCQlsb2cuZGVidWcoIkFkZGluZyB2YXJpYWJsZSBpbmRleD0iK3h2YXIuZ2V0U2xvdE51bWJlcigpKyIgdmFsPSIreHZhcik7Ci0vLwkJdmFyaWFibGVzLmFkZCh4dmFyLmdldFNsb3ROdW1iZXIoKSx4dmFyKTsKLQkJbG9nLmRlYnVnKCJBZGRpbmcgdmFyaWFibGUgaWQ9Iit4dmFyLmdldElkKCkpOwotCQl2YXJpYWJsZXMucHV0KG5ldyBJbnRlZ2VyKHh2YXIuZ2V0SWQoKSkseHZhcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuL3NyYy1kZWJ1Z2dlci9vcmcvZWNsaXBzZS93c3QveHNsL3hhbGFuL2RlYnVnZ2VyL1hhbGFuU3R5bGVGcmFtZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuL3NyYy1kZWJ1Z2dlci9vcmcvZWNsaXBzZS93c3QveHNsL3hhbGFuL2RlYnVnZ2VyL1hhbGFuU3R5bGVGcmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzI1ZGUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi9zcmMtZGVidWdnZXIvb3JnL2VjbGlwc2Uvd3N0L3hzbC94YWxhbi9kZWJ1Z2dlci9YYWxhblN0eWxlRnJhbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLmRlYnVnZ2VyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZUxvY2F0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcy5FbGVtQ2FsbFRlbXBsYXRlOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzLkVsZW1UZW1wbGF0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcy5FbGVtVGVtcGxhdGVFbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzLkVsZW1WYXJpYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRyYWNlLlRyYWNlckV2ZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5yZWYuRFRNTm9kZVByb3h5OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLlFOYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUueHBhdGguVmFyaWFibGVTdGFjazsKLWltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLlhQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy5kZWJ1Z2dlci5TdHlsZUZyYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5kZWJ1Zy5kZWJ1Z2dlci5WYXJpYWJsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgWGFsYW5TdHlsZUZyYW1lIGV4dGVuZHMgU3R5bGVGcmFtZQotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhYYWxhblN0eWxlRnJhbWUuY2xhc3MpOwotCi0JcHJpdmF0ZSBmaW5hbCBNYXAgdmFyTmFtZXM7Ci0JcHJpdmF0ZSBmaW5hbCBTdGFjayBldmVudFN0YWNrID0gbmV3IFN0YWNrKCk7Ci0JZmluYWwgVHJhY2VyRXZlbnQgZXZlbnQ7Ci0JcHJpdmF0ZSBpbnQgY3VycmVudExpbmU7Ci0JcHJpdmF0ZSBYYWxhblJvb3RTdHlsZUZyYW1lIHJvb3RTdHlsZUZyYW1lOwotCi0JLyoqCi0JICogQHNpbmNlIDEuMAotCSAqLwotCXB1YmxpYyBYYWxhblN0eWxlRnJhbWUoU3R5bGVGcmFtZSBwYXJlbnQsIFRyYWNlckV2ZW50IGV2ZW50KQotCXsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5ldmVudCA9IGV2ZW50OwotCQlpZiAocGFyZW50ICE9IG51bGwpCi0JCQl0aGlzLnZhck5hbWVzID0gbmV3IEhhc2hNYXAoKChYYWxhblN0eWxlRnJhbWUpIHBhcmVudCkudmFyTmFtZXMpOwotCQllbHNlCi0JCQl0aGlzLnZhck5hbWVzID0gbmV3IEhhc2hNYXAoKTsKLQkJcHVzaEVsZW1lbnQoZXZlbnQpOwotCQlmaW5kUm9vdFN0eWxlRnJhbWUoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmluZFJvb3RTdHlsZUZyYW1lKCkKLQl7Ci0JCVhhbGFuU3R5bGVGcmFtZSBmcmFtZSA9IHRoaXM7Ci0JCWRvCi0JCXsKLQkJCWlmIChmcmFtZSBpbnN0YW5jZW9mIFhhbGFuUm9vdFN0eWxlRnJhbWUpCi0JCQkJcm9vdFN0eWxlRnJhbWUgPSAoWGFsYW5Sb290U3R5bGVGcmFtZSkgZnJhbWU7Ci0JCX0KLQkJd2hpbGUgKChmcmFtZSA9IChYYWxhblN0eWxlRnJhbWUpIGZyYW1lLmdldFBhcmVudCgpKSAhPSBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVuYW1lKCkKLQl7Ci0JCXJldHVybiBldmVudC5tX3N0eWxlTm9kZS5nZXRTdHlsZXNoZWV0KCkuZ2V0U3lzdGVtSWQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkJU3RyaW5nIG5hbWUgPSBldmVudC5tX3N0eWxlTm9kZS5nZXROb2RlTmFtZSgpOwotCQlpZiAoZXZlbnQubV9zdHlsZU5vZGUgaW5zdGFuY2VvZiBFbGVtVGVtcGxhdGUpCi0JCXsKLQkJCUVsZW1UZW1wbGF0ZSBldCA9IChFbGVtVGVtcGxhdGUpIGV2ZW50Lm1fc3R5bGVOb2RlOwotCQkJUU5hbWUgcSA9IGV0LmdldE5hbWUoKTsKLQkJCWlmIChxICE9IG51bGwpCi0JCQl7Ci0JCQkJbmFtZSArPSAiIG5hbWU9XCIiICsgcS5nZXRMb2NhbE5hbWUoKSArICJcIiI7Ci0JCQl9Ci0JCQlYUGF0aCB4cCA9IGV0LmdldE1hdGNoKCk7Ci0JCQlpZiAoeHAgIT0gbnVsbCkKLQkJCXsKLQkJCQluYW1lICs9ICIgbWF0Y2g9XCIiICsgeHAuZ2V0UGF0dGVyblN0cmluZygpICsgIlwiIjsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChldmVudC5tX3N0eWxlTm9kZSBpbnN0YW5jZW9mIEVsZW1DYWxsVGVtcGxhdGUpCi0JCXsKLQkJCUVsZW1DYWxsVGVtcGxhdGUgZXQgPSAoRWxlbUNhbGxUZW1wbGF0ZSkgZXZlbnQubV9zdHlsZU5vZGU7Ci0JCQlRTmFtZSBxID0gZXQuZ2V0TmFtZSgpOwotCQkJaWYgKHEgIT0gbnVsbCkKLQkJCXsKLQkJCQluYW1lICs9ICIgbmFtZT1cIiIgKyBxLmdldExvY2FsTmFtZSgpICsgIlwiIjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRWYXJpYWJsZVN0YWNrKCkKLQl7Ci0JCUxpc3QgdmFycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdmFycy5hZGRBbGwoZ2V0TG9jYWxzKCkpOwotCQl2YXJzLmFkZEFsbChnZXRHbG9iYWxzKCkpOwotCQlyZXR1cm4gdmFyczsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEN1cnJlbnRMaW5lKCkKLQl7Ci0JCXJldHVybiBjdXJyZW50TGluZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwdXNoRWxlbWVudChUcmFjZXJFdmVudCBlKQotCXsKLQkJY3VycmVudExpbmUgPSBlLm1fc3R5bGVOb2RlLmdldExpbmVOdW1iZXIoKTsKLQkJZXZlbnRTdGFjay5wdXNoKGUpOwotCQlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCi0JCQlsb2cuZGVidWcoIlB1c2hlZCBlbGVtZW50ICIgKyBUcmFjZXJFdmVudC5wcmludE5vZGUoZS5tX3N0eWxlTm9kZSkgKyAiIGF0IGxpbmUgIiArIGN1cnJlbnRMaW5lKTsKLQl9Ci0KLQlwdWJsaWMgVHJhY2VyRXZlbnQgcG9wRWxlbWVudCgpCi0JewotCQlUcmFjZXJFdmVudCBlID0gKFRyYWNlckV2ZW50KSBldmVudFN0YWNrLnBvcCgpOwotCQljdXJyZW50TGluZSA9IGUubV9zdHlsZU5vZGUuZ2V0RW5kTGluZU51bWJlcigpOwotCQlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCi0JCQlsb2cuZGVidWcoIlBvcHBlZCBlbGVtZW50ICIgKyBUcmFjZXJFdmVudC5wcmludE5vZGUoZS5tX3N0eWxlTm9kZSkgKyAiIGF0IGxpbmUgIiArIGN1cnJlbnRMaW5lKTsKLQotCQlFbGVtVGVtcGxhdGVFbGVtZW50IGVsZW1lbnQgPSBlLm1fc3R5bGVOb2RlOwotCQlTdHJpbmcgbmFtZSA9IGVsZW1lbnQuZ2V0Tm9kZU5hbWUoKTsKLQkJbG9nLmRlYnVnKCIgbmFtZSAiICsgbmFtZSk7Ci0JCWlmIChuYW1lLmVxdWFscygicGFyYW0iKSB8fCBuYW1lLmVxdWFscygidmFyaWFibGUiKSkKLQkJCWFkZFZhcmlhYmxlKChFbGVtVmFyaWFibGUpIGUubV9zdHlsZU5vZGUpOwotCi0JCXJldHVybiBlOwotCX0KLQotCXB1YmxpYyBUcmFjZXJFdmVudCBwZWVrRWxlbWVudCgpCi0JewotCQlpZiAoZXZlbnRTdGFjay5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChUcmFjZXJFdmVudCkgZXZlbnRTdGFjay5wZWVrKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFZhcmlhYmxlKEVsZW1WYXJpYWJsZSB2YXJpYWJsZSkKLQl7Ci0JCVN0cmluZyBzY29wZSA9IHZhcmlhYmxlLmdldElzVG9wTGV2ZWwoKSA/IFZhcmlhYmxlLkdMT0JBTF9TQ09QRSA6IFZhcmlhYmxlLkxPQ0FMX1NDT1BFOwotCQlWYXJpYWJsZVN0YWNrIHZzID0gZXZlbnQubV9wcm9jZXNzb3IuZ2V0WFBhdGhDb250ZXh0KCkuZ2V0VmFyU3RhY2soKTsKLQkJWGFsYW5WYXJpYWJsZSB4dmFyID0gbmV3IFhhbGFuVmFyaWFibGUodGhpcywgdnMsIHNjb3BlLCB2YXJpYWJsZS5nZXRJbmRleCgpLCB2YXJpYWJsZSk7Ci0JCXJvb3RTdHlsZUZyYW1lLmFkZFZhcmlhYmxlKHh2YXIpOwotCQl2YXJOYW1lcy5wdXQodmFyaWFibGUuZ2V0TmFtZSgpLCB4dmFyKTsKLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0TG9jYWxzKCkKLQl7Ci0JCUxpc3QgbG9jYWxzID0gbmV3IEFycmF5TGlzdCh2YXJOYW1lcy52YWx1ZXMoKSk7Ci0JCS8vIHNvcnQgYnkgc2xvdE51bWJlcgotCQlDb2xsZWN0aW9ucy5zb3J0KGxvY2Fscyk7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0KHZhck5hbWVzLnZhbHVlcygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRHbG9iYWxzKCkKLQl7Ci0JCXJldHVybiByb290U3R5bGVGcmFtZS5nZXRHbG9iYWxzKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTb3VyY2VGaWxlbmFtZSgpCi0JewotCQlTb3VyY2VMb2NhdG9yIGxvY2F0b3IgPSBnZXRTb3VyY2VMb2NhdG9yKCk7Ci0JCWlmIChsb2NhdG9yICE9IG51bGwpCi0JCQlyZXR1cm4gbG9jYXRvci5nZXRTeXN0ZW1JZCgpOwotCQlyZXR1cm4gIiI7Ci0JfQotCi0JcHVibGljIGludCBnZXRTb3VyY2VDdXJyZW50TGluZSgpCi0JewotCQlTb3VyY2VMb2NhdG9yIGxvY2F0b3IgPSBnZXRTb3VyY2VMb2NhdG9yKCk7Ci0JCWlmIChsb2NhdG9yICE9IG51bGwpCi0JCQlyZXR1cm4gbG9jYXRvci5nZXRMaW5lTnVtYmVyKCk7Ci0JCXJldHVybiAwOwotCX0KLQkKLQlwcml2YXRlIFNvdXJjZUxvY2F0b3IgZ2V0U291cmNlTG9jYXRvcigpCi0JewotCQlOb2RlIHNvdXJjZU5vZGUgPSBldmVudC5tX3NvdXJjZU5vZGU7Ci0gICAgICAgIFNvdXJjZUxvY2F0b3IgbG9jYXRvciA9IG51bGw7Ci0JCWlmIChzb3VyY2VOb2RlIGluc3RhbmNlb2YgRFRNTm9kZVByb3h5KQotCQl7Ci0JCQlpbnQgbm9kZUhhbmRsZXIgPSAoKERUTU5vZGVQcm94eSkgc291cmNlTm9kZSkuZ2V0RFRNTm9kZU51bWJlcigpOwotCQkJcmV0dXJuICgoRFRNTm9kZVByb3h5KSBzb3VyY2VOb2RlKS5nZXREVE0oKS5nZXRTb3VyY2VMb2NhdG9yRm9yKG5vZGVIYW5kbGVyKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vc3JjLWRlYnVnZ2VyL29yZy9lY2xpcHNlL3dzdC94c2wveGFsYW4vZGVidWdnZXIvWGFsYW5UcmFjZUxpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vc3JjLWRlYnVnZ2VyL29yZy9lY2xpcHNlL3dzdC94c2wveGFsYW4vZGVidWdnZXIvWGFsYW5UcmFjZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4OWIzMjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuL3NyYy1kZWJ1Z2dlci9vcmcvZWNsaXBzZS93c3QveHNsL3hhbGFuL2RlYnVnZ2VyL1hhbGFuVHJhY2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wueGFsYW4uZGVidWdnZXI7Ci0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udHJhY2UuRW5kU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50cmFjZS5FeHRlbnNpb25FdmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRyYWNlLkdlbmVyYXRlRXZlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50cmFjZS5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRyYWNlLlRyYWNlTGlzdGVuZXJFeDI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50cmFjZS5UcmFjZXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcuZGVidWdnZXIuQnJlYWtQb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcuZGVidWdnZXIuVmFyaWFibGU7Ci0KLXB1YmxpYyBjbGFzcyBYYWxhblRyYWNlTGlzdGVuZXIgaW1wbGVtZW50cyBUcmFjZUxpc3RlbmVyRXgyIC8vIFRyYWNlTGlzdGVuZXJFeDMKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coWGFsYW5UcmFjZUxpc3RlbmVyLmNsYXNzKTsKLQotCXByaXZhdGUgZmluYWwgWGFsYW5EZWJ1Z2dlciBkZWJ1Z2dlcjsKLQlwcml2YXRlIFhhbGFuUm9vdFN0eWxlRnJhbWUgcm9vdFN0eWxlRnJhbWU7Ci0KLQlwdWJsaWMgWGFsYW5UcmFjZUxpc3RlbmVyKFhhbGFuRGVidWdnZXIgZGVidWdnZXIpCi0JewotCQl0aGlzLmRlYnVnZ2VyID0gZGVidWdnZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgdHJhY2UoVHJhY2VyRXZlbnQgZXYpCi0JewotCQlYYWxhblN0eWxlRnJhbWUgc3R5bGVGcmFtZSA9IG51bGw7Ci0JCWlmIChyb290U3R5bGVGcmFtZSA9PSBudWxsKQotCQl7Ly8gdGhpcyBpcyB0aGUgcm9vdCBvZiB0aGUgc3RhY2sKLQkJCWRlYnVnZ2VyLmRlYnVnZ2VyVHJhbnNmb3JtU3RhcnRlZCgpOwotCQkJZGVidWdnZXIuc2V0Q3VycmVudFRyYWNlTGlzdGVuZXIodGhpcyk7Ci0JCQlyb290U3R5bGVGcmFtZSA9IG5ldyBYYWxhblJvb3RTdHlsZUZyYW1lKGV2KTsKLQkJCXN0eWxlRnJhbWUgPSByb290U3R5bGVGcmFtZTsKLQkJCWRlYnVnZ2VyLnB1c2hTdHlsZUZyYW1lKHN0eWxlRnJhbWUpOwotCQl9Ci0JCWVsc2UgaWYgKGV2Lm1fc3R5bGVOb2RlLmdldE93bmVyWFNMVGVtcGxhdGUoKSA9PSBldi5tX3N0eWxlTm9kZSkKLQkJey8vIHRoaXMgaXMgYW4geHNsOnRlbXBsYXRlLCBzbyBhZGQgdG8gdGVtcGxhdGUgc3RhY2sKLQkJCXN0eWxlRnJhbWUgPSBuZXcgWGFsYW5TdHlsZUZyYW1lKGRlYnVnZ2VyLnBlZWtTdHlsZUZyYW1lKCksIGV2KTsKLQkJCWRlYnVnZ2VyLnB1c2hTdHlsZUZyYW1lKHN0eWxlRnJhbWUpOwotCQl9Ci0JCWVsc2UgaWYgKGV2Lm1fc3R5bGVOb2RlLmdldFhTTFRva2VuKCkgIT0gQ29uc3RhbnRzLkVMRU1OQU1FX1RFWFRMSVRFUkFMUkVTVUxUKQotCQl7Ly8gYWRkIHRvIGN1cnJlbnQgdGVtcGxhdGUgZWxlbWVudCBzdGFjawotCQkJc3R5bGVGcmFtZSA9IChYYWxhblN0eWxlRnJhbWUpIGRlYnVnZ2VyLnBlZWtTdHlsZUZyYW1lKCk7Ci0JCQlzdHlsZUZyYW1lLnB1c2hFbGVtZW50KGV2KTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWxvZy5kZWJ1ZygiU2tpcHBlZCBwdXNoIGZvciBlbGVtZW50ICIgKyBldi5tX3N0eWxlTm9kZS5nZXRMb2NhbE5hbWUoKSk7Ci0JCX0KLQkJY2hlY2soc3R5bGVGcmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdHJhY2VFbmQoVHJhY2VyRXZlbnQgZXYpCi0JewotCQlYYWxhblN0eWxlRnJhbWUgc3R5bGVGcmFtZSA9IChYYWxhblN0eWxlRnJhbWUpIGRlYnVnZ2VyLnBlZWtTdHlsZUZyYW1lKCk7Ci0JCWlmIChzdHlsZUZyYW1lICE9IG51bGwpCi0JCXsKLQkJCWlmIChldi5tX3N0eWxlTm9kZS5nZXRPd25lclhTTFRlbXBsYXRlKCkgPT0gZXYubV9zdHlsZU5vZGUpCi0JCQl7Ly8gcmVtb3ZlIGZyb20gY3VycmVudCB0ZW1wbGF0ZSBlbGVtZW50IHN0YWNrCi0JCQkJc3R5bGVGcmFtZS5wb3BFbGVtZW50KCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChldi5tX3N0eWxlTm9kZS5nZXRYU0xUb2tlbigpICE9IENvbnN0YW50cy5FTEVNTkFNRV9URVhUTElURVJBTFJFU1VMVCkKLQkJCXsvLyByZW1vdmUgZnJvbSBjdXJyZW50IHRlbXBsYXRlIGVsZW1lbnQgc3RhY2sKLQkJCQlzdHlsZUZyYW1lLnBvcEVsZW1lbnQoKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlsb2cuZGVidWcoIlNraXBwZWQgcG9wIGZvciBlbGVtZW50ICIgKyBldi5tX3N0eWxlTm9kZS5nZXRMb2NhbE5hbWUoKSk7Ci0JCQl9Ci0JCQljaGVjayhzdHlsZUZyYW1lKTsKLQkJCWlmIChldi5tX3N0eWxlTm9kZS5nZXRPd25lclhTTFRlbXBsYXRlKCkgPT0gZXYubV9zdHlsZU5vZGUpCi0JCQl7Ly8gZW5kIG9mIHRlbXBsYXRlLCBzbyByZW1vdmUgZnJvbSBzdGFjawotCQkJCWRlYnVnZ2VyLnBvcFN0eWxlRnJhbWUoKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsvLyBiZWNhdXNlIHdlIGRvbid0IGdldCBzZWxlY3RFbmQgZXZlbnRzLCB3ZSBuZWVkIHRvIGRvIHRoaXMgY2hlY2sKLQkJCQlUcmFjZXJFdmVudCB0ZWwgPSBzdHlsZUZyYW1lLnBlZWtFbGVtZW50KCk7Ci0JCQkJLy8gaWYgdGhlIHBhcmVudCBpcyBhIGNob29zZSwgbW92ZSBvbiB0byBpdAotCQkJCXN3aXRjaCAodGVsLm1fc3R5bGVOb2RlLmdldFhTTFRva2VuKCkpCi0JCQkJewotCQkJCQljYXNlIENvbnN0YW50cy5FTEVNTkFNRV9DSE9PU0U6Ci0JCQkJCQlzdHlsZUZyYW1lLnBvcEVsZW1lbnQoKTsKLQkJCQkJCWNoZWNrKHN0eWxlRnJhbWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVjayhYYWxhblN0eWxlRnJhbWUgc3R5bGVGcmFtZSkKLQl7Ci0JCWRlYnVnZ2VyLmNoZWNrU3RvcHBlZCgpOwotCQlpZiAoc3R5bGVGcmFtZSAhPSBudWxsKQotCQl7Ci0JCQkvLyBjaGVjayBicmVha3BvaW50IGluIHN0eWxlc2hlZXQKLQkJCUJyZWFrUG9pbnQgYnJlYWtwb2ludCA9IG5ldyBCcmVha1BvaW50KHN0eWxlRnJhbWUuZ2V0RmlsZW5hbWUoKSwgc3R5bGVGcmFtZS5nZXRDdXJyZW50TGluZSgpKTsKLQkJCWRlYnVnZ2VyLmNoZWNrU3VzcGVuZGVkKHN0eWxlRnJhbWUsIGJyZWFrcG9pbnQpOwotCQkJLy8gVE9ETyBjaGVjayBicmVha3BvaW50IGluIHNvdXJjZQotCQkJLyoKLQkJCSAqIGJyZWFrcG9pbnQgPSBuZXcgQnJlYWtQb2ludChzdHlsZUZyYW1lLmdldFNvdXJjZUZpbGVuYW1lKCksIHN0eWxlRnJhbWUuZ2V0U291cmNlQ3VycmVudExpbmUoKSk7IFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tIiticmVha3BvaW50KTsgaWYgKGJyZWFrcG9pbnQuZ2V0RmlsZSgpICE9IG51bGwpCi0JCQkgKiBkZWJ1Z2dlci5jaGVja1N1c3BlbmRlZChzdHlsZUZyYW1lLCBicmVha3BvaW50KTsKLQkJCSAqL30KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldikgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uCi0JewotCX0KLQotCXB1YmxpYyB2b2lkIHNlbGVjdEVuZChFbmRTZWxlY3Rpb25FdmVudCBldikgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uCi0JewotCX0KLQotCXB1YmxpYyB2b2lkIGdlbmVyYXRlZChHZW5lcmF0ZUV2ZW50IGV2KQotCXsKLS8vCQlYU0xHZW5lcmF0ZUV2ZW50IGV2ZW50ID0gbmV3IFhTTEdlbmVyYXRlRXZlbnQoKTsKLS8vCQlldmVudC5tX2NoYXJhY3RlcnMgPSBldi5tX2NoYXJhY3RlcnM7Ci0vLwkJZXZlbnQubV9kYXRhID0gZXYubV9kYXRhOwotLy8JCWV2ZW50Lm1fZXZlbnR0eXBlID0gZXYubV9ldmVudHR5cGU7Ci0vLwkJZXZlbnQubV9sZW5ndGggPSBldi5tX2xlbmd0aDsKLS8vCQlldmVudC5tX25hbWUgPSBldi5tX25hbWU7Ci0vLwkJZXZlbnQubV9zdGFydCA9IGV2Lm1fc3RhcnQ7Ci0vLwkJCi0vLwkJaWYgKGV2Lm1fYXR0cyAhPSBudWxsKQotLy8JCXsKLS8vCQkJZXZlbnQubV9hdHRzID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCQlmb3IgKGludCBpID0gMDsgaSA8IGV2Lm1fYXR0cy5nZXRMZW5ndGgoKTsgaSsrKQotLy8JCQl7Ci0vLwkJCQlTdHJpbmcgYXR0TmFtZSA9IGV2Lm1fYXR0cy5nZXRRTmFtZShpKTsKLS8vCQkJCVN0cmluZyBhdHRWYWx1ZSA9IGV2Lm1fYXR0cy5nZXRWYWx1ZShpKTsKLS8vCQkJCVhTTEVsZW1lbnRBdHRyaWJ1dGUgeGF0dCA9IG5ldyBYU0xFbGVtZW50QXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotLy8JCQkJZXZlbnQubV9hdHRzLmFkZCh4YXR0KTsKLS8vCQkJfQkJCQotLy8JCX0KLS8vCQkKLS8vCQlkZWJ1Z2dlci5nZW5lcmF0ZWQoZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4dGVuc2lvbihFeHRlbnNpb25FdmVudCBlZSkKLQl7Ci0JfQotCi0JcHVibGljIHZvaWQgZXh0ZW5zaW9uRW5kKEV4dGVuc2lvbkV2ZW50IGVlKQotCXsKLQl9Ci0KLQkvKioKLQkgKiBAc2luY2UgMS4wCi0JICovCi0JcHVibGljIFZhcmlhYmxlIGdldFZhcmlhYmxlKGludCBpZCkKLQl7Ci0JCXJldHVybiByb290U3R5bGVGcmFtZS5nZXRWYXJpYWJsZShpZCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vc3JjLWRlYnVnZ2VyL29yZy9lY2xpcHNlL3dzdC94c2wveGFsYW4vZGVidWdnZXIvWGFsYW5WYXJpYWJsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuL3NyYy1kZWJ1Z2dlci9vcmcvZWNsaXBzZS93c3QveHNsL3hhbGFuL2RlYnVnZ2VyL1hhbGFuVmFyaWFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQwYTc0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vc3JjLWRlYnVnZ2VyL29yZy9lY2xpcHNlL3dzdC94c2wveGFsYW4vZGVidWdnZXIvWGFsYW5WYXJpYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIERhdmlkIENhcnZlciAoU1RBUikgLSBidWcgMjE0MjM1IC0gQWxsb3dzIG5vZGVzIHRvIGJlIGV4cGFuZGVkLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wueGFsYW4uZGVidWdnZXI7Ci0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMuRWxlbVZhcmlhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUueHBhdGguVmFyaWFibGVTdGFjazsKLWltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLm9iamVjdHMuWE5vZGVTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5vYmplY3RzLlhPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnLmRlYnVnZ2VyLlZhcmlhYmxlOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uUHJvY2Vzc2luZ0luc3RydWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgWGFsYW5WYXJpYWJsZSBleHRlbmRzIFZhcmlhYmxlIGltcGxlbWVudHMgQ29tcGFyYWJsZSB7Ci0JcHJpdmF0ZSBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coWGFsYW5WYXJpYWJsZS5jbGFzcyk7Ci0JcHJpdmF0ZSBmaW5hbCBFbGVtVmFyaWFibGUgZWxlbVZhcmlhYmxlOwotCXByaXZhdGUgZmluYWwgVmFyaWFibGVTdGFjayB2YXJTdGFjazsKLQlwcml2YXRlIGludCBzdGFja0ZyYW1lOwotCXByaXZhdGUgWE9iamVjdCB4b2JqZWN0OwotCi0JcHVibGljIFhhbGFuVmFyaWFibGUoWGFsYW5TdHlsZUZyYW1lIHhhbGFuU3R5bGVGcmFtZSwKLQkJCVZhcmlhYmxlU3RhY2sgdmFyU3RhY2ssIFN0cmluZyBzY29wZSwgaW50IHNsb3ROdW1iZXIsCi0JCQlFbGVtVmFyaWFibGUgZWxlbVZhcmlhYmxlKSB7Ci0JCXN1cGVyKGdldE5hbWUoZWxlbVZhcmlhYmxlLCBzY29wZSwgeGFsYW5TdHlsZUZyYW1lKSwgc2NvcGUsIHNsb3ROdW1iZXIKLQkJCQkrIHZhclN0YWNrLmdldFN0YWNrRnJhbWUoKSk7Ci0JCXRoaXMuZWxlbVZhcmlhYmxlID0gZWxlbVZhcmlhYmxlOwotCQl0aGlzLnZhclN0YWNrID0gdmFyU3RhY2s7Ci0JCS8vIGdldCB0aGUgc3RhY2sgZnJhbWUgYXQgdGhpcyBjdXJyZW50IHBvaW50IGluIHRpbWUKLQkJdGhpcy5zdGFja0ZyYW1lID0gdmFyU3RhY2suZ2V0U3RhY2tGcmFtZSgpOwotCQl0cnkgewotCQkJeG9iamVjdCA9IGdldFhPYmplY3QoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXROYW1lKEVsZW1WYXJpYWJsZSBlbGVtVmFyaWFibGUsIFN0cmluZyBzY29wZSwKLQkJCVhhbGFuU3R5bGVGcmFtZSB4YWxhblN0eWxlRnJhbWUpIHsKLQkJU3RyaW5nIG5hbWUgPSBlbGVtVmFyaWFibGUuZ2V0TmFtZSgpLmdldExvY2FsTmFtZSgpOwotCQlTdHJpbmcgc3lzdGVtSWQgPSBlbGVtVmFyaWFibGUuZ2V0U3R5bGVzaGVldCgpLmdldFN5c3RlbUlkKCk7Ci0JCWlmIChHTE9CQUxfU0NPUEUuZXF1YWxzKHNjb3BlKSAmJiBzeXN0ZW1JZCAhPSBudWxsKSB7Ci0JCQlpbnQgaW5kZXg7Ci0JCQlpZiAoKGluZGV4ID0gc3lzdGVtSWQubGFzdEluZGV4T2YoJy8nKSkgPiAwKQotCQkJCW5hbWUgKz0gIiAoIiArIHN5c3RlbUlkLnN1YnN0cmluZyhpbmRleCArIDEpICsgIikiOwotCQkJZWxzZQotCQkJCW5hbWUgKz0gIiAoIiArIHN5c3RlbUlkICsgIikiOwotCQl9Ci0JCS8vIGVsc2UgaWYgKExPQ0FMX1NDT1BFLmVxdWFscyhzY29wZSkpCi0JCS8vIHsKLQkJLy8gbmFtZSArPSAiICgiICsgeGFsYW5TdHlsZUZyYW1lLmdldE5hbWUoKSArICIpIjsKLQkJLy8gfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCVN0cmluZyB2YWx1ZSA9IFVOS05PV047Ci0JCS8vIFhPYmplY3QgeG9iamVjdCA9IGdldFhPYmplY3QoKTsKLQkJaWYgKHhvYmplY3QgIT0gbnVsbCkgewotCQkJaW50IHhhbGFuVHlwZSA9IHhvYmplY3QuZ2V0VHlwZSgpOwotCQkJc3dpdGNoICh4YWxhblR5cGUpIHsKLQkJCWNhc2UgWE9iamVjdC5DTEFTU19VTlJFU09MVkVEVkFSSUFCTEU6Ci0JCQkJdmFsdWUgPSBVTlJFU09MVkVEOwotCQkJCWJyZWFrOwotCQkJY2FzZSBYT2JqZWN0LkNMQVNTX05PREVTRVQ6Ci0JCQkJdmFsdWUgPSBOT0RFU0VUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBYT2JqZWN0LkNMQVNTX0JPT0xFQU46Ci0JCQkJdmFsdWUgPSBCT09MRUFOOwotCQkJCWJyZWFrOwotCQkJY2FzZSBYT2JqZWN0LkNMQVNTX05VTUJFUjoKLQkJCQl2YWx1ZSA9IE5VTUJFUjsKLQkJCQlicmVhazsKLQkJCWNhc2UgWE9iamVjdC5DTEFTU19VTktOT1dOOgotCQkJCXZhbHVlID0gVU5LTk9XTjsKLQkJCQlicmVhazsKLQkJCWNhc2UgWE9iamVjdC5DTEFTU19TVFJJTkc6Ci0JCQlkZWZhdWx0OgotCQkJCXZhbHVlID0gU1RSSU5HOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCS8vIGNhdGNoIChUcmFuc2Zvcm1lckV4Y2VwdGlvbiBlKQotCQkvLyB7Ci0JCS8vIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCS8vIH0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCVN0cmluZyB2YWx1ZSA9ICI/Pz8iOwotCQl0cnkgewotCQkJeG9iamVjdCA9IGdldFhPYmplY3QoKTsKLQkJCWlmICh4b2JqZWN0ICE9IG51bGwpIHsKLQkJCQlpbnQgeGFsYW5UeXBlID0geG9iamVjdC5nZXRUeXBlKCk7Ci0JCQkJc3dpdGNoICh4YWxhblR5cGUpIHsKLQkJCQljYXNlIFhPYmplY3QuQ0xBU1NfVU5SRVNPTFZFRFZBUklBQkxFOgotCQkJCQl2YWx1ZSA9ICIiOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFhPYmplY3QuQ0xBU1NfTk9ERVNFVDoKLQkJCQkJWE5vZGVTZXQgeG5zID0gKFhOb2RlU2V0KSB4b2JqZWN0OwotCQkJCQlpZiAoeG5zLm5vZGVsaXN0KCkuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCSAgICB2YWx1ZSA9IGNvbnZlcnROb2RlKHhucyk7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQkJdmFsdWUgPSAiPEVNUFRZIE5PREVTRVQ+IjsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBYT2JqZWN0LkNMQVNTX0JPT0xFQU46Ci0JCQkJY2FzZSBYT2JqZWN0LkNMQVNTX05VTUJFUjoKLQkJCQljYXNlIFhPYmplY3QuQ0xBU1NfU1RSSU5HOgotCQkJCWNhc2UgWE9iamVjdC5DTEFTU19VTktOT1dOOgotCQkJCWRlZmF1bHQ6Ci0JCQkJCXZhbHVlID0geG9iamVjdC50b1N0cmluZygpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJLy8gdmFsdWUgPSBnZXRTY29wZSgpKyIuIitnZXRTbG90TnVtYmVyKCkrIikiK2dldE5hbWUoKTsKLQkJLy8gbG9nLmRlYnVnKGdldFNjb3BlKCkrIi4iK2dldFNsb3ROdW1iZXIoKSsiKSIrZ2V0TmFtZSgpICsgIj0iICsKLQkJLy8gdmFsdWUpOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgY29udmVydE5vZGUoWE5vZGVTZXQgeG5zKSB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24gewotCQlOb2RlTGlzdCBub2RlTGlzdCA9IHhucy5ub2RlbGlzdCgpOwotCQlTdHJpbmcgdmFsdWUgPSBwcm9jZXNzTm9kZUxpc3Qobm9kZUxpc3QpOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgcHJvY2Vzc05vZGVMaXN0KE5vZGVMaXN0IG5vZGVMaXN0KSB7Ci0JCVN0cmluZyB2YWx1ZSA9ICIiOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVMaXN0LmdldExlbmd0aCgpOyBpKyspIHsKLQkJCU5vZGUgbm9kZSA9IG5vZGVMaXN0Lml0ZW0oaSk7Ci0JCQlpbnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJdmFsdWUgPSBjcmVhdGVFbGVtZW50KHZhbHVlLCBub2RlKTsKLQkJCX0KLQkJCWlmIChub2RlVHlwZSA9PSBOb2RlLkNPTU1FTlRfTk9ERSApIHsKLQkJCQl2YWx1ZSA9IHZhbHVlICsgIjwhLS0gIiArIG5vZGUuZ2V0Tm9kZVZhbHVlKCkgKyAiIC0tPiI7Ci0JCQl9Ci0JCQlpZiAobm9kZVR5cGUgPT0gTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUpIHsKLQkJCQlQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gcGkgPSAoUHJvY2Vzc2luZ0luc3RydWN0aW9uKSBub2RlOwotCQkJCXZhbHVlID0gdmFsdWUgKyAiPD8iICsgcGkuZ2V0RGF0YSgpICsgIiA/PiI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGNyZWF0ZUVsZW1lbnQoU3RyaW5nIHZhbHVlLCBOb2RlIG5vZGUpIHsKLQkJdmFsdWUgPSB2YWx1ZSArICI8IjsKLS8vCQlpZiAobm9kZS5nZXRQcmVmaXgoKSAhPSBudWxsICYmIG5vZGUuZ2V0UHJlZml4KCkubGVuZ3RoKCkgPiAwKSB7Ci0vLwkJCXZhbHVlID0gdmFsdWUgKyBub2RlLmdldFByZWZpeCgpICsgIjoiOwotLy8JCX0KLQkJaWYgKG5vZGUuZ2V0Tm9kZU5hbWUoKSAhPSBudWxsKSB7Ci0JCQl2YWx1ZSA9IHZhbHVlICsgbm9kZS5nZXROb2RlTmFtZSgpOwotCQkJaWYgKG5vZGUuaGFzQXR0cmlidXRlcygpKSB7Ci0JCQkJTmFtZWROb2RlTWFwIGF0dHIgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCQl2YWx1ZSA9IHZhbHVlICsgYnVpbGRBdHRyaWJ1dGVzKGF0dHIpOwotCQkJfQotCQkJdmFsdWUgPSB2YWx1ZSArICI+IjsKLQkJCWlmIChub2RlLmdldE5vZGVWYWx1ZSgpICE9IG51bGwpIHsKLQkJCQl2YWx1ZSA9IHZhbHVlICsgbm9kZS5nZXROb2RlVmFsdWUoKTsKLQkJCX0KLQkJfQotCQlpZiAobm9kZS5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCXZhbHVlID0gdmFsdWUgKyBwcm9jZXNzTm9kZUxpc3Qobm9kZS5nZXRDaGlsZE5vZGVzKCkpOwotCQl9Ci0JCXZhbHVlID0gdmFsdWUgKyAiPC8iICsgbm9kZS5nZXROb2RlTmFtZSgpICsgIj4iOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkQXR0cmlidXRlcyhOYW1lZE5vZGVNYXAgYXR0cmlidXRlcykgewotCQlTdHJpbmcgdmFsdWUgPSAiICI7Ci0JCWZvciAoaW50IGEgPSAwOyBhIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsgYSsrKSB7Ci0JCQlBdHRyIGF0dHJpYnV0ZSA9IChBdHRyKWF0dHJpYnV0ZXMuaXRlbShhKTsKLS8vCQkJaWYgKGF0dHJpYnV0ZS5nZXRQcmVmaXgoKSAhPSBudWxsKSB7Ci0vLwkJCQl2YWx1ZSA9IHZhbHVlICsgYXR0cmlidXRlLmdldFByZWZpeCgpICsgIjoiOwotLy8JCQl9Ci0JCQl2YWx1ZSA9IHZhbHVlICsgYXR0cmlidXRlLmdldE5hbWUoKSArICI9XCIiICsgYXR0cmlidXRlLmdldFZhbHVlKCkgKyAiXCIgIjsKLQkJfQotCQl2YWx1ZSA9IHZhbHVlICsgIiAiOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JcHJpdmF0ZSBYT2JqZWN0IGdldFhPYmplY3QoKSB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24gewotCQlYT2JqZWN0IHh2YWx1ZTsKLQkJaWYgKGVsZW1WYXJpYWJsZS5nZXRJc1RvcExldmVsKCkpCi0JCQl4dmFsdWUgPSB2YXJTdGFjay5lbGVtZW50QXQoc2xvdE51bWJlcik7Ci0JCWVsc2UKLQkJCXh2YWx1ZSA9IHZhclN0YWNrLmdldExvY2FsVmFyaWFibGUoZWxlbVZhcmlhYmxlLmdldEluZGV4KCksCi0JCQkJCXN0YWNrRnJhbWUpOwotCQlyZXR1cm4geHZhbHVlOwotCX0KLQotCXB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBhcmcwKSB7Ci0JCVhhbGFuVmFyaWFibGUgeHZhciA9IChYYWxhblZhcmlhYmxlKSBhcmcwOwotCQlpbnQgY29tcCA9IHh2YXIuc3RhY2tGcmFtZSAtIHN0YWNrRnJhbWU7Ci0JCWlmIChjb21wID09IDApCi0JCQljb21wID0gc2xvdE51bWJlciAtIHh2YXIuc2xvdE51bWJlcjsKLQkJcmV0dXJuIGNvbXA7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjVhM2NkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC54c2w8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhYjRhZTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LnhzbAotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wvYWJvdXQuaW5pIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRhNWE0MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT13dHBfcHJvZDMyLnBuZwotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKG5vdCB0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KLQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wvYWJvdXQubWFwcGluZ3MgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODM5MGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsL2Fib3V0LnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ2MGY5NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPVdUUCBYU0wgVG9vbHNcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0XG5cCi0gIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCksXG5cCi0gIERhdmlkIENhcnZlciAoU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsKVxuXAotICBhbmQgb3RoZXJzIDIwMDguIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRhYWU3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIGFib3V0Lm1hcHBpbmdzLFwKLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgd3RwX3Byb2QzMi5naWYsXAotICAgICAgICAgICAgICAgd3RwX3Byb2QzMi5wbmcKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVhNDNiYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNQcm9wZXJ0aWVzIGZpbGUgZm9yIG9yZy5lY2xpcHNlLndzdC54c2wKLUJ1bmRsZS1WZW5kb3IuMCA9IEVjbGlwc2Uub3JnCi1CdW5kbGUtTmFtZS4wID0gV1RQIFhTTCBUb29scyAoSW5jdWJhdGluZykKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wvd3RwX3Byb2QzMi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wvd3RwX3Byb2QzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZmI0NGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsL3d0cF9wcm9kMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsL3d0cF9wcm9kMzIucG5nIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsL3d0cF9wcm9kMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmNlYWIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC93dHBfcHJvZDMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvLmN2c2lnbm9yZSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU5M2RmZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLXhpbmNsdWRlCi10ZXN0LnhtbApkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy8ucHJvamVjdCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNjY5MTIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC54c2wuZG9jPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0aW9uYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg0M2YwZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI01vbiBNYXIgMTAgMTk6NDE6NTAgR01ULTA1OjAwIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvLnNldHRpbmdzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24ucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5YTlhMjkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24ucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jU2F0IFNlcCAyMCAxNzowMzowOSBHTVQgMjAwOAotREVMRUdBVEVTX1BSRUZFUkVOQ0U9ZGVsZWdhdGVWYWxpZGF0b3JMaXN0Ci1VU0VSX0JVSUxEX1BSRUZFUkVOQ0U9ZW5hYmxlZEJ1aWxkVmFsaWRhdG9yTGlzdAotVVNFUl9NQU5VQUxfUFJFRkVSRU5DRT1lbmFibGVkTWFudWFsVmFsaWRhdG9yTGlzdAotVVNFUl9QUkVGRVJFTkNFPW92ZXJyaWRlR2xvYmFsUHJlZmVyZW5jZXN0cnVlZGlzYWJsZUFsbFZhbGlkYXRpb25mYWxzZXZlcnNpb24xLjIuMC52MjAwODA3MjExNDUwCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3ZlcnJpZGU9dHJ1ZQotc3VzcGVuZD1mYWxzZQotdmFscy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuSlNQQmF0Y2hWYWxpZGF0b3IvZ2xvYmFsPUZGMDEKLXZhbHMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLkpTUENvbnRlbnRWYWxpZGF0b3IvZ2xvYmFsPUZGMDEKLXZhbHMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuSFRNTFZhbGlkYXRvci9nbG9iYWw9RkYwMQotdmFscy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLndzZGwvZ2xvYmFsPUZGMDIxNThvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLmVjbGlwc2UuVmFsaWRhdG9yCi12YWxzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS54bWwvZ3JvdXBzPTAxMDdpbmNsdWRlMDcxMTFjb250ZW50VHlwZTEyOG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWxUMTExY29udGVudFR5cGUxMzRvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueG1sc291cmNlVDExMWNvbnRlbnRUeXBlMTM0b3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhzbHNvdXJjZVQxMTFjb250ZW50VHlwZTEzNG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50bGRzb3VyY2VUMDdmaWxlZXh0MDN4bWxGMDdmaWxlZXh0MDNncGhGMDdmaWxlZXh0MTE1d2RvLWNvbm5lY3Rpb25zRjAxMDdleGNsdWRlMDYxMTNwcm9qZWN0TmF0dXJlMTM0b3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQk5hdHVyZTExM3Byb2plY3ROYXR1cmUxMzBvcmcuZWNsaXBzZS5qc3QuajJlZS5FQVJOYXR1cmUwNGZpbGUwOC5wcm9qZWN0VDAxMDRmaWxlMTEwLmNsYXNzcGF0aFQwMTA0ZmlsZTExMC5zZXR0aW5ncy9UMDIwNGZpbGUxMTJjb25jZXB0cy54bWxGMDEKLXZhbHMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLnhzZC9nbG9iYWw9RkYwMjE2Mm9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVjbGlwc2UuVmFsaWRhdG9yCi12Zi52ZXJzaW9uPTMKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjNjZWEyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2M7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNAotQnVuZGxlLVZlbmRvcjogJXZlbmRvck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9hYm91dC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9idWlsZC5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2Q1MDUzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGh0bWwvLFwKLSAgICAgICAgICAgICAgICoueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLWdlbmVyYXRlU291cmNlQnVuZGxlPWZhbHNlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2J1aWxkLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjgyZmRhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08cHJvamVjdCBkZWZhdWx0PSJjcmVhdGUtZG9jIiBiYXNlZGlyPSIuIj4KLQotCTxwcm9wZXJ0eSBuYW1lPSJjdXJyZW50LWxvYyIgbG9jYXRpb249Ii4iIC8+Ci0JPHByb3BlcnR5IG5hbWU9IndvcmtzcGFjZSIgbG9jYXRpb249Ii4uIiAvPgotCTxwcm9wZXJ0eSBuYW1lPSJodG1sZGlyIiB2YWx1ZT0iJHtjdXJyZW50LWxvY30vaHRtbCIgLz4KLQk8cHJvcGVydHkgbmFtZT0iZG9jYm9va2RpciIgdmFsdWU9IiR7d29ya3NwYWNlfS9Db21tb25VdGlsaXRpZXMvZG9jYm9vay14c2wvZWNsaXBzZSIgLz4KLQk8cHJvcGVydHkgbmFtZT0iZG9jYm9va3NvdXJjZSIgdmFsdWU9IiR7Y3VycmVudC1sb2N9L2RvY2Jvb2siLz4KLQk8cHJvcGVydHkgbmFtZT0ieGFsYW4iIHZhbHVlPSJvcmcuYXBhY2hlLnhhbGFuLnByb2Nlc3Nvci5UcmFuc2Zvcm1lckZhY3RvcnlJbXBsIiAvPgotCi0gICAgCi0JPCEtLSBYU0xUIENodW5raW5nIFByb3BlcnRpZXMgLS0+Ci0JPHByb3BlcnR5IG5hbWU9ImJhc2UuZGlyIiB2YWx1ZT0iJHtodG1sZGlyfSIvPgotCQotCTx0YXJnZXQgbmFtZT0ibWVyZ2UiPgotCQk8eHNsLnhpbmNsdWRlIGluPSIke2RvY2Jvb2tzb3VyY2V9L3hzbGhlbHAuZGJrIgotCQkgICAgICAgICAgICAgIG91dD0iJHtkb2Nib29rc291cmNlfS94c2xoZWxwY29tYmluZWQuZGJrIi8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImNyZWF0ZS1kb2MiIGRlcGVuZHM9Im1lcmdlIj4KLQotCQk8eHNsdCBmb3JjZT0idHJ1ZSIgc3R5bGU9IiR7ZG9jYm9va2Rpcn0vZWNsaXBzZTMzLnhzbCIgaW49IiR7ZG9jYm9va3NvdXJjZX0veHNsaGVscGNvbWJpbmVkLmRiayIgb3V0PSJ0ZXN0LnhtbCI+Ci0JCQk8ZmFjdG9yeSBuYW1lPSIke3hhbGFufSIgLz4KLQkJCTxwYXJhbSBuYW1lPSJtYW5pZmVzdCIgZXhwcmVzc2lvbj0iMSIvPgotCQkJPHBhcmFtIG5hbWU9ImJhc2UuZGlyIiBleHByZXNzaW9uPSIke2h0bWxkaXJ9LyIvPgotCQkJPHBhcmFtIG5hbWU9ImNyZWF0ZS5wbHVnaW4ueG1sIiBleHByZXNzaW9uPSIwIi8+Ci0JCQk8cGFyYW0gbmFtZT0iY2h1bmtlci5vdXRwdXQuaW5kZW50IiBleHByZXNzaW9uPSJ5ZXMiLz4KLQkJCTxwYXJhbSBuYW1lPSJuYXZpZy5zaG93dGl0bGVzIiBleHByZXNzaW9uPSIwIi8+Ci0JCQk8cGFyYW0gbmFtZT0ic3VwcHJlc3MubmF2aWdhdGlvbiIgZXhwcmVzc2lvbj0iMSIvPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImdlbmVyYXRlLnRvYyIgZXhwcmVzc2lvbj0iYm9vayAgICAgIHRvYyx0aXRsZQotY2hhcHRlciAgIHRvYyx0aXRsZQotc2VjdGlvbiAgIHRpdGxlIiAvPgotCQkJPHBhcmFtIG5hbWU9ImNoYXB0ZXIuYXV0b2xhYmVsIiBleHByZXNzaW9uPSIwIi8+Ci0JCQk8cGFyYW0gbmFtZT0ic2VjdGlvbi5hdXRvbGFiZWwiIGV4cHJlc3Npb249IjAiLz4KLQkJCTxwYXJhbSBuYW1lPSJodG1sLnN0eWxlc2hlZXQiIGV4cHJlc3Npb249ImJvb2suY3NzIC4uL2Jvb2suY3NzIi8+Ci0JCQk8cGFyYW0gbmFtZT0iY2h1bmsuc2VjdGlvbi5kZXB0aCIgZXhwcmVzc2lvbj0iMyIvPgotCQkJPHBhcmFtIG5hbWU9InRvYy5zZWN0aW9uLmRlcHRoIiBleHByZXNzaW9uPSI1Ii8+Ci0JCQk8cGFyYW0gbmFtZT0idG9jLmxpc3QudHlwZSIgZXhwcmVzc2lvbj0idWwiLz4KLQkJPC94c2x0PgotCQkKLQkJPHJlcGxhY2UgZmlsZT0iJHtjdXJyZW50LWxvY30vdG9jLnhtbCIgdG9rZW49IiR7Y3VycmVudC1sb2N9LyIgdmFsdWU9IiIvPgotCTwvdGFyZ2V0PgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2RvY2Jvb2svLmN2c2lnbm9yZSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvZG9jYm9vay8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDk1OGIzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvZG9jYm9vay8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAoteHNsaGVscGNvbWJpbmVkLmRiawpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9kb2Nib29rL2NvbmNlcHRzL1Jlc2N1aW5nWFNMVGZyb21OaWNoZVN0YXR1cy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2RvY2Jvb2svY29uY2VwdHMvUmVzY3VpbmdYU0xUZnJvbU5pY2hlU3RhdHVzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUxOWE4Mi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2RvY2Jvb2svY29uY2VwdHMvUmVzY3VpbmdYU0xUZnJvbU5pY2hlU3RhdHVzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUwMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIHNlY3Rpb24gUFVCTElDICItLy9PQVNJUy8vRFREIERvY0Jvb2sgWE1MIFY0LjUvL0VOIgotICAgICAgICAgICJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2RvY2Jvb2sveG1sLzQuNS9kb2Nib29reC5kdGQiPgotPHNlY3Rpb24gaWQ9IlJlc3VjaW5nWFNMVCI+Ci0gICA8dGl0bGU+UmVzY3VpbmcgWFNMVCBGcm9tIE5pY2hlIFN0YXR1czwvdGl0bGU+Ci0gICA8c3VidGl0bGU+QSBHZW50bGUgSW50cm9kdWN0aW9uIHRvIFhTTFQgdGhyb3VnaCBIVE1MIFRlbXBsYXRlczwvc3VidGl0bGU+Ci0gICA8bm90ZT4KLSAgICAgIDxwYXJhPgotICAgICAgICAgPGVtcGhhc2lzPgotICAgICAgICAgICAgRWRpdG9ycyBOb3RlOiBUaGlzIG9yaWdpbmFsbHkgYXBwZWFyZWQgYXQKLSAgICAgICAgICAgIDx1bGluayB1cmw9Imh0dHA6Ly93d3cueGZyb250LmNvbS9yZXNjdWluZy14c2x0Lmh0bWwiPlhGcm9udC5jb208L3VsaW5rPgotICAgICAgICAgICAgLCBhbmQgaXMgcmVwdWJsaXNoZWQgaGVyZSB3aXRoIHBlcm1pc3Npb24uIFRoZSBhcnRpY2xlIGlzIHdyaXR0ZW4gYnkgRGF2aWQgSmFjb2JzLgotICAgICAgICAgPC9lbXBoYXNpcz4KLSAgICAgIDwvcGFyYT4KLSAgIDwvbm90ZT4KLSAgIDxhYnN0cmFjdD4KLSAgICAgIDxwYXJhPgotICAgICAgICAgWFNMVCBpcyBvbmUgb2YgdGhlIG1vc3QgZXhjaXRpbmcgdGVjaG5vbG9naWVzIHRvIGNvbWUgb3V0IG9mIHRoZSBYTUwgZmFtaWx5LiBVbmZvcnR1bmF0ZWx5LCBpdHMgaW5jcmVkaWJsZQotICAgICAgICAgcG93ZXIgYW5kIGFzc29jaWF0ZWQgY29tcGxleGl0eSBjYW4gYmUgb3ZlcndoZWxtaW5nIHRvIG5ldyB1c2VycyBwcmV2ZW50aW5nIG1hbnkgZnJvbSBleHBlcmltZW50aW5nIHdpdGggaXQgb3IKLSAgICAgICAgIGNhdXNpbmcgdGhlbSB0byBxdWlja2x5IGdpdmUgdXAgaW4gZGlzZ3VzdC4gSW4gZmFjdCwgdW5sZXNzIHRoZSBtZXRob2Qgb2YgdGVhY2hpbmcgYW5kIHRoZSBjb21tb24gc3R5bGUgb2YgdXNlCi0gICAgICAgICBmb3IgWFNMVCBpcyByYWRpY2FsbHkgY2hhbmdlZCB0byBtYWtlIGl0IG1vcmUgYWNjZXNzaWJsZSwgWFNMVCB3aWxsIGJlIHJlbGVnYXRlZCB0byBuaWNoZSBzdGF0dXMgbGlrZSBTR01MIGFuZAotICAgICAgICAgb3RoZXIgcG93ZXJmdWwgdGVjaG5vbG9naWVzLgotICAgICAgPC9wYXJhPgotICAgPC9hYnN0cmFjdD4KLSAgIDxzZWN0aW9uPgotICAgICAgPHRpdGxlPlRoZSBQcm9ibGVtPC90aXRsZT4KLSAgICAgIDxwYXJhPgotICAgICAgICAgVGhlIDE5OTDigJlzIHNhdyBhbiBpbmNyZWRpYmxlIHByb2xpZmVyYXRpb24gb2YgbmV3IHdlYiByZWxhdGVkIGxhbmd1YWdlcy4gTG9va2luZyBiYWNrIHdlIGNhbiBzZWUgd2hhdAotICAgICAgICAgZmVhdHVyZXMgc2VwYXJhdGVkIHRoZSB3aW5uZXJzIGFuZCBsb3NlcnMuIFRoZSBiaWdnZXN0IGtleSBoYXMgYmVlbiBoYXZpbmcgYSB2ZXJ5IGxvdyBiYXJyaWVyIHRvIGVudHJ5LiBNYW55Ci0gICAgICAgICBsYW5ndWFnZXMgYWNjb21wbGlzaGVkIHRoaXMgYnkgZm9sbG93aW5nIHRoZSBmb2xsb3dpbmcgcnVsZXMuCi0gICAgICA8L3BhcmE+Ci0gICAgICA8aXRlbWl6ZWRsaXN0PgotICAgICAgICAgPGxpc3RpdGVtPgotICAgICAgICAgICAgPHBhcmE+Ci0gICAgICAgICAgICAgICBMZXZlcmFnZSBhcyBtdWNoIGV4aXN0aW5nIGtub3dsZWRnZSBhcyBwb3NzaWJsZS4KLSAgICAgICAgICAgIDwvcGFyYT4KLSAgICAgICAgIDwvbGlzdGl0ZW0+Ci0gICAgICAgICA8bGlzdGl0ZW0+Ci0gICAgICAgICAgICA8cGFyYT4KLSAgICAgICAgICAgICAgIE1ha2UgaXQgZWFzeSB0byBnZXQgc3RhcnRlZCB3aXRoICJoZWxsbyB3b3JsZCIgc3R5bGUgZXhhbXBsZS4KLSAgICAgICAgICAgIDwvcGFyYT4KLSAgICAgICAgIDwvbGlzdGl0ZW0+Ci0gICAgICAgICA8bGlzdGl0ZW0+Ci0gICAgICAgICAgICA8cGFyYT4KLSAgICAgICAgICAgICAgIFRoZSBtb3N0IGNvbW1vbiBhbmQgdXNlZnVsIGxhbmd1YWdlIGNvbnN0cnVjdHMgc2hvdWxkIGJlIGVhc2lseSBjb252ZXllZCB3aXRoIGEgZmV3IHNtYWxsIGV4YW1wbGVzLgotICAgICAgICAgICAgPC9wYXJhPgotICAgICAgICAgPC9saXN0aXRlbT4KLSAgICAgICAgIDxsaXN0aXRlbT4KLSAgICAgICAgICAgIDxwYXJhPgotICAgICAgICAgICAgICAgQ29tcGxleCBwcm9ncmFtbWluZyBjb25zdHJ1Y3RzIHNob3VsZCBvbmx5IGJlIHJlcXVpcmVkIHdoZW4gd2hhdCBpcyB0cnlpbmcgdG8gYmUgYWNjb21wbGlzaGVkIGlzCi0gICAgICAgICAgICAgICBjb21wbGV4LiAgICAgICAgICAgIAotICAgICAgICAgICAgPC9wYXJhPgotICAgICAgICAgPC9saXN0aXRlbT4KLSAgICAgIDwvaXRlbWl6ZWRsaXN0PgotICAgICAgPHBhcmE+Ci0gICAgICAgICBGcm9tIHRoZXNlIHJ1bGVzIHdlIGNhbiBzZWUgd2h5IGVtYmVkZGVkIHdlYiBzY3JpcHRpbmcgbGFuZ3VhZ2VzIGxpa2UgQWN0aXZlIFNlcnZlciBQYWdlcyAoQVNQcyksIENvbGQKLSAgICAgICAgIEZ1c2lvbiwgUEhQIGFuZAotICAgICAgICAgSmF2YSBTZXJ2ZXIgUGFnZXMgKEpTUHMpIGFyZSBzbyBwb3B1bGFyLiBUaGV5IGFsbCBsZXZlcmFnZSBhIHVzZXLigJlzIGtub3dsZWRnZSBvZiBIVE1MLiBUaGV5IGFsc28KLSAgICAgICAgIGFsbG93IHRoZQotICAgICAgICAgbWluaW11bSBhbW91bnQgb2Ygc2NyaXB0aW5nIHRvIGJlIGFkZGVkIHRvIGFjY29tcGxpc2ggdGhlIGR5bmFtaWMgZmVhdHVyZSBhIGRldmVsb3BlciBpcyBsb29raW5nIGZvci4KLSAgICAgICAgIFRoaXMgaGFzCi0gICAgICAgICBhbGxvd2VkIG51bWVyb3VzIHdlYiBkZXZlbG9wZXJzIHRvIHN0YXJ0IG9mZiB3aXRoIHZlcnkgc21hbGwgcHJvamVjdHMgYW5kIHRoZW4gdGhyb3VnaCBjb250aW51b3MKLSAgICAgICAgIGVuaGFuY2VtZW50Ci0gICAgICAgICBhbmQgbGVhcm5pbmcsIGZpbmQgdGhlbXNlbHZlcyB1c2luZyB0aGUgZnVsbCBwb3dlciBvZiBhIGNvbXBsZXggcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuIEZ1cnRoZXJtb3JlLAotICAgICAgICAgYmVjYXVzZSBvZgotICAgICAgICAgdGhlIHZlcnkgaW5jcmVtZW50YWwgbmF0dXJlIG9mIHRoYXQgbGVhcm5pbmcgdGhlIGRldmVsb3BlciB3YXMgbmV2ZXIgc2NhcmVkIG9mZi4gICAgICAgICAKLSAgICAgIDwvcGFyYT4KLSAgICAgIDxwYXJhPgotICAgICAgICAgSFRNTCBoYXMgYWxzbyBmb3N0ZXJlZCB0aGUgdGVjaG5pcXVlIG9mIGxlYXJuaW5nIGJ5IGV4YW1wbGUuIFdoZW4gYSB3ZWIgYXV0aG9yIHNlZXMgYW5vdGhlciBzaXRlIHdpdGggYQotICAgICAgICAgZmVhdHVyZSB0aGV5Ci0gICAgICAgICBsaWtlLCB0aGV5IGltbWVkaWF0ZWx5IGJyaW5nIHVwIHRoZSBzb3VyY2UgdG8gc2VlIGhvdyBpdCB3YXMgaW1wbGVtZW50ZWQuIEluIHRoaXMgd2F5IG1hbnkgd2ViCi0gICAgICAgICBhdXRob3JzIHdlcmUKLSAgICAgICAgIGFibGUgdG8gbGVhcm4gY29tcGxleCBIVE1MIHRyaWNrcyB3aXRoIG5vIGZvcm1hbCB0cmFpbmluZy4gV2hpbGUgc2VydmVyLXNpZGUgc2NyaXB0cyBhcmUgbm90IGFzCi0gICAgICAgICBlYXN5IHRvIGNvbWUKLSAgICAgICAgIGJ5LCB0aGVyZSBhcmUgc3RpbGwgbnVtZXJvdXMgc2l0ZXMgdGhhdCBob3VzZSB0aG91c2FuZHMgb2YgZXhhbXBsZSBzY3JpcHRzIGZvciBhIGJsb3Nzb21pbmcKLSAgICAgICAgIGRldmVsb3BlciB0bwotICAgICAgICAgZXhhbWluZS4gICAgICAgICAKLSAgICAgIDwvcGFyYT4KLSAgICAgIDxwYXJhPgotICAgICAgICAgVHJhZGl0aW9uYWxseSBYU0xUIGhhcyBiZWVuIHByZXNlbnRlZCBhcyBhIHByb2dyYW1taW5nIGxhbmd1YWdlIGZvciB0cmFuc2xhdGluZyBYTUwgZG9jdW1lbnRzIGludG8gYW5vdGhlcgotICAgICAgICAgZm9ybWF0LCBvZnRlbiBmb3IgcHJlc2VudGF0aW9uLiBUaGlzIGZyYW1lcyB0aGUgcHJvYmxlbSwgc3VjaCB0aGF0IGZvciBlYWNoIGVsZW1lbnQsIHRoZSBwcm9ncmFtbWVyIGhhcyB0aGUKLSAgICAgICAgIHRhc2sgb2YgZmlndXJpbmcgb3V0IGhvdyB0aGF0IGVsZW1lbnQgbmVlZHMgdG8gYmUgdHJhbnNsYXRlZC4gQXMgbG9uZyBhcyB0aGVyZSBhcmUgb25lIHRvIG9uZSBtYXBwaW5ncyBvciBvbmUKLSAgICAgICAgIHRvIHplcm8gbWFwcGluZ3MgdGhpcyBpcyBzdHJhaWdodGZvcndhcmQuIEZvciBleGFtcGxlLCBpZiBldmVyeSBvY2N1cnJlbmNlIG9mIGEgPCFbQ0RBVEFbCi0gICAgICAgICA8bmFtZT5dXT4KLSAgICAgICAgIGVsZW1lbnQgaXMgZ29pbmcgdG8KLSAgICAgICAgIGJlY29tZSBhbiBIVE1MIGhlYWRlci4gSXQgaXMgYSBzaW1wbGUgbWF0dGVyIHRvIHdyaXRlIGEgbWF0Y2hpbmcgdGVtcGxhdGUgdG8gYWNjb21wbGlzaAotICAgICAgICAgdGhpcy4KLSAgICAgIDwvcGFyYT4KLSAgICAgIDxwcm9ncmFtbGlzdGluZyBpZD0icGxfTmFtZVRlbXBsYXRlIj4KLTwhW0NEQVRBWwotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibmFtZSI+Ci0gIDxoMT48eHNsOmFwcGx5LXRlbXBsYXRlcy8+PC9oMT4KLTwveHNsOnRlbXBsYXRlPgotXV0+ICAgICAgCi0gICAgICA8L3Byb2dyYW1saXN0aW5nPgotICAgICAgPHBhcmE+Ci0gICAgICAgICBIb3dldmVyIHdoZW4gYWRkaW5nIG9uZSB0byBtYW55IG1hcHBpbmdzIChpLmUuIHdoZW4gYW4gZWxlbWVudOKAmXMgY29udGVudHMgd2lsbCBhcHBlYXIgbXVsdGlwbGUgdGltZXMgaW4gdGhlCi0gICAgICAgICB0YXJnZXQgZG9jdW1lbnQgd2l0aCBkaWZmZXJlbnQgZm9ybWF0dGluZyksIGtlZXBpbmcgdHJhY2sgb2YgYWxsIHRoZSByZWxhdGlvbnNoaXBzIHF1aWNrbHkgZ3Jvd3MgaW4gY29tcGxleGl0eQotICAgICAgICAgYW5kIGJlY29tZXMgY29uZnVzaW5nLiBGb3IgZXhhbXBsZSwgaWYsIGFmdGVyIHdyaXRpbmcgdGhlIHByZXZpb3VzIHRlbXBsYXRlLCB0aGUgcHJvZ3JhbW1lciBkaXNjb3ZlcnMgdGhhdCB0aGUKLSAgICAgICAgIG5hbWUgYWxzbyBuZWVkcyB0byBiZSBwbGFjZWQgaW4gdGhlIHRpdGxlIHRoZSBwcm9ncmFtbWVyIG1pZ2h0IGFkZCB0aGUgdGVtcGxhdGUKLSAgICAgIDwvcGFyYT4KLSAgICAgIDxwcm9ncmFtbGlzdGluZyBpZD0icGxfdmFsdWVPZiI+Ci08IVtDREFUQVsKLTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgotICA8dGl0bGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5hbWUiLz48L3RpdGxlPgotPC94c2w6dGVtcGxhdGU+Ci1dXT4gICAgICAKLSAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+Ci0gICAgICA8cGFyYT4KLSAgICAgICAgIE5vdGljZSB0aGUgdXNlIG9mIHRoZSA8IVtDREFUQVs8eHNsOnZhbHVlLW9mPl1dPgotICAgICAgICAgZnVuY3Rpb24gaW4gdGhpcyB0ZW1wbGF0ZSBiZWNhdXNlIHVzaW5nIDwhW0NEQVRBWzxhcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJuYW1lIj5dXT4KLSAgICAgICAgIHdvdWxkIGhhdmUgY2F1c2VkIGEgdHJpZ2dlcmluZyBvZiB0aGUgcHJldmlvdXMgdGVtcGxhdGUgYWRkaW5nIHVuZGVzaXJlZCBoZWFkZXIgdGFncyB0byBteSBjb250ZW50LiBUaGlzIG1lYW5zCi0gICAgICAgICBiZWZvcmUgYWRkaW5nIGEgdHJhbnNsYXRpb24gdG8gYW4gZWxlbWVudCB0aGUgcHJvZ3JhbW1lciBtdXN0IGZpcnN0IGJlIGF3YXJlIG9mIGFsbCB0aGUgZXhpc3RpbmcgdHJhbnNsYXRpb25zCi0gICAgICAgICAodWdoISkuIE9mIGNvdXJzZSBpZiB0aGUgcHJvZ3JhbW1lciBiZWNhbWUgYXdhcmUgb2YgdGhlCi0gICAgICAgICA8IVtDREFUQVs8dGl0bGU+XV0+Ci0gICAgICAgICByZXF1aXJlbWVudCBmaXJzdCwgdGhlIGNvbnRlbnRzIG9mIHRoZXNlIHRlbXBsYXRlcyBjb3VsZCBoYXZlIGJlZW4gcmV2ZXJzZWQuIE9uZSBjYW4gcXVpY2tseSBzZWUgaG93Ci0gICAgICAgICB0aGUKLSAgICAgICAgIGFyYml0cmFyeSBkZWNpc2lvbnMgb2YgZGV2ZWxvcG1lbnQgYW5kIGRpc2NvdmVyeSBvZiByZXF1aXJlbWVudHMgY2FuIGxlYWQgdG8gYSBzZXQgb2YgdGVtcGxhdGVzIHRoYXQgYXJlCi0gICAgICAgICBubwotICAgICAgICAgbG9uZ2VyIGludHVpdGl2ZS4KLSAgICAgIDwvcGFyYT4KLSAgICAgIDxwYXJhPgotICAgICAgICAgQXMgYSBwcm9ncmFtbWVyIHdpdGggbW9yZSB0aGFuIDIwIHllYXJzIGV4cGVyaWVuY2Ugd2l0aCBvdmVyIGEgZG96ZW4gbGFuZ3VhZ2VzLCBYU0xUIHRlbXBsYXRlcyBhbmQgZGVmYXVsdAotICAgICAgICAgcnVsZXMgd2VyZQotICAgICAgICAgbm90IG9idmlvdXMgdG8gbWUuIE92ZXIgdGhlIHBhc3QgeWVhciBvciB0d28gSSBoYWQgbG9va2VkIGF0IG51bWVyb3VzIGV4YW1wbGVzIHRyeWluZyB0byBkaXNjZXJuIGhvdwotICAgICAgICAgdGhleQotICAgICAgICAgd29ya2VkLiBXaGlsZSBJIGNvdWxkIHVuZGVyc3RhbmQgdGhlIGdlbmVyYWwgZ2lzdCBvZiB3aGF0IHdhcyBvY2N1cnJpbmcsIHRoZXJlIHdhcyB0b28gbXVjaCBpbXBsaWVkCi0gICAgICAgICBiZWhhdmlvcgotICAgICAgICAgdGhhdCBJIGRpZCBub3QgcGljayB1cC4gSXQgd2FzIG5vdCB1bnRpbCBnb2luZyB0aHJvdWdoIGZvcm1hbCBYU0xUIHRyYWluaW5nIHRoYXQgSSBmdWxseSB1bmRlcnN0b29kIGhvdwotICAgICAgICAgWFNMVAotICAgICAgICAgd29ya2VkLiBDbGVhcmx5LCBpZiB0aGUgYmFycmllciB0byBlbnRyeSBpcyB0aGF0IGhpZ2ggZm9yIGFuIGV4cGVyaWVuY2VkIHByb2dyYW1tZXIsIHRoZSBhdmVyYWdlIHdlYgotICAgICAgICAgZGV2ZWxvcGVyCi0gICAgICAgICB3YXMgbm90IGdvaW5nIHRvIGZpbmQgdGhpcyB0ZWNobm9sb2d5IHZlcnkgdXNlZnVsLiAgICAgICAgICAKLSAgICAgIDwvcGFyYT4KLSAgIDwvc2VjdGlvbj4KLSAgIDxzZWN0aW9uPgotICAgICAgPHRpdGxlPlRoZSBTb2x1dGlvbjwvdGl0bGU+Ci0gICAgICA8cGFyYT4KLSAgICAgICAgIFNvIGhvdyBkbyB3ZSBzb2x2ZSB0aGlzIHByb2JsZW0gYW5kIGhlbHAgZGVsaXZlciBYU0xU4oCZcyBwcm9taXNlIHRvIHRoZSBtYXNzZXM/IEZvciBYU0xUIHRvIGJlIHN1Y2Nlc3NmdWwgaXQKLSAgICAgICAgIG11c3QgYmUKLSAgICAgICAgIHByZXNlbnRlZCBhbmQgdXNlZCBpbiBhIHdheSB0aGF0IGFkb3B0cyB0aG9zZSBhdHRyaWJ1dGVzIGRpc2N1c3NlZCBlYXJsaWVyIChyZXVzZSBvZiBrbm93bGVkZ2UsIGZhc3QKLSAgICAgICAgIHN0YXJ0LCBhbmQKLSAgICAgICAgIGdyYWR1YWxpc20pLiBUaGlzIHR1dG9yaWFsIHdpbGwgYXR0ZW1wdCB0byBlYXNlIFhTTFTigJlzIGludHJvZHVjdGlvbiBieSBmb2N1c2luZyBvbiB0aGVzZSBhdHRyaWJ1dGVzLgotICAgICAgICAgRmlyc3QsIGl0Ci0gICAgICAgICBpcyBvbmx5IGdvaW5nIHRvIGZvY3VzIG9uIHRoZSBnZW5lcmF0aW9uIG9mIEhUTUwgZG9jdW1lbnRzIGFuZCB1c2VycyB3aG8gYXJlIGZhbWlsaWFyIHdpdGggSFRNTC4gSWYKLSAgICAgICAgIHlvdXIgZ29hbAotICAgICAgICAgaXMgdG8gaW1tZWRpYXRlbHkgc3RhcnQgdHJhbnNmb3JtaW5nIG9uZSBYTUwgZG9jdW1lbnQgaW50byBhbm90aGVyIFhNTCBkb2N1bWVudCB0aGlzIHR1dG9yaWFsIGlzIG5vdAotICAgICAgICAgZm9yIHlvdS4KLSAgICAgIDwvcGFyYT4KLSAgICAgIDxwYXJhPgotICAgICAgICAgVGhlIHNlY29uZCBpcyB0byByZWZyYW1lIHRoZSBwcm9ibGVtIHNvIHRoZSBYU0xUIHNvbHV0aW9ucyBwcm9ncmFtbWVycyB3cml0ZSBhcmUgbW9yZSBuYXR1cmFsbHkgZXh0ZW5zaWJsZQotICAgICAgICAgYW5kCi0gICAgICAgICBpbnR1aXRpdmUuIEluc3RlYWQgb2YgdHJ5aW5nIHRvIHRyYW5zbGF0ZSBhbiBYTUwgc291cmNlIGRvY3VtZW50IGludG8gYW4gSFRNTCBwcmVzZW50YXRpb24gZG9jdW1lbnQsIHRoZQotICAgICAgICAgcHJvZ3JhbW1lciBzaG91bGQgc2VlIHRoZSBYTUwgZG9jdW1lbnQgYXMgYSBjb21wbGV4IGRhdGEgc3RydWN0dXJlIHdpdGggWFNMVCBwcm92aWRpbmcgcG93ZXJmdWwgdG9vbHMgZm9yCi0gICAgICAgICBleHRyYWN0aW5nIHRoYXQgaW5mb3JtYXRpb24gaW50byB0aGVpciBIVE1MIGRvY3VtZW50cy4gVGhpcyBhbGxvd3MgdXMgdG8gbGV2ZXJhZ2UgdGhlIGV4cGVyaWVuY2UgbW9zdCBwZW9wbGUKLSAgICAgICAgIGhhdmUgd2l0aCB1c2luZyBhbiBIVE1MIHRlbXBsYXRpbmcgbGFuZ3VhZ2UgKGUuZy4gQVNQLCBQSFAsIEpTUCwgQ29sZCBGdXNpb24sIFdlYiBNYWNybywgZXRjKS4gVGhlc2UgdGVtcGxhdGluZwotICAgICAgICAgbGFuZ3VhZ2VzIGFyZSBhbGwgYmFzZWQgb24gdGhlIGJhc2ljIHByZW1pc2UgdGhhdCBIVE1MIGNvbWVzIGZpcnN0IGFuZCBhbGwgZW5oYW5jZW1lbnRzIGFyZSB0aGVuIGVtYmVkZGVkIGluCi0gICAgICAgICBzcGVjaWFsIHRhZ3MuICAgICAgICAgCi0gICAgICA8L3BhcmE+Ci0gICAgICA8cGFyYT4KLSAgICAgICAgIFdpdGggc29tZSBjYXZlYXRzLCB0aGlzIHR1dG9yaWFsIHdpbGwgc2hvdyBob3cgWFNMVCBjYW4gYmUgdXNlZCBpbiB0aGlzIHNhbWUgd2F5LiBUaGUgYmVuZWZpdCBvZiB0aGlzCi0gICAgICAgICBhcHByb2FjaCBpcyBpdAotICAgICAgICAgYWxsb3dzIHRoZSBxdWljayB1c2Ugb2YgbWFueSBvZiBYU0xU4oCZcyBwb3dlcmZ1bCBmdW5jdGlvbnMgd2hpbGUgbGV0dGluZyB5b3UgbGVhcm4gaXRzIG1vcmUKLSAgICAgICAgIGVzb3RlcmljCi0gICAgICAgICBjYXBhYmlsaXRpZXMgYXMgdGhlIG5lZWQgYXJpc2VzLiBJbiBhZGRpdGlvbiB0aGUgcmVzdWx0aW5nIFhTTFQgZmlsZXMgYXJlIG1vcmUgaW50dWl0aXZlIGFuZAotICAgICAgICAgbWFpbnRhaW5hYmxlLgotICAgICAgPC9wYXJhPgotICAgICAgPHByb2dyYW1saXN0aW5nPgotPGVtcGhhc2lzIHJvbGU9ImJvbGQiPjwhW0NEQVRBWzx4c2w6dmFsdWUtb2Y+IGFuZCB7fV1dPjwvZW1waGFzaXM+ICAgICAgICAgCi0gICAgICA8L3Byb2dyYW1saXN0aW5nPgotICAgICAgPHBhcmE+Ci0gICAgICAgICBPbiB0byBhbiBleGFtcGxlLiBIZXJlIGlzIGEgdmVyeSBzaW1wbGUgd2VsY29tZSBwYWdlLiAgICAgICAgIAotICAgICAgPC9wYXJhPgotICAgICAgPHByb2dyYW1saXN0aW5nPgotPCFbQ0RBVEFbCi08aHRtbD4KLSAgPGhlYWQ+Ci0gICAgPHRpdGxlPldlbGNvbWU8L3RpdGxlPgotICA8L2hlYWQ+Ci0gIDxib2R5PgotICAgIFdlbGNvbWUhCi0gIDwvYm9keT4KLTwvaHRtbD4KLV1dPiAgICAgICAgIAotICAgICAgPC9wcm9ncmFtbGlzdGluZz4KLSAgICAgIDxwYXJhPgotICAgICAgICAgQW5kIGhlcmUgaXMgYW4gWE1MIGRvY3VtZW50IHdpdGggaW5mb3JtYXRpb24gb24gbWVtYmVyLiAgICAgIAotICAgICAgPC9wYXJhPgotICAgICAgPHByb2dyYW1saXN0aW5nPgotPCFbQ0RBVEFbCi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLSAgICAgICAgICAgICAgICB2ZXJzaW9uPSIxLjAiPgotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KLSAgICA8aHRtbD4KLSAgICAgIDxoZWFkPgotICAgICAgICA8dGl0bGU+V2VsY29tZTwvdGl0bGU+Ci0gICAgICA8L2hlYWQ+Ci0gICAgICA8Ym9keT4KLSAgICAgICAgV2VsY29tZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ibWVtYmVyL25hbWUiLz4hCi0gICAgICA8L2JvZHk+Ci0gICAgPC9odG1sPgotICA8L3hzbDp0ZW1wbGF0ZT4KLTwveHNsOnN0eWxlc2hlZXQ+Ci1dXT4gICAgICAKLSAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+Ci0gICAgICA8cGFyYT4KLSAgICAgICAgIFRoZXJlIGFyZSBhIGNvdXBsZSBvZiB0aGluZ3MgdGhhdCBuZWVkIHRvIGJlIHBvaW50ZWQgb3V0IHJpZ2h0IGF3YXkuIEZpcnN0IHRoaXMgaXMgYSB3ZWxsLWZvcm1lZCBYTUwKLSAgICAgICAgIGRvY3VtZW50LiBUaGlzIG1lYW4gYWxsIEhUTUwgdXNlZCBtdXN0IGNvbmZvcm0gdG8gdGhlIFhIVE1MIHNwZWNpZmljYXRpb24gKGkuZS4gYWxsIHRhZ3MgbXVzdCBiZSBjbG9zZWQgYW5kCi0gICAgICAgICBsb3dlcmNhc2UpLgotICAgICAgPC9wYXJhPgotICAgICAgPHBhcmE+Ci0gICAgICAgICBUaGUgbGluZXMgYmVmb3JlIHRoZSA8IVtDREFUQVs8aHRtbD5dXT4KLSAgICAgICAgIHRhZyBhbmQgYWZ0ZXIgdGhlIDwhW0NEQVRBWzwvaHRtbD5dXT4KLSAgICAgICAgIHRhZyB3aWxsIGJlIHNlZW4gaW4gYWxsIHRoZSBleGFtcGxlcy4gRm9yIG5vdywgb3RoZXIgdGhhbiByZWFsaXppbmcgdGhhdCB0aGV5IGFyZSByZXF1aXJlZCBpbiBhbnkgc3R5bGUgc2hlZXQKLSAgICAgICAgIGNyZWF0ZWQsIGp1c3QgZ28gYWhlYWQgYW5kIGZvcmdldCB0aGV5IGFyZSB0aGVyZS4gWW91IGRvbuKAmXQgTkVFRCB0byB1bmRlcnN0YW5kIHRoZW0gcmlnaHQgbm93IHRvIGdldCB1c2VmdWwKLSAgICAgICAgIHdvcmsgb3V0IG9mIFhTTFQuCi0gICAgICA8L3BhcmE+Ci0gICAgICA8cGFyYT4KLSAgICAgICAgIE5vdGljZSB0aGUgSFRNTCBpcyBpZGVudGljYWwgdG8gdGhlIG9yaWdpbmFsIGV4Y2VwdCBmb3IgdGhlIGludHJvZHVjdGlvbiBvZiBhIG5ldyB0YWcKLSAgICAgICAgIDwhW0NEQVRBWzx4c2w6dmFsdWUtb2Y+XV0+LgotICAgICAgICAgVGhpcyB0YWcgaXMgdGhlIGtleSB0byBleHRyYWN0aW5nIGFueSBwaWVjZSBvZiBpbmZvcm1hdGlvbiBvdXQgYW4gWE1MIGRvY3VtZW50LiBJdCBoYXMgYSAic2VsZWN0IgotICAgICAgICAgYXR0cmlidXRlIHRoYXQKLSAgICAgICAgIHByb3ZpZGVzIHRoZSBwYXRoIHRocm91Z2ggdGhlIFhNTCBkb2N1bWVudCB0byB0aGUgaW5mb3JtYXRpb24gd2Ugc2Vlay4gSW4gdGhpcyBjYXNlCi0gICAgICAgICAgICA8IVtDREFUQVs8bWVtYmVyPl1dPgotICAgICAgICAgaXMgdGhlIG91dGVyIG1vc3QgdGFnIGFuZAotICAgICAgICAgPCFbQ0RBVEFbPG5hbWU+XV0+Ci0gICAgICAgICBpcyB0aGUgdGFnIHVuZGVybmVhdGggaXQuIFNsYXNoIGNoYXJhY3RlcnMgKCIvIikgYXJlIHVzZWQgdG8gZGVzaWduYXRlIHBhcmVudC9jaGlsZCByZWxhdGlvbnNoaXBzCi0gICAgICAgICBiZXR3ZWVuIHRhZ3MuCi0gICAgICAgICBJZiB5b3UgYXJlIHVzZWQgdG8gbmF2aWdhdGluZyBhcm91bmQgYSBVbml4IGZpbGUgc3lzdGVtIHRoaXMgc2hvdWxkIGZlZWwgZmFtaWxpYXIuCi0gICAgICA8L3BhcmE+Ci0gICAgICA8cGFyYT4KLSAgICAgICAgIE5vdyBsZXTigJlzIGNvbnNpZGVyIGZ1cnRoZXIgY3VzdG9taXppbmcgdGhpcyBwYWdlIGJ5IG1ha2luZyB0aGUgd2VsY29tZSBpbiB0aGUgcGVyc29u4oCZcyBmYXZvcml0ZSBjb2xvciB1c2luZyB0aGUKLSAgICAgICAgIDwhW0NEQVRBWzxmb250Pl1dPgotICAgICAgICAgdGFnIHdpdGggdGhlICJiZ2NvbG9yIiBhdHRyaWJ1dGUuIEJlY2F1c2UKLSAgICAgICAgICAgIDwhW0NEQVRBWzx4c2w6dmFsdWUtb2Y+XV0+Ci0gICAgICAgICBpcyBhbiBYTUwgdGFnIGl0IGlzIG5vdCB2YWxpZCB0byBpbnNlcnQgaXQgaW4gYW4gSFRNTCBhdHRyaWJ1dGUgdmFsdWUuIFNvIGFub3RoZXIgbWVjaGFuaXNtCi0gICAgICAgICBpcyBuZWVkZWQgdG8gaW5zZXJ0Ci0gICAgICAgICBpbmZvcm1hdGlvbiBmcm9tIG91ciBYTUwgZmlsZSB0aGVyZS4KLSAgICAgIDwvcGFyYT4KLSAgICAgIDxwcm9ncmFtbGlzdGluZz4KLTwhW0NEQVRBWwotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0gICAgICAgICAgICAgICAgdmVyc2lvbj0iMS4wIj4KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+Ci0gICAgPGh0bWw+Ci0gICAgICA8aGVhZD4KLSAgICAgICAgPHRpdGxlPldlbGNvbWU8L3RpdGxlPgotICAgICAgPC9oZWFkPgotICAgICAgPGJvZHk+Ci0gICAgICAgIDxmb250IGJnY29sb3I9InttZW1iZXIvZmF2b3JpdGVDb2xvcn0iPgotICAgICAgICAgIFdlbGNvbWUgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im1lbWJlci9uYW1lIi8+IQotICAgICAgICA8L2ZvbnQ+Ci0gICAgICA8L2JvZHk+Ci0gICAgPC9odG1sPgotICA8L3hzbDp0ZW1wbGF0ZT4KLTwveHNsOnN0eWxlc2hlZXQ+Ci1dXT4KLSAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+Ci0gICAgICA8cGFyYT4KLSAgICAgICAgIE5vdGljZSB0aGUgdXNlIG9mIHRoZSBjdXJseSBicmFja2V0cyAoInt9IikuIFdoZW4gdXNlZCB3aXRoaW4gYW4gYXR0cmlidXRlIGFzc2lnbm1lbnQgIntwYXRofSIgaGFzIHRoZSBleGFjdAotICAgICAgICAgc2FtZSBlZmZlY3QgYXMKLSAgICAgICAgIDwhW0NEQVRBWzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJwYXRoIiAvPl1dPgotICAgICAgICAgdXNlZCBvdXRzaWRlIG9mIGF0dHJpYnV0ZSBhc3NpZ25tZW50cy4KLSAgICAgIDwvcGFyYT4KLSAgIDwvc2VjdGlvbj4KLSAgIDxzZWN0aW9uPgotICAgICAgPHRpdGxlPlF1ZXJpZXM8L3RpdGxlPgotICAgICAgPHBhcmE+Ci0gICAgICAgICBOb3QgYWxsIHBhdGhzIGxlYWQgdG8gYSBzaW5nbGUgbm9kZS4gRm9yIGV4YW1wbGUsIHdoYXQgaWYgd2Ugd2FudGVkIHRvIHB1dCBhIHBlcnNvbuKAmXMgaG9tZSBwaG9uZSBudW1iZXIgb24gdGhlCi0gICAgICAgICBwYWdlPyBOb3RpY2UgdGhhdCB0aGUgWE1MIGRvY3VtZW50IGNvbnRhaW5zIHR3byBwaG9uZSBlbnRyaWVzLiBJZiB3ZSBzaW1wbHkgdXNlZAotICAgICAgICAgPCFbQ0RBVEFbPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im1lbWJlci9waG9uZSIgLz5dXT4KLSAgICAgICAgIGJvdGggZW50cmllcyB3b3VsZCBiZSByZXR1cm5lZC4gV2Ugb2J2aW91c2x5IG5lZWQgYSB3YXkgdG8gYmUgbW9yZSBzcGVjaWZpYy4gTHVja2lseSwgWFNMVCBhbGxvd3MgdGhlIGZ1bGwKLSAgICAgICAgIHBvd2VyIG9mIFhQYXRoIHRvIGRlc2NyaWJlIHRoZSB2YWx1ZShzKSBvZiBpbnRlcmVzdC4gWFBhdGggYWxsb3dzIGNvbmRpdGlvbnMgb24gYW55IGF0dHJpYnV0ZSBvciB0YWcgdG8gYmUKLSAgICAgICAgIHBsYWNlZCBpbiBzcXVhcmUgYnJhY2tldHMgKCJbXSIpIHdoaWNoIGFyZSB0aGVuIHVzZWQgdG8gcmVzdHJpY3QgdGhlIHZhbHVlcyByZXR1cm5lZC4KLSAgICAgIDwvcGFyYT4KLSAgICAgIDxwYXJhPgotICAgICAgICAgU28gdG8gcmV0cmlldmUgdGhlIGhvbWUgcGhvbmUgbnVtYmVyIHdlIHdvdWxkIHVzZSB0aGUgcGF0aCAibWVtYmVyL3Bob25lW0B0eXBlPeKAmWhvbWXigJldIi4gTm90aWNlIHRoZSAiQCIKLSAgICAgICAgIHN5bWJvbCBpbiBmcm9udAotICAgICAgICAgb2YgInR5cGUiLiBUaGUgIkAiIHN5bWJvbCBzaWduaWZpZXMgdGhhdCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGFuIGF0dHJpYnV0ZS4gU28gb3VyIG5ldyBIVE1MCi0gICAgICAgICB0ZW1wbGF0ZSBsb29rcyBsaWtlOgotICAgICAgPC9wYXJhPgotICAgICAgPHByb2dyYW1saXN0aW5nPgotPCFbQ0RBVEFbICAgICAgCi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLSAgICAgICAgICAgICAgICB2ZXJzaW9uPSIxLjAiPgotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KLSAgICA8aHRtbD4KLSAgICAgIDxoZWFkPgotICAgICAgICA8dGl0bGU+V2VsY29tZTwvdGl0bGU+Ci0gICAgICA8L2hlYWQ+Ci0gICAgICA8Ym9keT4KLSAgICAgICAgPGZvbnQgYmdjb2xvcj0ie21lbWJlci9mYXZvcml0ZUNvbG9yfSI+Ci0gICAgICAgICAgV2VsY29tZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ibWVtYmVyL25hbWUiLz4hCi0gICAgICAgICAgPGJyLz4KLSAgICAgICAgICBZb3VyIGhvbWUgcGhvbmUgbnVtYmVyIGlzOgotXV0+ICAgICAgICAgIDxlbXBoYXNpcyByb2xlPSJib2xkIj48IVtDREFUQVs8eHNsOnZhbHVlLW9mIHNlbGVjdD0ibWVtYmVyL3Bob25lW0B0eXBlPeKAmWhvbWXigJldIi8+XV0+PC9lbXBoYXNpcz4KLTwhW0NEQVRBWyAgICAgICAgPC9mb250PgotICAgICAgPC9ib2R5Ci0gICAgPC9odG1sCi0gIDwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KLV1dPgotICAgICAgPC9wcm9ncmFtbGlzdGluZz4KLSAgICAgIDxzZWN0aW9uPgotICAgICAgICAgPHRpdGxlPnhzbDpmb3ItZWFjaDwvdGl0bGU+Ci0gICAgICAgICA8cGFyYT4KLSAgICAgICAgICAgIFRoZSBwcmV2aW91cyBleGFtcGxlIGJyaW5ncyB1cCBhbm90aGVyIGlzc3VlLiBXaGF0IGlmIHRoaXMKLSAgICAgICAgICAgIDwhW0NEQVRBWzxtZW1iZXI+XV0+Ci0gICAgICAgICAgICBlbnRyeSBoYWQgbnVtZXJvdXMgcGhvbmUgbnVtYmVycyBhbmQgd2Ugd2FudGVkIHRvIHByaW50IHRoZW0gYWxsIG9uIHRoZSB3ZWIgcGFnZS4gV2UgY291bGQgc2ltcGx5IHVzZQotICAgICAgICAgICAgICAgPCFbQ0RBVEFbPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im1lbWJlci9waG9uZSIgLz5dXT4KLSAgICAgICAgICAgIGJ1dCB0aGlzIHdvdWxkIG5vdCBlbmFibGUgdXMgdG8gZm9ybWF0IHRoZSBwaG9uZSBudW1iZXIgaW50byBhIG5pY2UgbGlzdCB0aGF0IGRlc2NyaWJlcyB0aGUgdHlwZSBvZiBlYWNoCi0gICAgICAgICAgICBudW1iZXIuCi0gICAgICAgICA8L3BhcmE+Ci0gICAgICAgICA8cGFyYT4KLSAgICAgICAgICAgIFRvIGFjY29tcGxpc2ggdGhpcyByZXF1aXJlcyB0aGUgaW50cm9kdWN0aW9uIG9mIHRoZQotICAgICAgICAgICAgPCFbQ0RBVEFbPHhzbDpmb3ItZWFjaD5dXT4KLSAgICAgICAgICAgIHRhZyB3aGljaCBhbGxvd3MgdXMgdG8gbG9vcCB0aHJvdWdoIGVhY2ggb2YgdGhlIGVsZW1lbnRzIHRoYXQgbWF0Y2ggYSBnaXZlbiBwYXRoLiBTbyB0bwotICAgICAgICAgICAgY3JlYXRlIGEgdGFibGUgdGhhdAotICAgICAgICAgICAgY29udGFpbnMgdGhlIHBob25lIG51bWJlciB0eXBlIGluIHRoZSBmaXJzdCBjb2x1bW4gYW5kIHRoZSBwaG9uZSBudW1iZXIgaW4gdGhlIHNlY29uZAotICAgICAgICAgICAgY29sdW1uLCB0aGUgZm9sbG93aW5nCi0gICAgICAgICAgICBzdHlsZXNoZWV0IGNvdWxkIGJlIHVzZWQuCi0gICAgICAgICA8L3BhcmE+Ci0gICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+Ci08IVtDREFUQVsKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICAgICAgICAgICAgICAgIHZlcnNpb249IjEuMCI+Ci0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgotICAgIDxodG1sPgotICAgICAgPGhlYWQ+Ci0gICAgICAgIDx0aXRsZT5XZWxjb21lPC90aXRsZT4KLSAgICAgIDwvaGVhZD4KLSAgICAgIDxib2R5PgotICAgICAgICA8Zm9udCBiZ2NvbG9yPSJ7bWVtYmVyL2Zhdm9yaXRlQ29sb3J9Ij4KLSAgICAgICAgICBXZWxjb21lIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJtZW1iZXIvbmFtZSIvPiEKLSAgICAgICAgPC9mb250PgotICAgICAgICA8dGFibGU+Ci0gICAgICAgICAgPHRyPjx0aD5UeXBlPC90aD48dGg+TnVtYmVyPC90aD48L3RyPgotICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJtZW1iZXIvcGhvbmUiPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PC90ZD4KLSAgICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+PC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICA8L2JvZHk+Ci0gICAgPC9odG1sPgotICA8L3hzbDp0ZW1wbGF0ZT4KLTwveHNsOnN0eWxlc2hlZXQ+Ci1dXT4gICAgICAgICAKLSAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+Ci0gICAgICAgICA8cGFyYT4KLSAgICAgICAgICAgIFRoaXMgZXhhbXBsZSBicmluZ3MgdXAgYSBudW1iZXIgb2YgaXNzdWVzLiBGaXJzdCwgd2hpbGUgaW4gdGhlIGxvb3AsIGFsbAotICAgICAgICAgICAgPCFbQ0RBVEFbPHhzbDp2YWx1ZS1vZiAvPl1dPgotICAgICAgICAgICAgYWNjZXNzZXMgYXJlIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGVsZW1lbnQgYmVpbmcgaXRlcmF0ZWQgb3ZlciAoaW4gdGhpcyBjYXNlCi0gICAgICAgICAgICA8IVtDREFUQVs8cGhvbmU+KV1dPi4KLSAgICAgICAgICAgIE5vdGljZSB0aGUgdXNlIG9mIHRoZSBwZXJpb2QgKCIuIiksIHdoaWNoIGxpa2UgaW4gYSBVbml4IGZpbGUgc3lzdGVtIG1lYW5zIHRoZSBjdXJyZW50IGVsZW1lbnQuCi0gICAgICAgICAgICBTbyBpbiB0aGlzCi0gICAgICAgICAgICBjYXNlIHRoZSBwZXJpb2QgKCIuIikgcmVmZXJzIHRvIGVhY2ggcGhvbmUgZWxlbWVudCBhcyB0aGUgbG9vcCBpdGVyYXRlcy4gQWxzbyBsaWtlIGluIGEgZmlsZQotICAgICAgICAgICAgc3lzdGVtIHlvdSBjYW4KLSAgICAgICAgICAgIGFkZHJlc3MgYSBwYXJlbnQgZWxlbWVudCB1c2luZyBhIGRvdWJsZSBwZXJpb2QgKCIuLiIpIGFuZCBjYW4gYWNjZXNzIGFueSBlbGVtZW50IGluIHRoZQotICAgICAgICAgICAgZG9jdW1lbnQgYnkgc3RhcnRpbmcKLSAgICAgICAgICAgIG92ZXIgYXQgdGhlIHJvb3QgZWxlbWVudCB1c2luZyBhIHNsYXNoICgiLyIpLgotICAgICAgICAgPC9wYXJhPgotICAgICAgPC9zZWN0aW9uPgotICAgICAgPHNlY3Rpb24+Ci0gICAgICAgICA8dGl0bGU+eHNsOmlmPC90aXRsZT4KLSAgICAgICAgIDxwYXJhPgotICAgICAgICAgICAgQXMgYSBsYXN0IGVuaGFuY2VtZW50IHRvIG91ciBwYWdlIGxldOKAmXMgYWRkIGEgc3BlY2lhbCBvZmZlciB0byAicGxhdGludW0iIGxldmVsIG1lbWJlcnMuIFRvIGRvIHRoaXMgcmVxdWlyZXMKLSAgICAgICAgICAgIHRoZSB1c2Ugb2YgYSBuZXcgdGFnCi0gICAgICAgICAgICA8IVtDREFUQVs8eHNsOmlmPl1dPgotICAgICAgICAgICAgd2hpY2ggYWxsb3dzIHVzIHRvIGluc2VydCBjb250ZW50IGJhc2VkIG9uIGEgY29uZGl0aW9uIG9mIHRoZSBkYXRhIGluIHRoZSBYTUwgZG9jdW1lbnQuCi0gICAgICAgICA8L3BhcmE+Ci0gICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+Ci08IVtDREFUQVsKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICAgICAgICAgICAgICAgIHZlcnNpb249IjEuMCI+Ci0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgotICAgIDxodG1sPgotICAgICAgPGhlYWQ+Ci0gICAgICAgIDx0aXRsZT5XZWxjb21lPC90aXRsZT4KLSAgICAgIDwvaGVhZD4KLSAgICAgIDxib2R5PgotICAgICAgICA8Zm9udCBiZ2NvbG9yPSJ7bWVtYmVyL2Zhdm9yaXRlQ29sb3J9Ij4KLSAgICAgICAgICBXZWxjb21lIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJtZW1iZXIvbmFtZSIvPiEKLSAgICAgICAgPC9mb250PgotICAgICAgICA8eHNsOmlmIHRlc3Q9Im1lbWJlcltAbGV2ZWw9J3BsYXRpbnVtJ10iPgotICAgICAgICAgIE91ciBzcGVjaWFsIG9mZmVyIHRvIHBsYXRpbnVtIG1lbWJlcnMgdG9kYXkgaXMgc29tZXRoaW5nIGdyZWF0Ci0gICAgICAgIDwveHNsOmlmPgotICAgICAgICA8dGFibGU+Ci0gICAgICAgICAgPHRyPjx0aD5UeXBlPC90aD48dGg+TnVtYmVyPC90aD48L3RyPgotICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJtZW1iZXIvcGhvbmUiPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PC90ZD4KLSAgICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+PC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICA8L2JvZHk+Ci0gICAgPC9odG1sPgotICA8L3hzbDp0ZW1wbGF0ZT4KLTwveHNsOnN0eWxlc2hlZXQ+Ci1dXT4gICAgICAgICAKLSAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+Ci0gICAgICAgICA8cGFyYT4KLSAgICAgICAgICAgIFdpdGhpbiB0aGUgInRlc3QiIGF0dHJpYnV0ZSB0aGUgZnVsbCBhcnJheSBvZiBCb29sZWFuIGFuZCByZWxhdGl2ZSBvcGVyYXRvcnMgYXJlIGF2YWlsYWJsZS4gVGhlIG9ubHkgY2F2ZWF0Ci0gICAgICAgICAgICBpcyB0aGF0IHNpbmNlIHRoaXMgaXMgYW4gWE1MIGRvY3VtZW50IGxlc3MgdGhhbiBhbmQgZ3JlYXRlciB0aGFuICg8IVtDREFUQVsiPCJdXT4sCi0gICAgICAgICAgICAiPiIpIHNpZ25zIG11c3QgYmUgZXNjYXBlZCBhcyA8IVtDREFUQVsiJmx0OyIgYW5kICImZ3Q7Il1dPi4KLSAgICAgICAgIDwvcGFyYT4KLSAgICAgIDwvc2VjdGlvbj4KLSAgICAgIDxzZWN0aW9uPgotICAgICAgICAgPHRpdGxlPnhzbDpjaG9vc2U8L3RpdGxlPgotICAgICAgICAgPHBhcmE+Ci0gICAgICAgICAgICBPbmUgbnVhbmNlIG9mIHRoZQotICAgICAgICAgICAgPCFbQ0RBVEFbPHhzbDppZj5dXT4KLSAgICAgICAgICAgIHRhZyB0aGF0IGlzIG5vdCBhbHdheXMgb2J2aW91cyBhdCBmaXJzdCBnbGFuY2UgaXMgdGhlIGxhY2sgb2YgYW4gImVsc2UiIHN0YXRlbWVudC4gVGhpcyBtZWFucyB0byBoYXZlIGFuCi0gICAgICAgICAgICBlbHNlIHN0YXRlbWVudCByZXF1aXJlcyB0d28gaWZzLiBUaGUgZmlyc3Qgb25lIHNheWluZyAiaWYgY29uZGl0aW9uIiBhbmQgdGhlIHNlY29uZCBvbmUgc2F5aW5nIOKAnGlmIG5vdAotICAgICAgICAgICAgY29uZGl0aW9u4oCdLiBUaGlzIHNjaGVtZSBxdWlja2x5IGJlY29tZXMgdW53b3JrYWJsZSB3aXRoIGVtYmVkZGVkIGlmIHRoZW4gZWxzZSBsb2dpYy4gTHVja2lseSBYU0xUCi0gICAgICAgICAgICBzdXBwb3J0cyBhbgotICAgICAgICAgICAgYWRkaXRpb25hbCB0ZXN0IG9wZXJhdG9yIGNhbGxlZAotICAgICAgICAgICAgPCFbQ0RBVEFbPHhzbDpjaG9vc2U+XV0+Ci0gICAgICAgICAgICB3aGljaCB3b3JrcyBsaWtlIGEgc3dpdGNoL2Nhc2Ugc3RhdGVtZW50LgotICAgICAgICAgPC9wYXJhPgotICAgICAgICAgPHByb2dyYW1saXN0aW5nPgotPCFbQ0RBVEFbCi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLSAgICAgICAgICAgICAgICB2ZXJzaW9uPSIxLjAiPgotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KLSAgICA8aHRtbD4KLSAgICAgIDxoZWFkPgotICAgICAgICA8dGl0bGU+V2VsY29tZTwvdGl0bGU+Ci0gICAgICA8L2hlYWQ+Ci0gICAgICA8Ym9keT4KLSAgICAgICAgPGZvbnQgYmdjb2xvcj0ie21lbWJlci9mYXZvcml0ZUNvbG9yfSI+Ci0gICAgICAgICAgV2VsY29tZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ibWVtYmVyL25hbWUiLz4hCi0gICAgICAgIDwvZm9udD4KLSAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9Im1lbWJlcltAbGV2ZWw9J3BsYXRpbnVtJ10iPgotICAgICAgICAgICAgT3VyIHNwZWNpYWwgb2ZmZXIgdG8gcGxhdGludW0gbWVtYmVycyB0b2RheSBpcyBzb21ldGhpbmcgZ3JlYXQKLSAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgQmVjb21lIGEgcGxhdGludW0gbWVtYmVyIHRvZGF5IQotICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICA8dGFibGU+Ci0gICAgICAgICAgPHRyPjx0aD5UeXBlPC90aD48dGg+TnVtYmVyPC90aD48L3RyPgotICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJtZW1iZXIvcGhvbmUiPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PC90ZD4KLSAgICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+PC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICA8L2JvZHk+Ci0gICAgPC9odG1sPgotICA8L3hzbDp0ZW1wbGF0ZT4KLTwveHNsOnN0eWxlc2hlZXQ+Ci1dXT4gICAgICAgICAKLSAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+Ci0gICAgICAgICA8cGFyYT4KLSAgICAgICAgICAgIFRoZSDigJx0ZXN04oCdIGF0dHJpYnV0ZSBoYXMgdGhlIHNhbWUgY2FwYWJpbGl0aWVzLyBjb25zdHJhaW50cyBhcyB0aGUg4oCcdGVzdOKAnSBhdHRyaWJ1dGUgaW4gdGhlCi0gICAgICAgICAgICA8IVtDREFUQVs8eHNsOmlmPl1dPgotICAgICAgICAgICAgdGFnLiBNdWx0aXBsZQotICAgICAgICAgICAgPCFbQ0RBVEFbPHhzbDp3aGVuPl1dPgotICAgICAgICAgICAgYmxvY2tzIGFyZSBhbGxvd2VkLiBBcyBzb29uIGFzIG9uZSDigJx3aGVuIHRlc3TigJ0gaXMgbWFjaGVkLCBpdCB3aWxsIG5vdCBldmFsdWF0ZSBhbnkgZnVydGhlciDigJx4c2w6d2hlbgotICAgICAgICAgICAgdGVzdHPigJ0KLSAgICAgICAgICAgIGluIHRoZQotICAgICAgICAgICAgPCFbQ0RBVEFbPHhzbDpjaG9vc2U+XV0+Ci0gICAgICAgICAgICBibG9jay4KLSAgICAgICAgIDwvcGFyYT4KLSAgICAgIDwvc2VjdGlvbj4KLSAgIDwvc2VjdGlvbj4KLSAgIDxzZWN0aW9uPgotICAgICAgPHRpdGxlPkNvbmNsdXNpb248L3RpdGxlPgotICAgICAgPHBhcmE+Ci0gICAgICAgICBXaXRoIGp1c3QgdGhlc2UgZmV3IGNvbW1hbmRzIChhbiBhZG1pdHRlZGx5IHNtYWxsIHN1YnNldCBvZiBYU0xUKSBhbmQgYSBzdHJvbmcgYmFja2dyb3VuZCBpbiBIVE1MIChESFRNTCBhbmQKLSAgICAgICAgIEphdmFTY3JpcHQKLSAgICAgICAgIGluY2x1ZGVkKSwgSSBiZWxpZXZlIHdlYiBkZXZlbG9wZXJzIGNvdWxkIG1lZXQgdGhlIG1ham9yaXR5IG9mIHRoZWlyIHByZXNlbnRhdGlvbiBuZWVkcy4gT2J2aW91c2x5Ci0gICAgICAgICB0aGVyZSB3aWxsCi0gICAgICAgICBiZSBjYXNlcyB3aGVyZSBncmVhdGVyIGZsZXhpYmlsaXR5IGlzIHJlcXVpcmVkLCBidXQgdGhlIGFkdmFudGFnZSBvZiB0aGlzIHRlY2huaXF1ZSBpcyB0aGF0IG9ubHkKLSAgICAgICAgIHRoZW4sIGRvZXMgdGhlCi0gICAgICAgICBkZXZlbG9wZXIgbmVlZCB0byBsZWFybiB0aG9zZSBjb25zdHJ1Y3RzLiAgICAgICAgIAotICAgICAgPC9wYXJhPgotICAgICAgPHBhcmE+Ci0gICAgICAgICBBcyBhIGZ1cnRoZXIgYmVuZWZpdCwgdGhpcyB0ZWNobmlxdWUgbWluaW1pemVkIHRoZSBpbnRlcmRlcGVuZGVuY2Ugb2Ygb25lIFhMU1QgY29uc3RydWN0IG9uIGFub3RoZXIuIExvY2FsCi0gICAgICAgICBjaGFuZ2VzIHN0YXkKLSAgICAgICAgIGxvY2FsIHRoZXJlYnkgcmVkdWNpbmcgdGhlIGJyaXR0bGVuZXNzIG9mIHNvbHV0aW9ucy4gVGhlIGRldmVsb3BlciBhbHNvIG5vIGxvbmdlciBoYXMgdG8gcmVtZW1iZXIKLSAgICAgICAgIGFuZCBhY2NvdW50Ci0gICAgICAgICBmb3IgWFNMVOKAmXMgZGVmYXVsdCBiZWhhdmlvcnMuICAgICAgICAgCi0gICAgICA8L3BhcmE+Ci0gICAgICA8cGFyYT4KLSAgICAgICAgIEkgaG9wZSBmcm9tIHRoZXNlIGZldyBleGFtcGxlcywgSSBoYXZlIG9wZW5lZCBhIGZldyBleWVzIHRvIHRoZSBwb3dlciBvZiBYU0xUIGFuZCBob3cgYSBzbWFsbCBjaGFuZ2UgaW4gaG93Ci0gICAgICAgICBYU0xUIGlzIGZyYW1lZCBjYW4gbWFrZSBhIGh1Z2UgZGlmZmVyZW5jZSBpbiBpdHMgdW5kZXJzdGFuZGFiaWxpdHkgYW5kIGFjY2Vzc2liaWxpdHkgdG8gd2ViIGRldmVsb3BlcnMuIElmCi0gICAgICAgICBub3RoaW5nIGVsc2UsIEkgaG9wZSB0byBlbmNvdXJhZ2Ugc29tZSBnb29kIGRpc2N1c3Npb25zLiAKLSAgICAgIDwvcGFyYT4KLSAgIDwvc2VjdGlvbj4KLTwvc2VjdGlvbj4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvZG9jYm9vay9jb25jZXB0cy9jb25jZXB0cy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2RvY2Jvb2svY29uY2VwdHMvY29uY2VwdHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDJhNjdhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvZG9jYm9vay9jb25jZXB0cy9jb25jZXB0cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGNoYXB0ZXIgUFVCTElDICItLy9PQVNJUy8vRFREIERvY0Jvb2sgWE1MIFY0LjUvL0VOIgotICAgICAgICAgICJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2RvY2Jvb2sveG1sLzQuNS9kb2Nib29reC5kdGQiPgotPGNoYXB0ZXI+Ci0gICA8P2RiaHRtbCBmaWxlbmFtZT0iY29uY2VwdHMvY29uY2VwdHMuaHRtbCIgPz4KLSAgIDx0aXRsZT5YU0xUIENvbmNlcHRzPC90aXRsZT4KLSAgIDxwYXJhPgotICAgICAgICAgCi0gICA8L3BhcmE+Ci0gICA8eGk6aW5jbHVkZSB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIgaHJlZj0iUmVzY3VpbmdYU0xUZnJvbU5pY2hlU3RhdHVzLnhtbCIvPgotICAgPHNlY3Rpb24gaWQ9ImNvbmNlcHRzX1Jlc291cmNlcyI+Ci0gICAgICA8P2RiaHRtbCBmaWxlbmFtZT0iY29uY2VwdHMvcmVzb3VyY2VzLmh0bWwiID8+Ci0gICAgICA8dGl0bGU+UmVzb3VyY2VzPC90aXRsZT4KLSAgICAgIDxpdGVtaXplZGxpc3Q+Ci0gICAgICAgICA8bGlzdGl0ZW0+Ci0gICAgICAgICAgICA8cGFyYT4KLSAgICAgICAgICAgICAgIDx1bGluayB1cmw9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPlhTTFQgMS4wIFNwZWNpZmljYXRpb248L3VsaW5rPiAtIFRoZSBvZmZpY2lhbCBXM0MgWFNMVCAxLjAgU3BlY2lmaWNhdGlvbi4KLSAgICAgICAgICAgIDwvcGFyYT4KLSAgICAgICAgIDwvbGlzdGl0ZW0+Ci0gICAgICAgICA8bGlzdGl0ZW0+Ci0gICAgICAgICAgICA8cGFyYT4KLSAgICAgICAgICAgICAgIDx1bGluayB1cmw9Imh0dHA6Ly93d3cuZHBhd3Nvbi5jby51ay94c2wvaW5kZXguaHRtbCI+WFNMVCBGQVE8L3VsaW5rPiAtIG1haW50YWluZWQgYnkgRGF2ZSBQYXdzb24uCi0gICAgICAgICAgICA8L3BhcmE+Ci0gICAgICAgICA8L2xpc3RpdGVtPgotICAgICAgICAgPGxpc3RpdGVtPgotICAgICAgICAgICAgPHBhcmE+PHVsaW5rIHVybD0iaHR0cDovL3d3dy54ZnJvbnQuY29tL3Jlc2N1aW5nLXhzbHQuaHRtbCI+UmVzY3VpbmcgWFNMVCBmcm9tIE5pY2hlIFN0YXR1czwvdWxpbms+IC0gYnkgRGF2aWQgSmFjb2JzLjwvcGFyYT4KLSAgICAgICAgIDwvbGlzdGl0ZW0+Ci0gICAgICAgICA8bGlzdGl0ZW0+Ci0gICAgICAgICAgICA8cGFyYT48dWxpbmsgdXJsPSJodHRwOi8vd3d3LnhtbC5jb20vcHViL2EvMjAwMy8xMS8yNi9sZWFyblhTTFQuaHRtbCI+Rml2ZSBYU0xUIEJhc2ljczwvdWxpbms+IC0gYnkgTWljaGFlbCBGaXR6Z2VyYWxkIGF1dGhvciBvZiBMZWFybmluZyBYU0xULjwvcGFyYT4KLSAgICAgICAgIDwvbGlzdGl0ZW0+Ci0gICAgICAgICA8bGlzdGl0ZW0+Ci0gICAgICAgICAgICA8cGFyYT48dWxpbmsgdXJsPSJodHRwOi8vd3d3Lnhmcm9udC5jb20vZmlsZXMvdHV0b3JpYWxzLmh0bWwiPlhGcm9udCBUdXRvcmlhbHM8L3VsaW5rPiAtIHByb3ZpZGVzIHNldmVyYWwgdHV0b3JpYWxzIGluY2x1ZGUgWFNMVCAxLjAuPC9wYXJhPgotICAgICAgICAgPC9saXN0aXRlbT4KLSAgICAgICAgIDxsaXN0aXRlbT4KLSAgICAgICAgICAgIDxwYXJhPjx1bGluayB1cmw9Imh0dHA6Ly93d3cuY2FmZWNvbmxlY2hlLm9yZy9ib29rcy9iaWJsZTIvY2hhcHRlcnMvY2gxNy5odG1sIj5YU0wgVHJhbnNmb3JtYXRpb25zPC91bGluaz4gLSBDaGFwdGVyIDE3IG9mIHRoZSBYTUwgQmlibGUgMm5kIEVkaXRpb24uPC9wYXJhPgotICAgICAgICAgPC9saXN0aXRlbT4KLSAgICAgIDwvaXRlbWl6ZWRsaXN0PgotICAgPC9zZWN0aW9uPgotICAgCi08L2NoYXB0ZXI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9kb2Nib29rL2NvbmNlcHRzL2dldHRpbmdzdGFydGVkLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvZG9jYm9vay9jb25jZXB0cy9nZXR0aW5nc3RhcnRlZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhM2Y0MWQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9kb2Nib29rL2NvbmNlcHRzL2dldHRpbmdzdGFydGVkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgY2hhcHRlciBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRG9jQm9vayBYTUwgVjQuNS8vRU4iCi0gICAgICAgICAgImh0dHA6Ly93d3cub2FzaXMtb3Blbi5vcmcvZG9jYm9vay94bWwvNC41L2RvY2Jvb2t4LmR0ZCI+Ci08Y2hhcHRlcj4KLSAgIDw/ZGJodG1sIGZpbGVuYW1lPSJpbnRyb2R1Y3Rpb24vZ2V0dGluZ3N0YXJ0ZWQuaHRtbCIgPz4KLSAgIDx0aXRsZT5HZXR0aW5nIFN0YXJ0ZWQ8L3RpdGxlPgotICAgPHBhcmE+ICAKLSAgICAgIFN0aWxsIHRyeWluZyB0byB0aGluayBvZiBvcmlnaW5hbCBjb250ZW50IGZvciB0aGlzIHNlY3Rpb24uCi0gICA8L3BhcmE+Ci08L2NoYXB0ZXI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9kb2Nib29rL2VkaXRvci9lZGl0b3IueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9kb2Nib29rL2VkaXRvci9lZGl0b3IueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTI4YWJkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvZG9jYm9vay9lZGl0b3IvZWRpdG9yLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhRE9DVFlQRSBjaGFwdGVyIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBEb2NCb29rIFhNTCBWNC41Ly9FTiIKLSAgICJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2RvY2Jvb2sveG1sLzQuNS9kb2Nib29reC5kdGQiPgotPGNoYXB0ZXI+Ci0JPD9kYmh0bWwgZmlsZW5hbWU9ImVkaXRvci94c2xlZGl0b3IuaHRtbCIgPz4KLSAgICA8dGl0bGU+WFNMIEVkaXRpbmc8L3RpdGxlPgotICAgIDxwYXJhPlRoZSBYU0wgVG9vbHMgcGx1Z2lucyBleHRlbmQgdGhlIGFiaWxpdHkgb2YgdGhlIFdlYiBTdGFuZGFyZCBUb29scyBYTUwKLSAgICAgICAgZWRpdG9yLiBUaGlzIGV4dGVuc2lvbiBhZGRzIHNwZWNpZmljIHN1cHBvcnQgYW5kIGZ1bmN0aW9uYWxpdHkgZm9yIHdvcmtpbmcgd2l0aAotICAgICAgICBhbmQgZGVidWdnaW5nIFhTTCBmaWxlcy48L3BhcmE+Ci0gICAgPHNlY3Rpb24gaWQ9IlZhbGlkYXRpb24iPgotICA8P2RiaHRtbCBmaWxlbmFtZT0iZWRpdG9yL3hzbGVkaXRvcl92YWxpZGF0aW9uLmh0bWwiID8+Ci0gICAgICAgIDx0aXRsZT5WYWxpZGF0aW9uPC90aXRsZT4KLSAgICAgICAgPHBhcmE+VGhlIFhTTCBleHRlbnNpb25zIGZvciB0aGUgZWNsaXBzZSBYTUwgZWRpdG9yIGluY2x1ZGUgYXMgeW91IHR5cGUKLSAgICAgICAgICAgIHZhbGlkYXRpb24gZm9yIFhTTCBzcGVjaWZpYyBmZWF0dXJlcy4gVGhpcyBpbmNsdWRlcyBub3Qgb25seSB0aGUgYWJpbGl0eSB0bwotICAgICAgICAgICAgc3ludGF4IGNoZWNrIHRoZSBncmFtbWFyLCBidXQgdG8gYWxzbyB0byB2YWxpZGF0ZSBzcGVjaWZpYyBYU0wgc3BlY2lmaWNhdGlvbgotICAgICAgICAgICAgcnVsZXMuIEdyYW1tYXIgdmFsaWRhdGlvbiB3aWxsIGJlIHRyaWdnZXJlZCBiYXNlZCBvbiB0aGUgdmVyc2lvbiBhdHRyaWJ1dGUgZm9yCi0gICAgICAgICAgICB0aGUgc3R5bGUgc2hlZXQgdGhhdCBpcyBiZWluZyBlZGl0ZWQuIFZhbGlkIHZlcnNpb24gbnVtYmVycyBhcmUgMS4wLCBhbmQgMi4wLgotICAgICAgICA8L3BhcmE+Ci0gICAgPC9zZWN0aW9uPgotICAgIDxzZWN0aW9uIGlkPSJDb250ZW50QXNzaXN0Ij4KLTw/ZGJodG1sIGZpbGVuYW1lPSJlZGl0b3IveHNsZWRpdG9yX2NvbnRlbnRhc3Npc3QuaHRtbCIgPz4KLSAgICAgICAgPHRpdGxlPkNvbnRlbnQgQXNzaXN0PC90aXRsZT4KLSAgICAgICAgPHBhcmE+Ci0gICAgICAgICAgICBYU0wgVG9vbHMgZXh0ZW5kcyB0aGUgZXhpc3RpbmcgY29udGVudCBhc3Npc3RhbmNlIHN1cHBvcnQgb2YgdGhlIFhNTCBFZGl0b3IgdG8KLSAgICAgICAgICAgIHByb3ZpZGUgY29udGVudCBhc3Npc3RhbmNlIGZvciBzZXZlcmFsIFhTTCBuYW1lc3BhY2UgYXR0cmlidXRlcy4gVGhlIGNvbnRlbnQKLSAgICAgICAgICAgIGFzc2lzdGFuY2UgcHJvdmlkZWQgY292ZXJzIHRoZSBhdmFpbGFibGUgWFBhdGggc3RhdGVtZW50cyBhcyBkZWZpbmVkIGluIHRoZQotICAgICAgICAgICAgPGVtcGhhc2lzPlhQYXRoIFRlbXBsYXRlczwvZW1waGFzaXM+Ci0gICAgICAgICAgICBwcmVmZXJlbmNlIHBhZ2UuCi0gICAgICAgIDwvcGFyYT4KLSAgICAgICAgPGltcG9ydGFudD4KLSAgICAgICAgICAgIDx0aXRsZT5YUGF0aCAyLjAgU3VwcG9ydDwvdGl0bGU+Ci0gICAgICAgICAgICA8cGFyYT5DdXJyZW50bHkgWFBhdGggMi4wIGlzIG5vdCBzdXBwb3J0ZWQgZGlyZWN0bHkuIEhvd2V2ZXIsIGEgdXNlcgotICAgICAgICAgICAgICAgIGNhbiBhZGQgdGhpcyBzdXBwb3J0IGlmIHRoZXkgbmVlZCBpdCBieSBhZGRpbmcgdGhlIG1pc3NpbmcgWFBhdGggZnVuY3Rpb25zCi0gICAgICAgICAgICAgICAgdG8gdGhlIFhQYXRoIFRlbXBsYXRlcy48L3BhcmE+Ci0gICAgICAgIDwvaW1wb3J0YW50PgotICAgICAgICA8cGFyYT5UbyBpbml0aWF0ZSBjb250ZW50IGFzc2lzdGFuY2UgcHJlc3MgQ1RSTCArIFNQQUNFIG9yIENNRCArIFNQQUNFLiBUaGlzCi0gICAgICAgICAgICB3aWxsIGJyaW5nIHVwIGEgZGlhbG9nIHRoYXQgd2lsbCBjb250YWluIGFueSBwcm9wb3NhbHMgdGhhdCBhcmUgYXZhaWxhYmxlLiBJZgotICAgICAgICAgICAgbm8gcHJvcG9zYWxzIGFyZSBhdmFpbGFibGUgYW4gbWVzc2FnZSB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgc3RhdHVzIGJhci4KLSAgICAgICAgPC9wYXJhPgotICAgICAgICA8c2VjdGlvbiBpZD0iZWRfWFNMUHJvcG9zYWxzIj4KLTw/ZGJodG1sIGZpbGVuYW1lPSJlZGl0b3IveHNsZWRpdG9yX2NvbnRlbnRhc3Npc3RfeHNsLmh0bWwiID8+Ci0gICAgICAgIAotICAgICAgICAgICAgPHRpdGxlPlhTTFQgRWxlbWVudCBQcm9wb3NhbHM8L3RpdGxlPgotICAgICAgICAgICAgPHBhcmE+Ci0gICAgICAgICAgICAgICAgU2luY2UgWFNMVCBpcyBhIHRlbXBsYXRpbmcgbGFuZ3VhZ2UsIGl0J3MgZWxlbWVudHMgbXVzdCBiZSBhYmxlIHRvIGJlCi0gICAgICAgICAgICAgICAgYWRkZWQgdG8gdGhlIHZhcmlvdXMgbWFya3VwIGl0IGluY2x1ZGVzLiBUaGUgWFNMVCBFZGl0b3Igd2lsbCBwcm92aWRlCi0gICAgICAgICAgICAgICAgY29udGVudCBhc3Npc3RhbmNlIGFuZCBwcm9wb3NhbHMgZm9yIFhTTFQgZWxlbWVudHMgdGhhdCBhcmUgYXZhaWxhYmxlIHRvCi0gICAgICAgICAgICAgICAgYmUgdXNlZCB3aXRoaW4gbm9uLVhTTFQgbmFtZXNwYWNlZCBlbGVtZW50cy4gVGhpcyBpcyBkZXBpY3RlZCBpbgotICAgICAgICAgICAgICAgIDx4cmVmIGxpbmtlbmQ9ImZpZ19YU0xQcm9wb3NhbHMiLz4KLSAgICAgICAgICAgICAgICAuCi0gICAgICAgICAgICA8L3BhcmE+Ci0gICAgICAgICAgICA8ZmlndXJlIGlkPSJmaWdfWFNMUHJvcG9zYWxzIj4KLSAgICAgICAgICAgICAgICA8dGl0bGU+WFNMVCBQcm9wb3NhbHMgd2l0aGluIE5vbi1YU0xUIGVsZW1lbnRzPC90aXRsZT4KLSAgICAgICAgICAgICAgICA8bWVkaWFvYmplY3Q+Ci0gICAgICAgICAgICAgICAgICAgIDxpbWFnZW9iamVjdD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbWFnZWRhdGEgYWxpZ249ImNlbnRlciIgZmlsZXJlZj0iLi4vaW1hZ2VzL2VkaXRvci94c2xwcm9wb3NhbHMucG5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvaW1hZ2VvYmplY3Q+Ci0gICAgICAgICAgICAgICAgPC9tZWRpYW9iamVjdD4KLSAgICAgICAgICAgIDwvZmlndXJlPgotICAgICAgICA8L3NlY3Rpb24+Ci0gICAgICAgIDxzZWN0aW9uIGlkPSJTZWxlY3RUZXN0Ij4KLTw/ZGJodG1sIGZpbGVuYW1lPSJlZGl0b3IveHNsZWRpdG9yX2NvbnRlbnRhc3Npc3Rfc2VsZWN0dGVzdC5odG1sIiA/PgotICAgICAgICAgICAgPHRpdGxlPlNlbGVjdCwgVGVzdCwgYW5kIE1hdGNoIEF0dHJpYnV0ZXM8L3RpdGxlPgotICAgICAgICAgICAgPHBhcmE+Ci0gICAgICAgICAgICAgICAgV2hlcmUgZXZlciBhbiB4c2wgZWxlbWVudCBzdXBwb3J0cyBhCi0gICAgICAgICAgICAgICAgPGVtcGhhc2lzPnNlbGVjdDwvZW1waGFzaXM+Ci0gICAgICAgICAgICAgICAgLAotICAgICAgICAgICAgICAgIDxlbXBoYXNpcz50ZXN0PC9lbXBoYXNpcz4KLSAgICAgICAgICAgICAgICAsIG9yCi0gICAgICAgICAgICAgICAgPGVtcGhhc2lzPm1hdGNoPC9lbXBoYXNpcz4KLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGUsIGNvbnRlbnQgYXNzaXN0YW5jZSBpcyBhdmFpbGFibGUuIFRoaXMgaW5jbHVkZXMgc3VwcG9ydCBmb3IgdGhlCi0gICAgICAgICAgICAgICAgZm9sbG93aW5nOgotICAgICAgICAgICAgPC9wYXJhPgotICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KLSAgICAgICAgICAgICAgICA8dGl0bGU+U2VsZWN0LCBNYXRjaCBhbmQgVGVzdCBBc3Npc3RhbmNlPC90aXRsZT4KLSAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgIDxwYXJhPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzPlZhcmlhYmxlczwvZW1waGFzaXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAtIGJvdGggbG9jYWwgYW5kIGdsb2JhbCB2YXJpYWJsZXMgYXJlIHN1cHBvcnRlZCB3aXRoaW4gdGhlIGN1cnJlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlc2hlZXQuIEFueSBsb2NhbCBvciBnbG9iYWwgdmFyaWFibGUgd2lsbCBiZSBhZGRlZCB0byB0aGUgbGlzdAotICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZSBuYW1lIGlzIHByZWZpeGVkIHdpdGggYSBkb2xsYXIgc2lnbiAkIHN5bWJvbC4KLSAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgotICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+Ci0gICAgICAgICAgICAgICAgPGxpc3RpdGVtPgotICAgICAgICAgICAgICAgICAgICA8cGFyYT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcz5YUGF0aCAxLjA8L2VtcGhhc2lzPgotICAgICAgICAgICAgICAgICAgICAgICAgLSBYUGF0aCAxLjAgaXMgc3VwcG9ydGVkIHRocm91Z2ggdGhlIHVzZSBvZiB0ZW1wbGF0ZXMuIEFsbCBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIFhQYXRoIDEuMCBhbmQgWFNMVCB4cGF0aCBleHRlbnNpb24gZnVuY3Rpb25zIGFyZSBhdmFpbGFibGUsIGFzCi0gICAgICAgICAgICAgICAgICAgICAgICB3ZWxsIGFzCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZW1waGFzaXM+YXhpczwvZW1waGFzaXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25zLiBDdXJyZW50bHkgWFBhdGggMi4wIGlzIG5vdCBzdXBwb3J0ZWQgZGlyZWN0bHksIGJ1dAotICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBhZGRlZCBpbiB0aGUgZnV0dXJlLgotICAgICAgICAgICAgICAgICAgICA8L3BhcmE+Ci0gICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KLSAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgotICAgICAgICAgICAgPHBhcmE+Q29udGVudCBhc3Npc3RhbmNlIGZvciB0aGUgc2VsZWN0IGFuZCB0ZXN0IGF0dHJpYnV0ZXMgaXMKLSAgICAgICAgICAgICAgICBpbnRlbGxpZ2VudCBlbm91Z2ggdG8ga25vdyB0aGF0IGl0IGlzIHdpdGhpbiBhbiBYUGF0aCBleHByZXNzaW9uLCBhbmQgd2lsbAotICAgICAgICAgICAgICAgIHRyeSB0byBkZXRlcm1pbmUgYW5kIHByb3ZpZGUgY29udGVudCBhc3Npc3RhbmNlIGJhc2VkIG9uIHRoZSBjdXJyZW50Ci0gICAgICAgICAgICAgICAgY3Vyc29yIHBvc2l0aW9uLiBJZiBhIHdvcmQgaGFzIGJlZW4gcGFydGlhbGx5IHR5cGVkIGl0IHdpbGwgZmlsdGVyIHRoZQotICAgICAgICAgICAgICAgIGF2YWlsYWJsZSBhc3Npc3RhbmNlLjwvcGFyYT4KLSAgICAgICAgPC9zZWN0aW9uPgotICAgICAgICA8c2VjdGlvbiBpZD0iRXhjbHVkZVJlc3VsdFByZWZpeGVzQ29udGVudEFzc2lzdCI+Ci08P2RiaHRtbCBmaWxlbmFtZT0iZWRpdG9yL3hzbGVkaXRvcl9jb250ZW50YXNzaXN0X2V4Y2x1ZGUuaHRtbCIgPz4KLSAgICAgICAgCi0gICAgICAgICAgICA8dGl0bGU+RXhjbHVkZS1SZXN1bHQtUHJlZml4ZXM8L3RpdGxlPgotICAgICAgICAgICAgPHBhcmE+Ci0gICAgICAgICAgICAgICAgVGhlCi0gICAgICAgICAgICAgICAgPGVtcGhhc2lzPmV4Y2x1ZGUtcmVzdWx0LXByZWZpeGVzPC9lbXBoYXNpcz4KLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgaW4gYm90aCBYU0xUIDEuMCBhbmQgWFNMVCAyLjAgYWxsb3dzIGZvciB0aGUgZXhjbHVzaW9uIG9mCi0gICAgICAgICAgICAgICAgY2VydGFpbiBuYW1lc3BhY2UgZGVjbGFyYXRpb25zIGluIHRoZSBvdXRwdXQgZG9jdW1lbnQuIFRoZSBjb250ZW50Ci0gICAgICAgICAgICAgICAgYXNzaXN0YW5jZSBwb3B1bGF0ZXMgYSBsaXN0IG9mIGF2YWlsYWJsZSBuYW1lc3BhY2VzIHRoYXQgaGF2ZSBiZWVuIGRlZmluZWQKLSAgICAgICAgICAgICAgICBpbiB0aGUgc3R5bHNlaGVldCBhbmQgcHJvdmlkZXMgdGhlbSBhcyBwcm9wb3NhbHMgYXMgc2hvd24gaW4KLSAgICAgICAgICAgICAgICA8eHJlZiBsaW5rZW5kPSJmaWdfRXhjbHVkZVJlc3VsdFByZWZpeGVzQ29udGVudEFzc2lzdDEiLz4KLSAgICAgICAgICAgICAgICAuCi0gICAgICAgICAgICA8L3BhcmE+Ci0gICAgICAgICAgICA8ZmlndXJlIGlkPSJmaWdfRXhjbHVkZVJlc3VsdFByZWZpeGVzQ29udGVudEFzc2lzdDEiPgotICAgICAgICAgICAgICAgIDx0aXRsZT5FeGNsdWRlLXJlc3VsdC1wcmVmaXhlcyBDb250ZW50IEFzc2lzdGFuY2UKLSAgICAgICAgICAgICAgICA8L3RpdGxlPgotICAgICAgICAgICAgICAgIDxtZWRpYW9iamVjdD4KLSAgICAgICAgICAgICAgICAgICAgPGltYWdlb2JqZWN0PgotICAgICAgICAgICAgICAgICAgICAgICAgPGltYWdlZGF0YSBhbGlnbj0iY2VudGVyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVyZWY9Ii4uL2ltYWdlcy9lZGl0b3IvRXhjbHVkZUNvbnRlbnRBc3Npc3QxLnBuZyIvPgotICAgICAgICAgICAgICAgICAgICA8L2ltYWdlb2JqZWN0PgotICAgICAgICAgICAgICAgIDwvbWVkaWFvYmplY3Q+Ci0gICAgICAgICAgICA8L2ZpZ3VyZT4KLSAgICAgICAgICAgIDxwYXJhPgotICAgICAgICAgICAgICAgIElmIHRoZSBhdHRyaWJ1dGUgaGFzIG5vIHZhbHVlcyBkZWZpbmVkLCB0aGVuIHRoZQotICAgICAgICAgICAgICAgIDxlbXBoYXNpcz4jYWxsPC9lbXBoYXNpcz4KLSAgICAgICAgICAgICAgICB2YWx1ZSB3aWxsIGJlIGF2YWlsYWJsZSBpbiB0aGUgbGlzdC4gSWYgI2FsbCBpcyBhbHJlYWR5IGluIHRoZSBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgdmFsdWUsIHRoZW4gbm8gY29udGVudCBhc3Npc3RhbmNlIHdpbGwgYmUgYXZhaWxhYmxlLgotICAgICAgICAgICAgPC9wYXJhPgotICAgICAgICAgICAgPGZpZ3VyZSBpZD0iZmlnX0V4Y2x1ZGVSZXN1bHRQcmVmaXhlc0NvbnRlbnRBc3Npc3QyIj4KLSAgICAgICAgICAgICAgICA8dGl0bGU+RmlsdGVyZWQgZXhjbHVkZS1yZXN1bHQtcHJlZml4ZXMgcHJvcG9zYWxzPC90aXRsZT4KLSAgICAgICAgICAgICAgICA8bWVkaWFvYmplY3Q+Ci0gICAgICAgICAgICAgICAgICAgIDxpbWFnZW9iamVjdD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbWFnZWRhdGEgYWxpZ249ImNlbnRlciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlcmVmPSIuLi9pbWFnZXMvZWRpdG9yL0V4Y2x1ZGVDb250ZW50QXNzaXN0Mi5wbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPC9pbWFnZW9iamVjdD4KLSAgICAgICAgICAgICAgICA8L21lZGlhb2JqZWN0PgotICAgICAgICAgICAgPC9maWd1cmU+Ci0gICAgICAgICAgICA8cGFyYT5Db250ZW50IGFzc2lzdGFuY2UgaXMgaW50ZWxsaWdlbnQgZW5vdWdoIHRvIGtub3cgd2hlbiBhIG5hbWVzcGFjZQotICAgICAgICAgICAgICAgIHByZWZpeCBpcyBhbHJlYWR5IGluIHRoZSBsaXN0IG9mIGV4Y2x1ZGVkIG5hbWVzcGFjZXMuIEluIHRoaXMgY2FzZSBpdCB3aWxsCi0gICAgICAgICAgICAgICAgbm90IHNob3cgdGhlIG5hbWVzcGFjZSBpbiB0aGUgcHJvcG9zYWwgbGlzdC48L3BhcmE+Ci0gICAgICAgICAgICA8bm90ZT4KLSAgICAgICAgICAgICAgICA8dGl0bGU+IFdoeSBpc24ndCB0aGUgWFNMIE5hbWVzcGFjZSBwcmVmaXggaW4gdGhlIHByb3Bvc2Fscz88L3RpdGxlPgotICAgICAgICAgICAgICAgIDxwYXJhPkN1cnJlbnRseSB0aGUgeHNsIHByZWZpeCBvciBhbnkgcHJlZml4IHRoYXQgdXNlcyB0aGUgWFNMCi0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBpcyBleGNsdWRlZCBmcm9tIHRoZSBsaXN0LiBUaGlzIG1heSBiZSBjaGFuZ2VkIGF0IGEgZnV0dXJlCi0gICAgICAgICAgICAgICAgICAgIGRhdGUuIFRoaXMgd2lsbCBkZXBlbmQgb24gdXNlciBmZWVkYmFjay48L3BhcmE+Ci0gICAgICAgICAgICA8L25vdGU+Ci0gICAgICAgIDwvc2VjdGlvbj4KLSAgICAgICAgPHNlY3Rpb24gaWQ9ImVkX01vZGVBc3Npc3QiPgotPD9kYmh0bWwgZmlsZW5hbWU9ImVkaXRvci94c2xlZGl0b3JfY29udGVudGFzc2lzdF9tb2RlYXNzaXN0Lmh0bWwiID8+Ci0gICAgICAgIAotICAgICAgICAgICAgPHRpdGxlPk1vZGUgYXR0cmlidXRlIGFzc2lzdGFuY2U8L3RpdGxlPgotICAgICAgICAgICAgPHBhcmE+Ci0gICAgICAgICAgICAgICAgQ29udGVudCBhc3Npc3RhbmNlIGlzIGF2YWlsYWJsZSBmb3IgdGhvc2UgeHNsIGVsZW1lbnRzIHRoYXQgc3VwcG9ydCB0aGUKLSAgICAgICAgICAgICAgICBtb2RlIGF0dHJpYnV0ZS4gRm9yIFhTTFQgMS4wIHRoZXNlIGVsZW1lbnRzIGFyZQotICAgICAgICAgICAgICAgIDxlbXBoYXNpcz50ZW1wbGF0ZTwvZW1waGFzaXM+Ci0gICAgICAgICAgICAgICAgLAotICAgICAgICAgICAgICAgIDxlbXBoYXNpcz5hcHBseS10ZW1wbGF0ZXM8L2VtcGhhc2lzPgotICAgICAgICAgICAgICAgICwgYW5kCi0gICAgICAgICAgICAgICAgPGVtcGhhc2lzPmFwcGx5LWltcG9ydHM8L2VtcGhhc2lzPgotICAgICAgICAgICAgICAgIC4KLSAgICAgICAgICAgIDwvcGFyYT4KLSAgICAgICAgICAgIDxmaWd1cmUgaWQ9ImZpZ19Nb2RlQXNzaXN0YW5jZSI+Ci0gICAgICAgICAgICAgICAgPHRpdGxlPk1vZGUgYXR0cmlidXRlIGFzc2lzdGFuY2U8L3RpdGxlPgotICAgICAgICAgICAgICAgIDxtZWRpYW9iamVjdD4KLSAgICAgICAgICAgICAgICAgICAgPGltYWdlb2JqZWN0PgotICAgICAgICAgICAgICAgICAgICAgICAgPGltYWdlZGF0YSBhbGlnbj0iY2VudGVyIiBmaWxlcmVmPSIuLi9pbWFnZXMvZWRpdG9yL21vZGVBc3Npc3RhbmNlLnBuZyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQ9IlBORyIvPgotICAgICAgICAgICAgICAgICAgICA8L2ltYWdlb2JqZWN0PgotICAgICAgICAgICAgICAgIDwvbWVkaWFvYmplY3Q+Ci0gICAgICAgICAgICA8L2ZpZ3VyZT4KLSAgICAgICAgICAgIDxwYXJhPgotICAgICAgICAgICAgICAgIFRoZSBwcm9wb3NhbCBsaXN0IGlzIHBvcHVsYXRlZCBieSB0aG9zZSBtb2RlcyBkZWZpbmVkIG9uIHRlbXBsYXRlcyBpbiB0aGUKLSAgICAgICAgICAgICAgICBjdXJyZW50IHN0eWxlc2hlZXQsIGFuZCBhbnkgb2YgdGhlIHRlbXBsYXRlcyB0aGF0IGFyZQotICAgICAgICAgICAgICAgIDxlbXBoYXNpcz5pbmNsdWRlZDwvZW1waGFzaXM+Ci0gICAgICAgICAgICAgICAgb3IKLSAgICAgICAgICAgICAgICA8ZW1waGFzaXM+aW1wb3J0ZWQ8L2VtcGhhc2lzPgotICAgICAgICAgICAgICAgIC4KLSAgICAgICAgICAgIDwvcGFyYT4KLSAgICAgICAgPC9zZWN0aW9uPgotICAgICAgICA8c2VjdGlvbiBpZD0iZWRfTmFtZWRUZW1wbGF0ZUFzc2lzdCI+Ci08P2RiaHRtbCBmaWxlbmFtZT0iZWRpdG9yL3hzbGVkaXRvcl9jb250ZW50YXNzaXN0X25hbWVkdGVtcGxhdGUuaHRtbCIgPz4KLSAgICAgICAgCi0gICAgICAgICAgICA8dGl0bGU+TmFtZWQgVGVtcGxhdGUgQXNzaXN0YW5jZTwvdGl0bGU+Ci0gICAgICAgICAgICA8cGFyYT4KLSAgICAgICAgICAgICAgICBDYWxsIE5hbWVkIHRlbXBsYXRlcyBoYXZlIGNvbnRlbnQgYXNzaXN0YW5jZSBhdmFpbGFibGUgZm9yIHRoZWlyCi0gICAgICAgICAgICAgICAgPGVtcGhhc2lzPm5hbWU8L2VtcGhhc2lzPgotICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMuIFRoaXMgd2lsbCBwcm92aWRlIGEgbGlzdCBvZiBjYWxsZWQtdGVtcGxhdGVzIHRoYXQgaGF2ZSBiZWVuCi0gICAgICAgICAgICAgICAgdXNlZCwgYnV0IGhhdmUgbm90IHlldCBiZWVuIGRlZmluZWQgb3Igb3ZlcnJpZGRlbiB3aXRoaW4gdGhlIGN1cnJlbnQKLSAgICAgICAgICAgICAgICBzdHlsZXNoZWV0LgotICAgICAgICAgICAgPC9wYXJhPgotICAgICAgICAgICAgPGZpZ3VyZSBpZD0iZmlnX05hbWVkVGVtcGxhdGVzIj4KLSAgICAgICAgICAgICAgICA8dGl0bGU+TmFtZWQgVGVtcGxhdGUgQXNzaXN0YW5jZTwvdGl0bGU+Ci0gICAgICAgICAgICAgICAgPG1lZGlhb2JqZWN0PgotICAgICAgICAgICAgICAgICAgICA8aW1hZ2VvYmplY3Q+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW1hZ2VkYXRhIGFsaWduPSJjZW50ZXIiIGZpbGVyZWY9Ii4uL2ltYWdlcy9lZGl0b3IvbmFtZWRUZW1wbGF0ZS5wbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPC9pbWFnZW9iamVjdD4KLSAgICAgICAgICAgICAgICA8L21lZGlhb2JqZWN0PgotICAgICAgICAgICAgPC9maWd1cmU+Ci0gICAgICAgIDwvc2VjdGlvbj4KLSAgICAgICAgPHNlY3Rpb24gaWQ9ImVkX0NhbGxUZW1wbGF0ZUFzc2lzdCI+Ci08P2RiaHRtbCBmaWxlbmFtZT0iZWRpdG9yL3hzbGVkaXRvcl9jb250ZW50YXNzaXN0X2NhbGx0ZW1wbGF0ZS5odG1sIiA/PgotICAgICAgICAKLSAgICAgICAgICAgIDx0aXRsZT5DYWxsLVRlbXBsYXRlIEFzc2lzdGFuY2U8L3RpdGxlPgotICAgICAgICAgICAgPHBhcmE+Ci0gICAgICAgICAgICAgICAgQW55Ci0gICAgICAgICAgICAgICAgPGVtcGhhc2lzPmNhbGwtdGVtcGxhdGU8L2VtcGhhc2lzPgotICAgICAgICAgICAgICAgIHhzbHQgZWxlbWVudCBoYXMgY29udGVudCBhc3Npc3RhbmNlIGF2YWlsYWJsZSBmb3IgaXQncyBuYW1lIGF0dHJpYnV0ZS4KLSAgICAgICAgICAgICAgICBUaGlzIHdpbGwgcHJvdmlkZSBhIGxpc3Qgb2YgcG9zc2libGUgWFNMVCBuYW1lZCB0ZW1wbGF0ZXMgdGhhdCBjYW4gYmUKLSAgICAgICAgICAgICAgICBjYWxsZWQgZnJvbSB0aGUgY3VycmVudCBzdHlsZXNoZWV0LiBUaGlzIHRha2VzIGludG8gZWZmZWN0IGFsbCBpbmNsdWRlZAotICAgICAgICAgICAgICAgIGFuZCBpbXBvcnRlZCBzdHlsZXNoZWV0cyBhcyB3ZWxsIGFzIHRob3NlIGRlZmluZWQgaW4gdGhlIGN1cnJlbnQKLSAgICAgICAgICAgICAgICBzdHlsZXNoZWV0LgotICAgICAgICAgICAgPC9wYXJhPgotICAgICAgICAgICAgPGZpZ3VyZSBpZD0iZmlnX0NhbGxUZW1wbGF0ZUFzc2lzdCI+Ci0gICAgICAgICAgICAgICAgPHRpdGxlPkNhbGwtVGVtcGxhdGUgQXNzaXN0YW5jZTwvdGl0bGU+Ci0gICAgICAgICAgICAgICAgPG1lZGlhb2JqZWN0PgotICAgICAgICAgICAgICAgICAgICA8aW1hZ2VvYmplY3Q+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW1hZ2VkYXRhIGFsaWduPSJjZW50ZXIiIGZpbGVyZWY9Ii4uL2ltYWdlcy9lZGl0b3IvY2FsbHRlbXBsYXRlLnBuZyIvPgotICAgICAgICAgICAgICAgICAgICA8L2ltYWdlb2JqZWN0PgotICAgICAgICAgICAgICAgIDwvbWVkaWFvYmplY3Q+Ci0gICAgICAgICAgICA8L2ZpZ3VyZT4KLSAgICAgICAgPC9zZWN0aW9uPgotICAgICAgICA8c2VjdGlvbiBpZD0iZWRfaHJlZiI+Ci08P2RiaHRtbCBmaWxlbmFtZT0iZWRpdG9yL3hzbGVkaXRvcl9jb250ZW50YXNzaXN0X2luY2x1ZGUuaHRtbCIgPz4KLSAgICAgICAgCi0gICAgICAgICAgICA8dGl0bGU+Ci0gICAgICAgICAgICAgICAgSW5jbHVkZSBhbmQgSW1wb3J0Ci0gICAgICAgICAgICAgICAgPGVtcGhhc2lzPmhyZWY8L2VtcGhhc2lzPgotICAgICAgICAgICAgICAgIEFzc2lzdGFuY2UKLSAgICAgICAgICAgIDwvdGl0bGU+Ci0gICAgICAgICAgICA8cGFyYT5YU0xUIHN0eWxlc2hlZXRzIGhhdmUgdGhlIGFiaWxpdHkgdG8gaW1wb3J0IGFuZCBpbmNsdWRlIG90aGVyCi0gICAgICAgICAgICAgICAgc3R5bGVzaGVldHMuIFRoaXMgYWxsb3dzIGZvciBhIG1vZHVsYXIgc3RydWN0dXJlIGZvciB0aGUgdGVtcGxhdGVzIHRvIGJlCi0gICAgICAgICAgICAgICAgY3JlYXRlZC4gSXQgYWxzbyBhbGxvd3MgZm9yIGVhc2llciBtYWludGVuYW5jZS4gSG93ZXZlciwgaWYgb25lIGlzIHdvcmtpbmcKLSAgICAgICAgICAgICAgICB3aXRoIGEgbGFyZ2UgcHJvamVjdCBsaWtlIHRoZSBEb2NCb29rIFByb2plY3RzIHN0eWxlc2hlZXRzIGl0IGNhbiBiZQotICAgICAgICAgICAgICAgIGRpZmZpY3VsdCB0byByZW1lbWJlciB0aGUgbmFtZXMgYW5kIGxvY2F0aW9ucyBvZiBhbGwgdGhlIHN0eWxlc2hlZXRzLgotICAgICAgICAgICAgPC9wYXJhPgotICAgICAgICAgICAgPHBhcmE+Ci0gICAgICAgICAgICAgICAgVG8gdGhpcyBlbmQsIHRoZSBYU0xUIGVkaXRvciBwcm92aWRlcyBjb250ZW50IGFzc2lzdGFuY2UgZm9yIHRoZQotICAgICAgICAgICAgICAgIDxlbXBoYXNpcz5ocmVmPC9lbXBoYXNpcz4KLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGUuIFRoZSBzY29wZSBvZiB0aGUgYXNzaXN0YW5jZSBpcyByZXN0cmljdGVkIHRvIHRoZSBwcm9qZWN0IHRoYXQKLSAgICAgICAgICAgICAgICB0aGUgY3VycmVudCBzdHlsZXNoZWV0IHRoYXQgaXMgYmVpbmcgZWRpdHRlZCByZXNpZGVzLgotICAgICAgICAgICAgPC9wYXJhPgotICAgICAgICAgICAgPGZpZ3VyZSBpZD0iZmlnX0hSRUZBc3Npc3RhbmNlIj4KLSAgICAgICAgICAgICAgICA8dGl0bGU+SW5jbHVkZS9JbXBvcnQgaHJlZiBBc3Npc3RhbmNlPC90aXRsZT4KLSAgICAgICAgICAgICAgICA8bWVkaWFvYmplY3Q+Ci0gICAgICAgICAgICAgICAgICAgIDxpbWFnZW9iamVjdD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbWFnZWRhdGEgYWxpZ249ImNlbnRlciIgZmlsZXJlZj0iLi4vaW1hZ2VzL2VkaXRvci9ocmVmQXNzaXN0YW5jZS5wbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPC9pbWFnZW9iamVjdD4KLSAgICAgICAgICAgICAgICA8L21lZGlhb2JqZWN0PgotICAgICAgICAgICAgPC9maWd1cmU+Ci0gICAgICAgIDwvc2VjdGlvbj4KLSAgICA8L3NlY3Rpb24+Ci0gICAgPHNlY3Rpb24gaWQ9IlhTTEVkaXRvclRlbXBsYXRlcyI+Ci08P2RiaHRtbCBmaWxlbmFtZT0iZWRpdG9yL3hzbGVkaXRvcl90ZW1wbGF0ZXMuaHRtbCIgPz4KLSAgICAgICAgPHRpdGxlPlRlbXBsYXRlczwvdGl0bGU+Ci0gICAgICAgIDxwYXJhPlNwZWNpZmljIFhTTCBjb2RlIGNvbXBsZXRpb24gdGVtcGxhdGVzIGNhbiBiZSBhZGRlZCB0byB0aGUgWE1MCi0gICAgICAgICAgICBlZGl0b3IncyBUZW1wbGF0ZXMuIFRoaXMgYWxsb3dzIGEgdXNlciB0byBkZWZpbmUgc3BlY2lmaWMgbWFya3VwIGNvbXBsZXRpb24KLSAgICAgICAgICAgIHRlbXBsYXRlcyB0aGF0IGFyZSBjb21tb25seSB1c2VkLiBJbiBhZGRpdGlvbiwgdGhlIFhQYXRoIFRlbXBsYXRlcyBwYWdlIGNhbiBiZQotICAgICAgICAgICAgZW5oYW5jZWQgdG8gYWxsb3cgY29tbW9ubHkgdXNlZCBYUGF0aCB0ZW1wbGF0ZXMgdG8gYmUgaW5jbHVkZWQsIGluIGFkZGl0aW9uIHRvCi0gICAgICAgICAgICB0aG9zZSBpbnN0YWxsZWQgYnkgZGVmYXVsdC4gVGhpcyBhbGxvd3MgYSB1c2VyIHRoZSBhYmlsaXR5IHRvIGFkZCBjdXN0b20KLSAgICAgICAgICAgIGV4dGVuc2lvbiBmdW5jdGlvbnMgZm9yIFhTTFQgdGhhdCBtYXkgYmUgcHJvY2Vzc29yIHNwZWNpZmljLiBBZG9wdGVycyBtYXkgYWxzbwotICAgICAgICAgICAgdXNlIHRoZSBzdGFuZGFyZCB0ZW1wbGF0ZSBleHRlbnNpb24gcG9pbnQgdG8gYWRkIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eS4KLSAgICAgICAgPC9wYXJhPgotICAgICAgICA8c2VjdGlvbj4KLSAgICAgICAgICAgIDx0aXRsZT5YUGF0aCBUZW1wbGF0ZXM8L3RpdGxlPgotICAgICAgICAgICAgPHBhcmE+VGhlIFhTTCBYUGF0aCBUZW1wbGF0ZXMgcHJlZmVyZW5jZSBwYWdlIGFsbG93cyBmb3IgYSB1c2VyIG9yIGFkb3B0ZXIKLSAgICAgICAgICAgICAgICB0byBhZGQgc3BlY2lmaWMgeHBhdGggZXh0ZW5zaW9ucyBzbyB0aGF0IHRoZXkgc2hvdyB1cCBpbiB0aGUgY29udGVudAotICAgICAgICAgICAgICAgIGFzc2lzdGFuY2UuIFNlZSB0aGUgWFBhdGggVGVtcGxhdGVzIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gICAgICAgICAgICA8L3BhcmE+Ci0gICAgICAgIDwvc2VjdGlvbj4KLSAgICA8L3NlY3Rpb24+Ci0gICAgPHNlY3Rpb24gaWQ9InhzbHRTeW50YXhDb2xvcmluZyI+Ci08P2RiaHRtbCBmaWxlbmFtZT0iZWRpdG9yL3hzbGVkaXRvcl9jb2xvcmluZy5odG1sIiA/PgotICAgICAgICA8dGl0bGU+WFNMVCBTeW50YXggQ29sb3Jpbmc8L3RpdGxlPgotICAgICAgICA8cGFyYT4KLSAgICAgICAgICAgIFhTTCBUb29scyBFZGl0b3IgY2FuIGhhdmUgc3ludGF4IGNvbG9yaW5nIHRoYXQgaXMgc3BlY2lmaWMganVzdCBmb3IgdGhlIHRoZQotICAgICAgICAgICAgWFNMVCBOYW1lc3BhY2UgYXMgc2hvd2luZyBpbgotICAgICAgICAgICAgPHhyZWYgbGlua2VuZD0iZmlnX2VkaXRvclN5bnRheENvbG9yaW5nIi8+Ci0gICAgICAgICAgICAuCi0gICAgICAgIDwvcGFyYT4KLSAgICAgICAgPGZpZ3VyZSBpZD0iZmlnX2VkaXRvclN5bnRheENvbG9yaW5nIj4KLSAgICAgICAgICAgIDx0aXRsZT5YU0xUIFNwZWNpZmljIFN5bnRheCBDb2xvcmluZzwvdGl0bGU+Ci0gICAgICAgICAgICA8bWVkaWFvYmplY3Q+Ci0gICAgICAgICAgICAgICAgPGltYWdlb2JqZWN0PgotICAgICAgICAgICAgICAgICAgICA8aW1hZ2VkYXRhIGFsaWduPSJjZW50ZXIiIGZpbGVyZWY9Ii4uL2ltYWdlcy9lZGl0b3Ivc3ludGF4Q29sb3JpbmcucG5nIgotICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0PSJQTkciLz4KLSAgICAgICAgICAgICAgICA8L2ltYWdlb2JqZWN0PgotICAgICAgICAgICAgPC9tZWRpYW9iamVjdD4KLSAgICAgICAgPC9maWd1cmU+Ci0gICAgICAgIDxwYXJhPgotICAgICAgICAgICAgVGhlIGRlZmF1bHQgY29sb3Jpbmcgc2hvd24gaXMgdG8gbWFrZSBhbGwgWFNMVCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBib2xkLgotICAgICAgICAgICAgVGhlIHNldHRpbmdzIGFyZSBjb250cm9sZWQgaW4KLSAgICAgICAgICAgIDx4cmVmIGxpbmtlbmQ9IlhTTFByZWZlcmVuY2VzIi8+Ci0gICAgICAgICAgICAuCi0gICAgICAgIDwvcGFyYT4KLSAgICA8L3NlY3Rpb24+Ci0gICAgPHNlY3Rpb24gaWQ9InhzbHRNYXJrZXJzIj4KLTw/ZGJodG1sIGZpbGVuYW1lPSJlZGl0b3IveHNsZWRpdG9yX21hcmtlcnMuaHRtbCIgPz4KLSAgICAgICAgPHRpdGxlPlhTTFQgTWFya2VycyBhbmQgQW5ub3RhdGlvbnM8L3RpdGxlPgotICAgICAgICA8cGFyYT5UaGUgWFNMIGVkaXRvciBzdXBwb3J0cyB0aGUgYWJpbGl0eSB0byBhbm5vdGF0ZSBvciBwcm92aWRlIG1hcmtlcnMuIFRoZXNlCi0gICAgICAgICAgICBhbm5vdGF0aW9ucyBwcm92aWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRlbXBsYXRlcyBhbmQgWFNMVAotICAgICAgICAgICAgZWxlbWVudHMgaW4gdGhlIHN0eWxlc2hlZXQuPC9wYXJhPgotICAgICAgICA8c2VjdGlvbiBpZD0ieHNsdE92ZXJSaWRlIj4KLTw/ZGJodG1sIGZpbGVuYW1lPSJlZGl0b3IveHNsZWRpdG9yX2NvbnRlbnRhc3Npc3RfeHNsdE92ZXJyaWRlLmh0bWwiID8+Ci0gICAgICAgIAotICAgICAgICAgICAgPHRpdGxlPlRlbXBsYXRlIE92ZXJyaWRlPC90aXRsZT4KLSAgICAgICAgICAgIDxwYXJhPlRoZSBYU0xUIGVkaXRvciB3aWxsIG1hcmsgdGVtcGxhdGVzIHRoYXQgaGF2ZSBvdmVycmlkZW4gYW4gaW1wb3J0ZWQKLSAgICAgICAgICAgICAgICB0ZW1wbGF0ZSBvZiB0aGUgc2FtZSBuYW1lLjwvcGFyYT4KLSAgICAgICAgICAgIDxmaWd1cmUgaWQ9ImZpZ19PdmVyUmlkZTEiPgotICAgICAgICAgICAgICAgIDx0aXRsZT5PdmVycmlkZW4gVGVtcGxhdGU8L3RpdGxlPgotICAgICAgICAgICAgICAgIDxtZWRpYW9iamVjdD4KLSAgICAgICAgICAgICAgICAgICAgPGltYWdlb2JqZWN0PgotICAgICAgICAgICAgICAgICAgICAgICAgPGltYWdlZGF0YSBhbGlnbj0iY2VudGVyIiBmaWxlcmVmPSIuLi9pbWFnZXMvZWRpdG9yL292ZXJyaWRlMS5wbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPC9pbWFnZW9iamVjdD4KLSAgICAgICAgICAgICAgICA8L21lZGlhb2JqZWN0PgotICAgICAgICAgICAgPC9maWd1cmU+Ci0gICAgICAgICAgICA8cGFyYT4KLSAgICAgICAgICAgICAgICBJbgotICAgICAgICAgICAgICAgIDx4cmVmIGxpbmtlbmQ9ImZpZ19PdmVyUmlkZTEiLz4KLSAgICAgICAgICAgICAgICAsIHRoZSB0ZW1wbGF0ZQotICAgICAgICAgICAgICAgIDxlbXBoYXNpcz5UZW1wQjwvZW1waGFzaXM+Ci0gICAgICAgICAgICAgICAgb3ZlcnJpZGVzIGFuIGltcG9ydGVkIHRlbXBsYXRlLiBCeSBtb3ZpbmcgdGhlIG1vdXNlIHBvaW50ZXIgb3ZlciB0aGUKLSAgICAgICAgICAgICAgICB0cmlhbmdsZSBpY29uIGluIHRoZSBydWxlIGJhciwgaW5mb3JtYXRpb24gYWJvdXQgd2hpY2ggZmlsZSB0aGUgb3JpZ2luYWwKLSAgICAgICAgICAgICAgICB0ZW1wbGF0ZSByZXNpZGVzLgotICAgICAgICAgICAgPC9wYXJhPgotICAgICAgICAgICAgPGZpZ3VyZSBpZD0iZmlnX092ZXJSaWRlMiI+Ci0gICAgICAgICAgICAgICAgPHRpdGxlPk92ZXJyaWRlbiBUZW1wbGF0ZSBJbmZvcm1hdGlvbjwvdGl0bGU+Ci0gICAgICAgICAgICAgICAgPG1lZGlhb2JqZWN0PgotICAgICAgICAgICAgICAgICAgICA8aW1hZ2VvYmplY3Q+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW1hZ2VkYXRhIGFsaWduPSJjZW50ZXIiIGZpbGVyZWY9Ii4uL2ltYWdlcy9lZGl0b3Ivb3ZlcnJpZGUyLnBuZyIvPgotICAgICAgICAgICAgICAgICAgICA8L2ltYWdlb2JqZWN0PgotICAgICAgICAgICAgICAgIDwvbWVkaWFvYmplY3Q+Ci0gICAgICAgICAgICA8L2ZpZ3VyZT4KLSAgICAgICAgPC9zZWN0aW9uPgotICAgIDwvc2VjdGlvbj4KLSAgICA8c2VjdGlvbiBpZD0iWFNMRWRpdG9yRGVidWdnaW5nIj4KLTw/ZGJodG1sIGZpbGVuYW1lPSJlZGl0b3IveHNsZWRpdG9yX2RlYnVnZ2luZy5odG1sIiA/PgotICAgICAgICA8dGl0bGU+WFNMIERlYnVnZ2luZzwvdGl0bGU+Ci0gICAgICAgIDxwYXJhPlRoZSBYU0wgRWRpdG9yIHN1cHBvcnRzIHRoZSBhYmlsaXR5IHRvIHNwZWNpZnkgYnJlYWsgcG9pbnRzIHdpdGhpbiBhbiBYU0wKLSAgICAgICAgICAgIEZpbGUuIElmIHRoZSBmaWxlIGlzIGluY2x1ZGVkIG9yIGltcG9ydGVkIGFuZCB0aGUgYnJlYWsgcG9pbnQgaXMgZW5jb3VudGVyZWQKLSAgICAgICAgICAgIGR1cmluZyBhIHRyYW5zZm9ybWF0aW9uIHNjZW5hcmlvIGl0IHdpbGwgYmUgcmVzcGVjdGVkLiBBIGJyZWFrIHBvaW50IG1heSBiZQotICAgICAgICAgICAgc2V0IGF0IGFueSB2YWxpZCBYU0wgZWxlbWVudCBvciBvdGhlciB4bWwgZWxlbWVudCB3aXRoaW4gdGhlIFhTTFQgc3R5bGVzaGVldC4KLSAgICAgICAgICAgIFNlZSB0aGUgTGF1bmNoaW5nIGFuZCBEZWJ1Z2dpbmcgc2VjdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBkZWJ1Z2dpbmcgWFNMVAotICAgICAgICAgICAgc3R5bGVzaGVldHMuPC9wYXJhPgotICAgIDwvc2VjdGlvbj4KLSAgICA8c2VjdGlvbj4KLTw/ZGJodG1sIGZpbGVuYW1lPSJlZGl0b3IveHNsZWRpdG9yX2RlYnVnZ2luZy5odG1sIiA/PgotICAgICAgICA8dGl0bGU+TmF2aWdhdGlvbjwvdGl0bGU+Ci0gICAgICAgIDxwYXJhPgotICAgICAgICAgICAgTWFueSBvZiB0aGUgdmFyaWFibGVzLCBpbXBvcnRzL2luY2x1ZGVzLCBhbmQgdGVtcGxhdGVzIGNhbiBiZSBuYXZpZ2F0ZWQgdG8KLSAgICAgICAgICAgIHVzaW5nIHRoZQotICAgICAgICAgICAgPGVtcGhhc2lzPk9wZW4gRGVjbGFyYXRpb24gKEYzKTwvZW1waGFzaXM+Ci0gICAgICAgICAgICBwb3B1cCBtZW51IG9wdGlvbi4gVGhleSBjYW4gYWxzbyBiZSBuYXZpZ2F0ZWQgdG8gZGlyZWN0bHkgYnkgQ1RSTC1DbGlja2luZyBvbgotICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlLCBpbXBvcnQvaW5jbHVkZSwgb3IgdGVtcGxhdGUuIEl0ZW1zIHRoYXQgY3VycmVudGx5Ci0gICAgICAgICAgICBoYXZlIGh5cGVybGlua2luZyBuYXZpZ2F0aW9uIGFyZToKLSAgICAgICAgPC9wYXJhPgotICAgICAgICA8aXRlbWl6ZWRsaXN0PgotICAgICAgICAgICAgPGxpc3RpdGVtPgotICAgICAgICAgICAgICAgIDxwYXJhPkNhbGxlZC1UZW1wbGF0ZXM8L3BhcmE+Ci0gICAgICAgICAgICA8L2xpc3RpdGVtPgotICAgICAgICAgICAgPGxpc3RpdGVtPgotICAgICAgICAgICAgICAgIDxwYXJhPmhyZWZzIGZvciBJbXBvcnQgYW5kIEluY2x1ZGVzPC9wYXJhPgotICAgICAgICAgICAgPC9saXN0aXRlbT4KLSAgICAgICAgICAgIDxsaXN0aXRlbT4KLSAgICAgICAgICAgICAgICA8cGFyYT5XaXRoLVBhcmFtIHZhcmlhYmxlczwvcGFyYT4KLSAgICAgICAgICAgIDwvbGlzdGl0ZW0+Ci0gICAgICAgIDwvaXRlbWl6ZWRsaXN0PgotICAgICAgICA8dGlwPgotICAgICAgICAgICAgPHRpdGxlPk5hdmlnYXRpb24gdG8gYSBOYW1lZCBUZW1wbGF0ZSBpbiBhbiBpbmNsdWRlZC9pbXBvcnRlZAotICAgICAgICAgICAgICAgIHN0eWxzaGVldDwvdGl0bGU+Ci0gICAgICAgICAgICA8cGFyYT4gVGhlIGh5cGVybGlua2luZyBhYmlsaXR5IHdpbGwgbmF2aWdhdGUgeW91IHRvIHdoZXJlIGV2ZXIgdGhlIGZpcnN0Ci0gICAgICAgICAgICAgICAgZGVmaW5pdGlvbiBvZiB0aGUgdGVtcGxhdGUgaXMgZGVmaW5lZC4gU28gaWYgdGhlIHRlbXBsYXRlIGlzIGRlZmluZWQKLSAgICAgICAgICAgICAgICB3aXRoaW4gdGhlIGN1cnJlbnQgc3R5bGVzaGVldCBpdCB3aWxsIG5hdmlnYXRlIHRvIHRoYXQgZGVmaW5pdGlvbi4gSG93ZXZlcgotICAgICAgICAgICAgICAgIGlmIGl0IGlzIGRlZmluZWQgaW4gYW4gaW1wb3J0ZWQgb3IgaW5jbHVkZWQgc3R5bGVzaGVldCwgb3IgYW55IG9mIHRob3NlCi0gICAgICAgICAgICAgICAgaW1wb3J0ZWQgb3IgaW5jbHVkZWQgc3R5bGVzaGVldHMgaXQgd2lsbCB0YWtlIHlvdSB0byB0aGF0IGRlZmluaXRpb24uIFVzZQotICAgICAgICAgICAgICAgIHRoZSBzdGFuZGFyZCBuYXZpZ2F0aW9uIGVycm9ycyB0byBtb3ZlIGJhY2sgYW5kIGZvcnRoIGR1cmluZyB0aGlzCi0gICAgICAgICAgICAgICAgaHlwZXJsaW5raW5nLjwvcGFyYT4KLSAgICAgICAgPC90aXA+Ci0gICAgPC9zZWN0aW9uPgotPC9jaGFwdGVyPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvZG9jYm9vay9nZW5lcmFsL2dlbmVyYWwueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9kb2Nib29rL2dlbmVyYWwvZ2VuZXJhbC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3MmM0NWEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9kb2Nib29rL2dlbmVyYWwvZ2VuZXJhbC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGNoYXB0ZXIgUFVCTElDICItLy9PQVNJUy8vRFREIERvY0Jvb2sgWE1MIFY0LjUvL0VOIgotICAgICAgICAgICJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2RvY2Jvb2sveG1sLzQuNS9kb2Nib29reC5kdGQiPgotPGNoYXB0ZXI+Ci0JPD9kYmh0bWwgZmlsZW5hbWU9ImdlbmVyYWwvZ2VuZXJhbC5odG1sIiA/PgotCTx0aXRsZT5HZW5lcmFsPC90aXRsZT4KLQk8cGFyYT5UaGlzIHNlY3Rpb24gY292ZXJzIHRvcGljcyB0aGF0IGRvbid0IGhhdmUgYW55IG90aGVyIHBhcnRpY3VsYXIgcGxhY2UgdG8gZ28uPC9wYXJhPgotCTxzZWN0aW9uIGlkPSJYSW5jbHVkZSI+Ci0JICAgIDw/ZGJodG1sIGZpbGVuYW1lPSJnZW5lcmFsL3hpbmNsdWRlLmh0bWwiID8+Ci0JCTx0aXRsZT5YSW5jbHVkZTwvdGl0bGU+Ci0JCTxwYXJhPgotICAgICAgCVhJbmNsdWRlIGFsbG93cyBhIHVzZXIgdG8gaW1wb3J0IG9yIGluY2x1ZGUgb3RoZXIgWE1MIGZpbGVzIGludG8gb25lIHhtbCBmaWxlLgotICAgICAgICBJdCBpcyB1c2VkIHByaW1hcmlseSB3aXRoIGRvY3VtZW50YXRpb24gZmlsZSBmb3JtYXRzIGxpa2UgRG9jYm9vayBhbmQgRElUQS4gIEl0Ci0gICAgICAgIGFsbG93cyBmb3Igc2VwYXJhdGluZyBvdXQgbGFyZ2UgeG1sIGRvY3VtZW50cyBpbnRvIG1vcmUgbWFuYWdlYWJsZSBjaHVua3Mgb2YgaW5mb3JtYXRpb24uCi0gICAgICA8L3BhcmE+Ci0JCTxwYXJhPgotICAgICAgCVRoZSBYU0wgVG9vbHMgcHJvamVjdCBpbmNsdWRlcyBhbiBBTlQgdGFzayB0aGF0IGNhbiBiZSBydW4gd2l0aCBpbiBlY2xpcHNlLCBlY2xpcHNlCi0gICAgICAJaGVhZGxlc3MsIGFuZCB3aXRob3V0IGVjbGlwc2UgYXQgYWxsLiAgIElmIHJ1bm5pbmcgb3V0c2lkZSBvZiBlY2xpcHNlLCB5b3Ugd2lsbCBuZWVkCi0gICAgICAJdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGphciBmaWxlIHhpbmNsdWRlLmphciBpbiB0aGUgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmphciBmaWxlCi0gICAgICAJaXMgbWFkZSBhdmFpYWJsZSBvbiB5b3VyIGNsYXNzIHBhdGguCi0gICAgICA8L3BhcmE+Ci0JCTxtZWRpYW9iamVjdD4KLQkJCTxvYmplY3RpbmZvIGlkPSJYaW5jbHVkZSI+Ci0JCQkJPHRpdGxlPlhJbmNsdWRlIFRhc2s8L3RpdGxlPgotCQkJPC9vYmplY3RpbmZvPgotCQkJPGltYWdlb2JqZWN0PgotCQkJCTxpbWFnZWRhdGEgYWxpZ249ImNlbnRlciIgZmlsZXJlZj0iLi4vaW1hZ2VzL2dlbmVyYWwveGluY2x1ZGUucG5nIgotCQkJCQlmb3JtYXQ9IlBORyIgLz4KLQkJCTwvaW1hZ2VvYmplY3Q+Ci0JCTwvbWVkaWFvYmplY3Q+Ci0JCTxwYXJhPgotICAgICAgCVRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBhcmUgYXZhaWxhYmxlIG9uIHRoZSB4c2wueGluY2x1ZGUgQU5UIHRhc2s6Ci0gICAgICA8L3BhcmE+Ci0JCTxpdGVtaXplZGxpc3Q+Ci0JCQk8bGlzdGl0ZW0+Ci0JCQkJPHBhcmE+Ci0gICAgICAJCQk8ZW1waGFzaXMgcm9sZT0iYm9sZCI+Ci0JCQkJCWluCi0JCQkJPC9lbXBoYXNpcz4gLSBUaGUgZnVsbCBwYXRoIHRvIHRoZSBpbnB1dCBmaWxlIHRoYXQgY29udGFpbnMKLSAgICAgIAkJCXRoZSBmaWxlIHdpdGggdGhlIFhJbmNsdWRlcy4gICBJZiB0aGUgZmlsZXMgdGhhdCBpdCBpbmNsdWRlcyBoYXZlIGluY2x1ZGVzLCB0aGVuCi0gICAgICAJCQl0aG9zZSB3aWxsIGJlIGJyb3VnaHQgaW4gYW4gZXhwYW5kZWQgYXMgd2VsbC4KLSAgICAgIAkJPC9wYXJhPgotCQkJPC9saXN0aXRlbT4KLQkJCTxsaXN0aXRlbT4KLQkJCQk8cGFyYT4KLQkJCQkJPGVtcGhhc2lzIHJvbGU9ImJvbGQiPm91dDwvZW1waGFzaXM+IC0gVGhlIGZ1bGwgcGF0aCB0byB0aGUgb3V0cHV0IGZpbGUgCi0JCQkJCXRvIGJlIHdyaXR0ZW4gd2l0aCBhbGwgaW5jbHVkZXMgZXhwYW5kZWQuICBUaGlzIGlzIHR5cGljYWxseSB1c2VkIGFzIHRoZQotCQkJCQlpbnB1dCB0byBhIHN0eWxlc2hlZXQgdHJhbnNmb3JtYXRpb24gcHJvY2Vzcy4KLQkJCQk8L3BhcmE+Ci0JCQk8L2xpc3RpdGVtPgotCQk8L2l0ZW1pemVkbGlzdD4KLQkgICAgPGV4YW1wbGU+Ci0JICAgIAk8dGl0bGU+WEluY2x1ZGUgRXhhbXBsZTwvdGl0bGU+Ci0JICAgIAk8cHJvZ3JhbWxpc3RpbmcgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+Ci0mbHQ7dGFyZ2V0IG5hbWU9Im1lcmdlIj4KLSAgICAmbHQ7eHNsLnhpbmNsdWRlIGluPSIke2RvY2Jvb2tzb3VyY2V9L3hzbGhlbHAuZGJrIgotICAgICAgICAgICAgICAgICAgb3V0PSIke2RvY2Jvb2tzb3VyY2V9L3hzbGhlbHBjb21iaW5lZC5kYmsiLz4KLSZsdDsvdGFyZ2V0PgkgICAgCQkgICAgCQotCSAgICAJPC9wcm9ncmFtbGlzdGluZz4KLQkgICAgPC9leGFtcGxlPgotCTwvc2VjdGlvbj4KLTwvY2hhcHRlcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2RvY2Jvb2svaW1hZ2VzL2VkaXRvci9FeGNsdWRlQ29udGVudEFzc2lzdDEucG5nIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9kb2Nib29rL2ltYWdlcy9lZGl0b3IvRXhjbHVkZUNvbnRlbnRBc3Npc3QxLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYwZjJjYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2RvY2Jvb2svaW1hZ2VzL2VkaXRvci9FeGNsdWRlQ29udGVudEFzc2lzdDEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9kb2Nib29rL2ltYWdlcy9lZGl0b3IvRXhjbHVkZUNvbnRlbnRBc3Npc3QyLnBuZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvZG9jYm9vay9pbWFnZXMvZWRpdG9yL0V4Y2x1ZGVDb250ZW50QXNzaXN0Mi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlNTM2NzcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9kb2Nib29rL2ltYWdlcy9lZGl0b3IvRXhjbHVkZUNvbnRlbnRBc3Npc3QyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvZG9jYm9vay9pbWFnZXMvZWRpdG9yL2NhbGx0ZW1wbGF0ZS5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2RvY2Jvb2svaW1hZ2VzL2VkaXRvci9jYWxsdGVtcGxhdGUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTEzZjA3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvZG9jYm9vay9pbWFnZXMvZWRpdG9yL2NhbGx0ZW1wbGF0ZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2RvY2Jvb2svaW1hZ2VzL2VkaXRvci9ocmVmQXNzaXN0YW5jZS5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2RvY2Jvb2svaW1hZ2VzL2VkaXRvci9ocmVmQXNzaXN0YW5jZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNDQ5ODYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9kb2Nib29rL2ltYWdlcy9lZGl0b3IvaHJlZkFzc2lzdGFuY2UucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9kb2Nib29rL2ltYWdlcy9lZGl0b3IvbW9kZUFzc2lzdGFuY2UucG5nIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9kb2Nib29rL2ltYWdlcy9lZGl0b3IvbW9kZUFzc2lzdGFuY2UucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWE5ODc1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvZG9jYm9vay9pbWFnZXMvZWRpdG9yL21vZGVBc3Npc3RhbmNlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvZG9jYm9vay9pbWFnZXMvZWRpdG9yL25hbWVkVGVtcGxhdGUucG5nIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9kb2Nib29rL2ltYWdlcy9lZGl0b3IvbmFtZWRUZW1wbGF0ZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4YmQ5MjYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9kb2Nib29rL2ltYWdlcy9lZGl0b3IvbmFtZWRUZW1wbGF0ZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2RvY2Jvb2svaW1hZ2VzL2VkaXRvci9vdmVycmlkZTEucG5nIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9kb2Nib29rL2ltYWdlcy9lZGl0b3Ivb3ZlcnJpZGUxLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhiODc4Yi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2RvY2Jvb2svaW1hZ2VzL2VkaXRvci9vdmVycmlkZTEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9kb2Nib29rL2ltYWdlcy9lZGl0b3Ivb3ZlcnJpZGUyLnBuZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvZG9jYm9vay9pbWFnZXMvZWRpdG9yL292ZXJyaWRlMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmYzQxNWMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9kb2Nib29rL2ltYWdlcy9lZGl0b3Ivb3ZlcnJpZGUyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvZG9jYm9vay9pbWFnZXMvZWRpdG9yL3N5bnRheENvbG9yaW5nLnBuZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvZG9jYm9vay9pbWFnZXMvZWRpdG9yL3N5bnRheENvbG9yaW5nLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVlMGViZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2RvY2Jvb2svaW1hZ2VzL2VkaXRvci9zeW50YXhDb2xvcmluZy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2RvY2Jvb2svaW1hZ2VzL2VkaXRvci90ZW1wbGF0ZXNWaWV3LnBuZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvZG9jYm9vay9pbWFnZXMvZWRpdG9yL3RlbXBsYXRlc1ZpZXcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWUyMGQ5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvZG9jYm9vay9pbWFnZXMvZWRpdG9yL3RlbXBsYXRlc1ZpZXcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9kb2Nib29rL2ltYWdlcy9lZGl0b3IveHNscHJvcG9zYWxzLnBuZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvZG9jYm9vay9pbWFnZXMvZWRpdG9yL3hzbHByb3Bvc2Fscy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmYzEyN2EuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9kb2Nib29rL2ltYWdlcy9lZGl0b3IveHNscHJvcG9zYWxzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvZG9jYm9vay9pbWFnZXMvbGF1bmNoaW5nL2xhdW5jaFNob3J0Y3QucG5nIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9kb2Nib29rL2ltYWdlcy9sYXVuY2hpbmcvbGF1bmNoU2hvcnRjdC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MTgxM2EuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9kb2Nib29rL2ltYWdlcy9sYXVuY2hpbmcvbGF1bmNoU2hvcnRjdC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2RvY2Jvb2svaW1hZ2VzL2xhdW5jaGluZy9ub2Rlc2V0VmFyaWFibGUucG5nIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9kb2Nib29rL2ltYWdlcy9sYXVuY2hpbmcvbm9kZXNldFZhcmlhYmxlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNjYTdmZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2RvY2Jvb2svaW1hZ2VzL2xhdW5jaGluZy9ub2Rlc2V0VmFyaWFibGUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9kb2Nib29rL2ltYWdlcy9sYXVuY2hpbmcvcmVzdWx0Vmlldy5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2RvY2Jvb2svaW1hZ2VzL2xhdW5jaGluZy9yZXN1bHRWaWV3LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZkMWI5MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2RvY2Jvb2svaW1hZ2VzL2xhdW5jaGluZy9yZXN1bHRWaWV3LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvZG9jYm9vay9pbWFnZXMvcHJlZmVyZW5jZXMvWFBhdGhUZW1wbGF0ZXMucG5nIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9kb2Nib29rL2ltYWdlcy9wcmVmZXJlbmNlcy9YUGF0aFRlbXBsYXRlcy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmODkzMDQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9kb2Nib29rL2ltYWdlcy9wcmVmZXJlbmNlcy9YUGF0aFRlbXBsYXRlcy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2RvY2Jvb2svaW1hZ2VzL3ByZWZlcmVuY2VzL3Byb2plY3RMZXZlbFZhbGlkYXRpb24ucG5nIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9kb2Nib29rL2ltYWdlcy9wcmVmZXJlbmNlcy9wcm9qZWN0TGV2ZWxWYWxpZGF0aW9uLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZmZTg2Mi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2RvY2Jvb2svaW1hZ2VzL3ByZWZlcmVuY2VzL3Byb2plY3RMZXZlbFZhbGlkYXRpb24ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9kb2Nib29rL2ltYWdlcy9wcmVmZXJlbmNlcy94bV90ZW1wbGF0ZV94c2xuZXdmaWxlLnBuZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvZG9jYm9vay9pbWFnZXMvcHJlZmVyZW5jZXMveG1fdGVtcGxhdGVfeHNsbmV3ZmlsZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NDZhNmQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9kb2Nib29rL2ltYWdlcy9wcmVmZXJlbmNlcy94bV90ZW1wbGF0ZV94c2xuZXdmaWxlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvZG9jYm9vay9pbWFnZXMvcHJlZmVyZW5jZXMveHNsU3ludGF4Q29sb3JpbmcucG5nIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9kb2Nib29rL2ltYWdlcy9wcmVmZXJlbmNlcy94c2xTeW50YXhDb2xvcmluZy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ZWJlZjMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9kb2Nib29rL2ltYWdlcy9wcmVmZXJlbmNlcy94c2xTeW50YXhDb2xvcmluZy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2RvY2Jvb2svaW1hZ2VzL3ByZWZlcmVuY2VzL3hzbF9JbnN0YWxsZWRQcm9jZXNzb3JzLnBuZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvZG9jYm9vay9pbWFnZXMvcHJlZmVyZW5jZXMveHNsX0luc3RhbGxlZFByb2Nlc3NvcnMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjk1MDc5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvZG9jYm9vay9pbWFnZXMvcHJlZmVyZW5jZXMveHNsX0luc3RhbGxlZFByb2Nlc3NvcnMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9kb2Nib29rL2ltYWdlcy9wcmVmZXJlbmNlcy94c2xfb3V0cHV0cHJvcGVydGllcy5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2RvY2Jvb2svaW1hZ2VzL3ByZWZlcmVuY2VzL3hzbF9vdXRwdXRwcm9wZXJ0aWVzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUwMGE0Mi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2RvY2Jvb2svaW1hZ2VzL3ByZWZlcmVuY2VzL3hzbF9vdXRwdXRwcm9wZXJ0aWVzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvZG9jYm9vay9pbWFnZXMvcHJlZmVyZW5jZXMveHNsZmVhdHVyZXMucG5nIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9kb2Nib29rL2ltYWdlcy9wcmVmZXJlbmNlcy94c2xmZWF0dXJlcy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ZGJlYzguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9kb2Nib29rL2ltYWdlcy9wcmVmZXJlbmNlcy94c2xmZWF0dXJlcy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2RvY2Jvb2svaW1hZ2VzL3ByZWZlcmVuY2VzL3hzbHByZWZlcmVuY2VzLnBuZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvZG9jYm9vay9pbWFnZXMvcHJlZmVyZW5jZXMveHNscHJlZmVyZW5jZXMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2I3MTg3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvZG9jYm9vay9pbWFnZXMvcHJlZmVyZW5jZXMveHNscHJlZmVyZW5jZXMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9kb2Nib29rL2xhdW5jaGluZy9sYXVuY2hpbmcueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9kb2Nib29rL2xhdW5jaGluZy9sYXVuY2hpbmcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWM3YzUyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvZG9jYm9vay9sYXVuY2hpbmcvbGF1bmNoaW5nLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGNoYXB0ZXIgUFVCTElDICItLy9PQVNJUy8vRFREIERvY0Jvb2sgWE1MIFY0LjUvL0VOIgotICAgICAgICAgICJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2RvY2Jvb2sveG1sLzQuNS9kb2Nib29reC5kdGQiPgotPGNoYXB0ZXI+Ci0JPD9kYmh0bWwgZmlsZW5hbWU9ImxhdW5jaGluZy9sYXVuY2hpbmcuaHRtbCIgPz4KLQk8dGl0bGU+WFNMIExhdW5jaGluZyBhbmQgRGVidWdnaW5nPC90aXRsZT4KLQk8cGFyYT4gWFNMIFRvb2xzIGFkZHMgc3VwcG9ydCBmb3IgWFNMIExhdW5jaCBhbmQgRGVidWdnaW5nIGNvbmZpZ3VyYXRpb25zLiBUaGVzZSBhbGxvdyB5b3UgdG8gc2V0dXAgWFNMIGNvbmZpZ3VyYXRpb25zCi0JCWZvciB2YXJpb3VzIGpvYnMsIGFuZCB0byBhbHNvIGRlYnVnIHhzbCBzdHlsc2hlZXQgdHJhbnNmb3JtYXRpb25zLjwvcGFyYT4KLQk8c2VjdGlvbiBpZD0iWFNMTGF1bmNoIj4KLQkJPD9kYmh0bWwgZmlsZW5hbWU9ImxhdW5jaGluZy9sYXVuY2hpbmcuaHRtbCIgPz4KLQkJPHRpdGxlPlhTTCBMYXVuY2hpbmc8L3RpdGxlPgotCQk8cGFyYT4KLQkJCUluIHRoZSBQcm9qZWN0IEV4cGxvcmVyLCBzaW1wbHkgc2VsZWN0IHRoZSBpbnB1dCBYTUwgZmlsZSBhbmQgdGhlIHN0eWxlc2hlZXQocykgdG8gdHJhbnNmb3JtIGl0LCBhbmQgdGhlbiByaWdodC1jbGljawotCQkJYW5kIHNlbGVjdAotCQkJPGVtcGhhc2lzPlJ1biBBcyA+IFhTTCBUcmFuc2Zvcm1hdGlvbjwvZW1waGFzaXM+Ci0JCQkuCi0JCTwvcGFyYT4KLQkJPG1lZGlhb2JqZWN0PgotCQkJPGltYWdlb2JqZWN0PgotCQkJCTxpbWFnZWRhdGEgYWxpZ249ImNlbnRlciIgZm9ybWF0PSJQTkciIGZpbGVyZWY9Ii4uL2ltYWdlcy9sYXVuY2hpbmcvbGF1bmNoU2hvcnRjdC5wbmciIC8+Ci0JCQk8L2ltYWdlb2JqZWN0PgotCQk8L21lZGlhb2JqZWN0PgotCTwvc2VjdGlvbj4KLQk8c2VjdGlvbiBpZD0iWFNMRGVidWciPgotCSAgICA8P2RiaHRtbCBmaWxlbmFtZT0ibGF1bmNoaW5nL2RlYnVnZ2luZy5odG1sIiA/PgotCQk8dGl0bGU+WFNMVCBEZWJ1Z2dpbmc8L3RpdGxlPgotCQk8cGFyYT4gWFNMIFRvb2xzIHByb3ZpZGVzIGEgZnJhbWV3b3JrIGZvciBYU0xUIHByb2Nlc3NvcnMgdG8gcHJvdmlkZSBkZWJ1Z2dpbmcgc3VwcG9ydC4gVGhlIHN1cHBvcnQgcHJvdmlkZWQgaXMgaGlnaGx5Ci0JCQlkZXBlbmRlbnQgb24gdGhlIHByb2Nlc3NvcnMuIFhTTCBUb29scyBjb21lcyB3aXRoIGJ1aWx0IGluIHN1cHBvcnQgZm9yIHRoZSBYYWxhbiAyLjcuMSBwcm9jZXNzb3IuIERlYnVnZ2luZyBpcyBvbmx5Ci0JCQlhdmFpbGFibGUgZm9yIHRob3NlIHByb2Nlc3NvcnMgdGhhdCBzdXBwb3J0IHRoZSBmZWF0dXJlIGFuZCBwbHVnIGludG8gdGhlIGV4dGVuc2lvbiBwb2ludC4gVGhlIFhTTCBUb29scyBkZWJ1Z2dlcgotCQkJbGV2ZXJhZ2VzIHRoZSBleGlzdGluZyBlY2xpcHNlIHBsYXRmb3JtIERlYnVnIFZpZXc8L3BhcmE+Ci0JCTxwYXJhPgotCQkJSG93IHRoZSBkZWJ1Z2dlciBhY3RzIHdpbGwgZGVwZW5kIG9uIHRoZSBwcm9jZXNzb3IgYmVpbmcgdXNlZC4gTm90IGFsbCBYU0xUIHByb2Nlc3NvcnMgcGFzcyB0aGUgc2FtZSB0eXBlIG9mCi0JCQlpbmZvcm1hdGlvbiB0byB0aGUgZGVidWdnZXIuIFRoZXNlIGRpZmZlcmVuY2VzIHdpbGwgYmUgbm90ZWQgaW4gdGhlCi0JCQk8eHJlZiBsaW5rZW5kPSJYU0xEZWJ1Z1Byb2Nlc3NvclNwZWNpZmljIiAvPgotCQkJc2VjdGlvbi4KLQkJPC9wYXJhPgotCQk8c2VjdGlvbiBpZD0iRGVidWdHZXR0aW5nU3RhcnRlZCI+Ci0JCQk8P2RiaHRtbCBmaWxlbmFtZT0ibGF1bmNoaW5nL2RlYnVnZ2luZ19nZXR0aW5nU3RhcnRlZC5odG1sIiA/PgotCQkJPHRpdGxlPlN0YXJ0aW5nIGEgRGVidWcgU2Vzc2lvbjwvdGl0bGU+Ci0JCQk8cGFyYT4gRGVidWdnaW5nIGlzIHN0YXJ0ZWQgdGhlIHNhbWUgd2F5IGFzIGxhdW5jaGluZyBhbiBYU0wgVHJhbmZvcm1hdGlvbiBpcyBkb25lLiBFeGNlcHQgdGhhdCB0aGUgZGVidWcKLQkJCQljb25maWd1cmF0aW9uIGlzIHVzZWQgaW5zdGVhZCBvZiB0aGUgbm9ybWFsIGxhdW5jaCBjb25maWd1cmF0aW9uLiBJZiBhIGRlYnVnZ2luZyBzZXNzaW9uIGlzIHN0YXJ0ZWQgb24gYSBwcm9jZXNzb3IKLQkJCQl0aGF0IGRvZXMgbm90IHN1cHBvcnQgZGVidWdnaW5nLCBhIGRpYWxvZyB3aWxsIGFzayBpZiB5b3Ugd2FudCB0byBzd2l0Y2ggdG8gb25lIG9mIHRoZSBzdXBwb3J0ZWQgZGVidWdnZXJzLjwvcGFyYT4KLQkJCTxub3RlPgotCQkJCTx0aXRsZT5EZWZhdWx0IEpSRTwvdGl0bGU+Ci0JCQkJPHBhcmE+IFRoZSBkZWZhdWx0IEpSRSBkb2VzIG5vdCBoYXZlIGJ1aWx0IGluIHN1cHBvcnQgZm9yIGRlYnVnZ2luZywgZXZlbiB0aG91Z2ggaXQgaXMgYmFzZWQgb24gQXBhY2hlIFhhbGFuLiBJdCBpcwotCQkJCQlyZWNvbW1lbmRlZCB0byB1c2UgWGFsYW4gb3IgYW5vdGhlciBwcm9jZXNzb3IgcHJvdmlkZWQgYnkgYW4gYWRvcHRlciB0byBkbyB5b3VyIHRyYW5zZm9ybWF0aW9ucy4gVGhlIGRlZmF1bHQKLQkJCQkJcHJvY2Vzc29yIGlzIGtub3duIHRvIGhhdmUgc29tZSBpc3N1ZXMgdGhhdCBYYWxhbiBhbmQgb3RoZXIgcHJvY2Vzc29ycyBkbyBub3QgaGF2ZS48L3BhcmE+Ci0JCQk8L25vdGU+Ci0JCTwvc2VjdGlvbj4KLQkJPHNlY3Rpb24gaWQ9IlhTTERlYnVnQ29tbW9uIj4KLQkJPD9kYmh0bWwgZmlsZW5hbWU9ImxhdW5jaGluZy9kZWJ1Z2dpbmdfY29tbW9uLmh0bWwiID8+Ci0JCQk8dGl0bGU+Q29tbW9uIERlYnVnZ2luZyBPcGVyYXRpb25zPC90aXRsZT4KLQkJCTxwYXJhPgotCQkJCVhTTFQgZGVidWdnaW5nIGlzIGhhbmRsZWQgYnkgdGhlIGVjbGlwc2UgcGxhdGZvcm1zIGRlYnVnZ2luZyBmcmFtZXdvcmsgc3VwcG9ydCBhcyBvdXRsaW5lZCBpbiB0aGUKLQkJCQk8dWxpbmsgdXJsPSIvaGVscC90b3BpYy9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MuaXN2L2d1aWRlL2RlYnVnX2RlYnVnLmh0bSI+IlByb2dyYW0gRGVidWcgYW5kIExhdW5jaCBTdXBwb3J0IjwvdWxpbms+Ci0JCQkJLiBDb21tb24gb3BlcmF0aW9ucyBsaWtlIHN0ZXBwaW5nIGludG8gKEY1KSwgc3RlcHBpbmcgb3ZlciAoRjYpLCBwYXVzaW5nLCBydW5uaW5nIHRvIGEgYnJlYWtwb2ludCwgYW5kIHJlbGF1bmNoaW5nCi0JCQkJYXJlIHN1cHBvcnRlZC4gSW4gYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkIFZhcmlhYmxlIGFuZCBCcmVha3BvaW50IHZpZXdzIHByb3ZpZGVkIGJ5IHRoZSBwbGF0Zm9ybSwgdGhlcmUgYXJlIHNvbWUKLQkJCQlYU0xUIHNwZWNpZmljIHZpZXdzIGFuZCBmdW5jdGlvbmFsaXR5IGFzIHdlbGwuIEFsbCBvZiB0aGVzZSBhcmUgY29tbW9uIHJlZ2FyZGxlc3Mgb2YgdGhlIHBhcnRpY3VsYXIgWFNMVCBkZWJ1Z2dlcgotCQkJCWJlaW5nIHVzZWQuCi0JCQk8L3BhcmE+Ci0JCQk8dGlwPgotCQkJCTx0aXRsZT5JbnRyb2R1Y3Rpb24gdG8gRWNsaXBzZSBEZWJ1Z2dpbmc8L3RpdGxlPgotCQkJCTxwYXJhPgotCQkJCQk8dWxpbmsgdXJsPSJodHRwOi8vd3d3Lm1jcy52dXcuYWMubnovY291cnNlcy9DT01QMjA1LzIwMDdUMS90b29scy9lY2xpcHNlL2RlYnVnZ2luZy9iYXNpY3Muc2h0bWwiPkJhc2ljIERlYnVnZ2luZyBpbiBFY2xpcHNlPC91bGluaz4KLQkJCQkJY29udGFpbnMgYSBnb29kIGdlbmVyYWwgaW50cm9kdWN0aW9uIHRvIHRoZSBiYXNpYyBmZWF0dXJlcyBwcm92aWRlZCBieSB0aGUgRWNsaXBzZSBEZWJ1ZyB2aWV3LiBYU0wgVG9vbHMgbGV2ZXJhZ2VzCi0JCQkJCW1hbnkgb2YgdGhlc2UgZmVhdHVyZXMgYW5kIHRoZSBzYW1lIGNvbmNlcHRzIGFwcGx5IHRvIHRoZSBYU0wgVG9vbHMgZGVidWdnZXIuCi0JCQkJPC9wYXJhPgotCQkJPC90aXA+Ci0JCQk8cGFyYT4gSW4gYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkIGZlYXR1cmVzIGFuZCBmdW5jdGlvbmFsaXR5LCB0aGUgWFNMIFRvb2xzIGRlYnVnZ2luZyBzdXBwb3J0IGFkZHMgdGhlIGZvbGxvd2luZwotCQkJCWFkZGl0aW9uYWwgaXRlbXM6PC9wYXJhPgotCQkJPGl0ZW1pemVkbGlzdD4KLQkJCQk8bGlzdGl0ZW0+Ci0JCQkJCTxwYXJhPiBSZXN1bHQgVmlldzwvcGFyYT4KLQkJCQk8L2xpc3RpdGVtPgotCQkJCTxsaXN0aXRlbT4KLQkJCQkJPHBhcmE+WFNMVCBzcGVjaWZpYyBWYXJpYWJsZXM8L3BhcmE+Ci0JCQkJPC9saXN0aXRlbT4KLQkJCQk8bGlzdGl0ZW0+Ci0JCQkJCTxwYXJhPlhTTFQgUHJvY2Vzc29yIFNwZWNpZmljIEZ1bmN0aW9uYWxpdHk8L3BhcmE+Ci0JCQkJPC9saXN0aXRlbT4KLQkJCTwvaXRlbWl6ZWRsaXN0PgotCQkJPHNlY3Rpb24gaWQ9IlhTTERlYnVnUmVzdWx0VmlldyI+Ci0JCQk8P2RiaHRtbCBmaWxlbmFtZT0ibGF1bmNoaW5nL2RlYnVnZ2luZ19yZXN1bHR2aWV3Lmh0bWwiID8+Ci0JCQkJPHRpdGxlPlJlc3VsdCBWaWV3PC90aXRsZT4KLQkJCQk8cGFyYT4gVGhlIFhTTFQgRGVidWdnZXIgaGFzIGEgcmVzdWx0IHZpZXcuIFRoaXMgd2lsbCBzaG93IHRoZSBvdXRwdXQgdGhhdCB0aGUgc3R5bGVzaGVldCBoYXMgZ2VuZXJhdGVkIHRvIHRoZQotCQkJCQljdXJyZW50IGJyZWFrIHBvaW50IG9yIHNpbmNlIHRoZSBsYXN0IHN0ZXAgY29tbWFuZCB3YXMgaXNzdWVkLjwvcGFyYT4KLQkJCQk8bWVkaWFvYmplY3Q+Ci0JCQkJCTxpbWFnZW9iamVjdD4KLQkJCQkJCTxpbWFnZWRhdGEgYWxpZ249ImNlbnRlciIgZm9ybWF0PSJQTkciIGZpbGVyZWY9Ii4uL2ltYWdlcy9sYXVuY2hpbmcvcmVzdWx0Vmlldy5wbmciIC8+Ci0JCQkJCTwvaW1hZ2VvYmplY3Q+Ci0JCQkJPC9tZWRpYW9iamVjdD4KLQkJCQk8cGFyYT4gVGhlIHJlc3VsdCB2aWV3IGlzIHVwZGF0ZWQgdGhyb3VnaG91dCB0aGUgZGVidWdnaW5nIHByb2Nlc3MsIGFuZCBpcyB1c2VmdWwgdG8gaGVscCBzZWUgd2hhdCBvdXRwdXQgaXMKLQkJCQkJZ2VuZXJhdGVkIGF0IHNwZWNpZmljIHBvaW50cyBkdXJpbmcgYSB0cmFuc2Zvcm1hdGlvbi48L3BhcmE+Ci0JCQk8L3NlY3Rpb24+Ci0JCQk8c2VjdGlvbiBpZD0iWFNMRGVidWdWYXJpYWJsZXMiPgotCQkJPD9kYmh0bWwgZmlsZW5hbWU9ImxhdW5jaGluZy9kZWJ1Z2dpbmdfdmFyaWFibGVzdmlldy5odG1sIiA/PgotCQkJCTx0aXRsZT5WYXJpYWJsZXMgVmlldzwvdGl0bGU+Ci0JCQkJPHBhcmE+IFRoZSB2YXJpYWJsZXMgdmlldyB3aWxsIHNob3cgYWxsIHRoZSBsb2NhbCBhbmQgZ2xvYmFsIHZhcmlhYmxlcyBhbmQgcGFyYW1zIHRoYXQgYXJlIGN1cnJlbnRseSBpbiBzY29wZS4gVGhlcmUKLQkJCQkJYXJlIHR3byB0eXBlcyBvZiB2YXJpYWJsZXMgdGhhdCBjYW4gYmUgdmlld3MuPC9wYXJhPgotCQkJCTxtZWRpYW9iamVjdD4KLQkJCQkJPGltYWdlb2JqZWN0PgotCQkJCQkJPGltYWdlZGF0YSBhbGlnbj0iY2VudGVyIiBmb3JtYXQ9IlBORyIgZmlsZXJlZj0iLi4vaW1hZ2VzL2xhdW5jaGluZy9ub2Rlc2V0VmFyaWFibGUucG5nIiAvPgotCQkJCQk8L2ltYWdlb2JqZWN0PgotCQkJCTwvbWVkaWFvYmplY3Q+Ci0JCQkJPGl0ZW1pemVkbGlzdD4KLQkJCQkJPHRpdGxlPlZhcmlhYmxlIFR5cGVzPC90aXRsZT4KLQkJCQkJPGxpc3RpdGVtPgotCQkJCQkJPHBhcmE+Ci0JCQkJCQkJPGVtcGhhc2lzPlN0cmluZzwvZW1waGFzaXM+Ci0JCQkJCQkJLSBUaGVzZSBjb250YWluIHRleHQgdmFsdWVzLiBUaGlzIGNvdWxkIGJlIHN0cmluZ3Mgb2YgdGV4dCwgbnVtYmVycywgb3Igb3RoZXIgY2hhcmFjdGVycy4KLQkJCQkJCTwvcGFyYT4KLQkJCQkJPC9saXN0aXRlbT4KLQkJCQkJPGxpc3RpdGVtPgotCQkJCQkJPHBhcmE+Ci0JCQkJCQkJPGVtcGhhc2lzPk5vZGVzZXRzPC9lbXBoYXNpcz4KLQkJCQkJCQktIE5vZGVzZXRzIGFyZSByZXByZXNlbnRlZCBpbiB0aGUgdmFyaWFibGVzIHZpZXcgYXMgZXhwYW5kYWJsZSB2YXJpYWJsZXMuIFRoZXkgY29udGFpbiBzZXF1ZW5jZXMgb2Ygbm9kZXMuIFRoZQotCQkJCQkJCXR5cGUgb2Ygbm9kZXMgYXJlIHJlcHJlc2VudGVkIGJ5IGljb25zIGZvciBlbGVtZW50cywgYXR0cmlidXRlcywgdGV4dCwgY29tbWVudHMgb3IgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMuCi0JCQkJCQk8L3BhcmE+Ci0JCQkJCTwvbGlzdGl0ZW0+Ci0JCQkJPC9pdGVtaXplZGxpc3Q+Ci0JCQkJPG5vdGU+Ci0JCQkJCTx0aXRsZT5DYW4gSSBjaGFuZ2UgdGhlIHZhbHVlIG9mIHZhcmlhYmxlcz88L3RpdGxlPgotCQkJCQk8cGFyYT4gQ3VycmVudGx5IHRoZSBYU0xUIERlYnVnZ2VyIGRvZXMgbm90IHN1cHBvcnQgY2hhbmdpbmcgdGhlIHZhbHVlcyBvciBjb250ZW50cyBvZiBhIHZhcmlhYmxlLiBBbGwgWFNMVAotCQkJCQkJdmFyaWFibGVzIGFyZSByZWFkIG9ubHkuPC9wYXJhPgotCQkJCTwvbm90ZT4KLQkJCTwvc2VjdGlvbj4KLQkJPC9zZWN0aW9uPgotCQk8c2VjdGlvbiBpZD0iWFNMRGVidWdQcm9jZXNzb3JTcGVjaWZpYyI+Ci0JCQk8P2RiaHRtbCBmaWxlbmFtZT0ibGF1bmNoaW5nL2RlYnVnZ2luZ19wcm9jZXNzb3JzLmh0bWwiID8+Ci0JCQk8dGl0bGU+WFNMVCBQcm9jZXNzb3IgU3BlY2lmaWMgU3VwcG9ydDwvdGl0bGU+Ci0JCQk8cGFyYT4gVmFyaW91cyBYU0xUIHByb2Nlc3NvcnMgcHJvdmlkZSB2YXJpb3VzIGxldmVscyBvZiBkZWJ1Z2dpbmcgc3VwcG9ydC4gTWFueSBkbyBub3QgcHJvdmlkZSBzdXBwb3J0IGZvciBkZWJ1Z2dpbmcKLQkJCQlvZiBzdHlsZXNoZWV0cywgYW5kIHRodXMgY2FuJ3QgYmUgdXNlZCBmb3IgZGVidWdnaW5nLiBYU0wgVG9vbHMgcHJvdmlkZXMgYmFzaWMgc3VwcG9ydCBmb3IgWGFsYW4sIGFuZCBjYW4gYmUgdXNlZCBhcwotCQkJCWEgZ3VpZGUgZm9yIGFkb3B0ZXJzIG9uIGhvdyB0byBpbXBsZW1lbnQgdGhlaXIgb3duIHNwZWNpZmljIGRlYnVnZ2luZyBzdXBwb3J0IGZvciBvdGhlciBwcm9jZXNzb3JzLjwvcGFyYT4KLQkJCTxzZWN0aW9uIGlkPSJYU0xEZWJ1Z1hhbGFuIj4KLQkJCQk8dGl0bGU+WFNMIERlYnVnZ2luZyB3aXRoIFhhbGFuPC90aXRsZT4KLQkJCQk8cGFyYT4gWGFsYW4gcHJvdmlkZXMgZ2VuZXJhbCBzdHlsZXNoZWV0IGV4ZWN1dGlvbiBhbmQgZXZhbGF0aW9uIGZ1bmN0aW9uYWxpdHkuIEhvd2V2ZXIgdGhlcmUgYXJlIGEgZmV3IHRoaW5ncyB0aGF0Ci0JCQkJCVhhbGFuIGRvZXMgbm90IHN1cHBvciB0aGF0IG90aGVyIHByb2Nlc3NvcnMgZG8uPC9wYXJhPgotCQkJCTxvcmRlcmVkbGlzdD4KLQkJCQkJPHRpdGxlPlhhbGFuIERlYnVnZ2luZyBJc3N1ZXM8L3RpdGxlPgotCQkJCQk8bGlzdGl0ZW0+Ci0JCQkJCQk8cGFyYT4KLQkJCQkJCQk8ZW1waGFzaXM+QnJlYWtwb2ludHM8L2VtcGhhc2lzPgotCQkJCQkJCS0gWGFsYW4gZG9lcyBub3Qgc3VwcG9ydCBzdG9wcGluZyBhdCBHbG9iYWwgVmFyaWFibGVzIG9yIFBhcmFtZXRlcnMgd2hlbiBhIGRlYnVnZ2luZyBzZXNzaW9uIGlzIHN0YXJ0ZWQuIEl0IHdpbGwKLQkJCQkJCQlhdXRvbWF0aWNhbGx5IHN0YXJ0IGF0IHRoZSBmaXJzdCB0ZW1wbGF0ZS4gQnJlYWsgcG9pbnRzIG11c3QgYmUgcGxhY2VkIGluIHRlbXBsYXRlcyB0byBiZSBob25vcmVkLiBUaGUgcmVhc29uIGZvcgotCQkJCQkJCXRoaXMgaXMgdGhhdCBYYWxhbiBsYXppbHkgaW5pdGlhbGl6ZXMgdGhlIHZhcmlhYmxlcyBvbmx5IHdoZW4gdGhleSBhcmUgZmlyc3QgdXNlZC4KLQkJCQkJCTwvcGFyYT4KLQkJCQkJPC9saXN0aXRlbT4KLQkJCQkJPGxpc3RpdGVtPgotCQkJCQkJPHBhcmE+Ci0JCQkJCQkJPGVtcGhhc2lzPlhTTFQgVGV4dCBlbGVtZW50czwvZW1waGFzaXM+Ci0JCQkJCQkJLSBYYWxhbiBkb2VzIG5vdCBzZW5kIG5vdGlmaWNhdGlvbnMgb2YgeHNsOnRleHQgZWxlbWVudHMuIFRoZXNlIGFyZSBza2lwcGVkIG92ZXIgd2hlbiBkZWJ1Z2dpbmcuCi0JCQkJCQk8L3BhcmE+Ci0JCQkJCTwvbGlzdGl0ZW0+Ci0JCQkJCTxsaXN0aXRlbT4KLQkJCQkJCTxwYXJhPgotCQkJCQkJCTxlbXBoYXNpcz5CdWlsdCBJbiBUZW1wbGF0ZXM8L2VtcGhhc2lzPgotCQkJCQkJCS0gWGFsYW4gZG9lcyBwcm92aWRlIG5vdGlmaWNhdGlvbiB3aGVuIHRoZSBidWlsdCBpbiB0ZW1wbGF0ZXMgYXJlIGNhbGxlZCwgYnV0IGN1cnJlbnRseSB0aGUgZGVidWdnZXIgZG9lcyBub3QKLQkJCQkJCQlzdXBwb3J0IG9yIGRpc3BsYXkgc3RlcHBpbmcgaW50byB0aGVzZSB0ZW1wbGF0ZXMuCi0JCQkJCQk8L3BhcmE+Ci0JCQkJCTwvbGlzdGl0ZW0+Ci0JCQkJPC9vcmRlcmVkbGlzdD4KLQkJCTwvc2VjdGlvbj4KLQkJPC9zZWN0aW9uPgotCTwvc2VjdGlvbj4KLTwvY2hhcHRlcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2RvY2Jvb2svbGVnYWwueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9kb2Nib29rL2xlZ2FsLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZlODg0NS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2RvY2Jvb2svbGVnYWwueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBjaGFwdGVyIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBEb2NCb29rIFhNTCBWNC41Ly9FTiIKLSAgICAgICAgICAiaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9kb2Nib29rL3htbC80LjUvZG9jYm9va3guZHRkIj4KLTxjaGFwdGVyPgotCTw/ZGJodG1sIGZpbGVuYW1lPSJsZWdhbC5odG1sIiA/PgotCTx0aXRsZT5Ob3RpY2VzPC90aXRsZT4KLQk8cGFyYT4KLSAgICAgIFRoZSBtYXRlcmlhbCBpbiB0aGlzIGd1aWRlIGlzIENvcHlyaWdodCAoYykgRG91ZyBTYXRjaHdlbGwgKDx1bGluayB1cmw9Imh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrIj5DaGFzZSBUZWNobm9sb2d5IEx0ZDwvdWxpbms+KSwgCi0gICAgICBEYXZpZCBDYXJ2ZXIgKDx1bGluayB1cmw9Imh0dHA6Ly93d3cuc3RhcnN0YW5kYXJkLm9yZyI+U3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsPC91bGluaz4pCi0gICAgICBhbmQgb3RoZXJzIDIwMDguCi0gICAgPC9wYXJhPgotICAgIDxwYXJhPgotCQlUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLQkJdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0JCTx1bGluayB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvdWxpbms+LgotICAgIDwvcGFyYT4KLQk8cGFyYT4KLQkJPHVsaW5rIHVybD0iYWJvdXQuaHRtbCI+VGVybXMgYW5kIGNvbmRpdGlvbnMgcmVnYXJkaW5nIHRoZSB1c2Ugb2YgdGhpcyBndWlkZS48L3VsaW5rPi4KLQk8L3BhcmE+Ci08L2NoYXB0ZXI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9kb2Nib29rL3ByZWZlcmVuY2VzL3ByZWZlcmVuY2VzLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvZG9jYm9vay9wcmVmZXJlbmNlcy9wcmVmZXJlbmNlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMDk0NjYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9kb2Nib29rL3ByZWZlcmVuY2VzL3ByZWZlcmVuY2VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGNoYXB0ZXIgUFVCTElDICItLy9PQVNJUy8vRFREIERvY0Jvb2sgWE1MIFY0LjUvL0VOIgotICAgICAgICAgICJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2RvY2Jvb2sveG1sLzQuNS9kb2Nib29reC5kdGQiPgotPGNoYXB0ZXIgaWQ9IlhTTFByZWZlcmVuY2VzIj4KLQk8P2RiaHRtbCBmaWxlbmFtZT0icHJlZmVyZW5jZXMveHNscHJlZmVyZW5jZXMuaHRtbCIgPz4KLSAgICA8dGl0bGU+WFNMIFRvb2xzIFByZWZlcmVuY2VzPC90aXRsZT4KLSAgICA8cGFyYT4gVGhlIFhTTCBQcmVmZXJlbmNlIHBhZ2VzIGhhcyBzZXZlcmFsIHN1YiBzZWN0aW9ucy4gRWFjaCBvZiB0aGVzZSBhbGxvdyBmb3IKLSAgICAgICAgY29uZmlndXJhdGlvbiBvZiB2YXJpb3VzIGFzcGVjdHMgb2YgdGhlIHByZWZlcmVuY2VzLiBGcm9tIHRoZSBjb250cm9sbGluZyBvZiB0aGUKLSAgICAgICAgZGVmYXVsdCBYU0wgcHJvY2Vzc29yIHRvIGJlIHVzZWQgZHVyaW5nIHRyYW5zZm9ybWF0aW9ucy4gVG8gZXh0ZW5kaW5nIHRoZSBjb250ZW50Ci0gICAgICAgIGFzc2lzdCBzdXBwb3J0IG9mIHRoZSBYUGF0aCBmdW5jdGlvbnMgYXZhaWxhYmxlIGluIHRoZSBYTUwgZWRpdG9yLjwvcGFyYT4KLSAgICA8ZmlndXJlIGlkPSJmaWdfWFNMUHJlZmVyZW5jZXMiPgotICAgICAgICA8dGl0bGU+WFNMIFRvb2xzIFByZWZlcmVuY2VzPC90aXRsZT4KLSAgICAgICAgPG1lZGlhb2JqZWN0PgotICAgICAgICAgICAgPGltYWdlb2JqZWN0PgotICAgICAgICAgICAgICAgIDxpbWFnZWRhdGEgYWxpZ249ImNlbnRlciIgZmlsZXJlZj0iLi4vaW1hZ2VzL3ByZWZlcmVuY2VzL3hzbHByZWZlcmVuY2VzLnBuZyIKLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0PSJQTkciLz4KLSAgICAgICAgICAgIDwvaW1hZ2VvYmplY3Q+Ci0gICAgICAgIDwvbWVkaWFvYmplY3Q+Ci0gICAgPC9maWd1cmU+Ci0gICAgPHNlY3Rpb24gaWQ9IlhTTEZlYXR1cmVzIj4KLQkJPD9kYmh0bWwgZmlsZW5hbWU9InByZWZlcmVuY2VzL3hzbGZlYXR1cmVzLmh0bWwiID8+Ci0gICAgICAgIDx0aXRsZT5GZWF0dXJlczwvdGl0bGU+Ci0gICAgICAgIDxwYXJhPiBUaGUgWFNMIEZlYXR1cmVzIHByZWZlcmVuY2UgcGFnZSBhbGxvd3MgZm9yIHRoZSBjb25maWd1cmF0aW9uIG9mIGZlYXR1cmVzCi0gICAgICAgICAgICBmb3IgYSBwYXJ0aWN1bGFyIHByb2Nlc3Nvci4gWFNMIFRvb2xzIGNvbWVzIHdpdGggWGFsYW4gMi43LjAgYnkgZGVmYXVsdC4KLSAgICAgICAgICAgIEFkb3B0ZXJzIGNhbiBleHRlbmQgYW5kIGluY2x1ZGUgdGhlaXIgb3duIHNwZWNpZmljIGZlYXR1cmVzIGZvciB0aGVpciBvd24KLSAgICAgICAgICAgIHByb2Nlc29vcnMuIEFuIGFkb3B0ZXIgY291bGQgZXh0ZW5kIHRoZSB0b29saW5nIHRvIHN1cHBvcnQgWFNMVCAyLjAKLSAgICAgICAgICAgIHRyYW5zZm9ybWF0aW9ucywgYW5kIGZlYXR1cmVzIHBhcnRpY3VsYXIgdG8gdGhhdCBwYXJzZXIuPC9wYXJhPgotICAgICAgICA8bWVkaWFvYmplY3Q+Ci0gICAgICAgICAgICA8aW1hZ2VvYmplY3Q+Ci0gICAgICAgICAgICAgICAgPGltYWdlZGF0YSBhbGlnbj0iY2VudGVyIiBmb3JtYXQ9IlBORyIKLSAgICAgICAgICAgICAgICAgICAgZmlsZXJlZj0iLi4vaW1hZ2VzL3ByZWZlcmVuY2VzL3hzbGZlYXR1cmVzLnBuZyIvPgotICAgICAgICAgICAgPC9pbWFnZW9iamVjdD4KLSAgICAgICAgPC9tZWRpYW9iamVjdD4KLSAgICAgICAgPHBhcmE+Ci0gICAgICAgICAgICBUaGUKLSAgICAgICAgICAgIDxlbXBoYXNpcyByb2xlPSJib2xkIj5Qcm9jZXNzb3IgVHlwZTwvZW1waGFzaXM+Ci0gICAgICAgICAgICBhbGxvd3MgeW91IHRvIHNldCBmZWF0dXJlcyBmb3IgYSBzcGVjaWZpYyBwcm9jZXNzb3IuIEluIHRoaXMgY2FzZSB0aGlzIGlzIGZvcgotICAgICAgICAgICAgdGhlIHByb2Nlc3NvciB0aGF0IGlzIGJlaW5nIGluc3RhbGxlZC4gWFNMIFRvb2xzIGNvbWVzIHdpdGggWGFsYW4gMi43LjAsIGFuZAotICAgICAgICAgICAgaXQgaXMgdGhlIG9ubHkgYXZhaWxhYmxlIHByb2Nlc3NvciB0eXBlIGJ5IGRlZmF1bHQuCi0gICAgICAgIDwvcGFyYT4KLSAgICAgICAgPHBhcmE+IFRoZSBmZWF0dXJlIHRhYmxlIGxpc3RzIHRoZSBmZWF0dXJlcyB0aGF0IGFyZSBzcGVjaWZpYyB0byB0aGUgcHJvY2Vzc29yCi0gICAgICAgICAgICB0aGF0IHdhcyBzZWxlY3RlZC4gQXMgeW91IHNlbGVjdCBlYWNoIG9mIHRoZSBmZWF0dXJlcywgaW5mb3JtYXRpb24gcmVnYXJkaW5nCi0gICAgICAgICAgICB0aGF0IGZlYXR1cmUgYW5kIGl0J3MgYWJpbGl0aWVzIGlzIGRpc3BsYXllZCBpbiB0aGUgZGVzY3JpcHRpb24gYm94LiBCeQotICAgICAgICAgICAgY2xpY2tpbmcgaW4gdGhlIHZhbHVlIGNvbHVtbiwgbmV4dCB0byB0aGUgZmVhdHVyZSB5b3Ugd2FudCB0byBzZXQgdGhlIHZhbHVlCi0gICAgICAgICAgICBmb3IsIHRoZSB1c2VyIGNhbiBzZXQgdGhlIGZlYXR1cmUuPC9wYXJhPgotICAgIDwvc2VjdGlvbj4KLSAgICA8c2VjdGlvbiBpZD0iWFNMUHJvY2Vzc29ycyI+Ci0JCTw/ZGJodG1sIGZpbGVuYW1lPSJwcmVmZXJlbmNlcy94c2xwcm9jZXNzb3JzLmh0bWwiID8+Ci0gICAgICAgIDx0aXRsZT5JbnN0YWxsZWQgUHJvY2Vzc29yczwvdGl0bGU+Ci0gICAgICAgIDxwYXJhPiBUaGUgaW5zdGFsbGVkIHByb2Nlc3NvcnMgcGFnZSBsZXRzIHlvdSBwaWNrIHdoaWNoIG9mIHRoZSBpbnN0YWxsZWQgWFNMVAotICAgICAgICAgICAgcHJvY2Vzc29ycyB3aWxsIGJlIHVzZWQgYnkgZGVmYXVsdC4gVGhlIGRlZmF1bHQgaXMgdGhlIFN5c3RlbSBEZWZhdWx0Ci0gICAgICAgICAgICBQcm9jZXNvb3IsIGJ1dCB5b3UgY2FuIHNlbGVjdCBhbnkgb2YgdGhlIGF2YWlsYWJsZSBwcm9jZXNzb3JzIHRvIGJlIHVzZWQgYXMKLSAgICAgICAgICAgIHRoZSBkZWZhdWx0IHByb2Nlc3Nvci48L3BhcmE+Ci0gICAgICAgIDxtZWRpYW9iamVjdD4KLSAgICAgICAgICAgIDxpbWFnZW9iamVjdD4KLSAgICAgICAgICAgICAgICA8aW1hZ2VkYXRhIGFsaWduPSJjZW50ZXIiCi0gICAgICAgICAgICAgICAgICAgIGZpbGVyZWY9Ii4uL2ltYWdlcy9wcmVmZXJlbmNlcy94c2xfSW5zdGFsbGVkUHJvY2Vzc29ycy5wbmciIGZvcm1hdD0iUE5HIi8+Ci0gICAgICAgICAgICA8L2ltYWdlb2JqZWN0PgotICAgICAgICA8L21lZGlhb2JqZWN0PgotICAgIDwvc2VjdGlvbj4KLSAgICA8c2VjdGlvbiBpZD0iWFNMT3V0cHV0UHJvcGVydGllcyI+Ci0JCTw/ZGJodG1sIGZpbGVuYW1lPSJwcmVmZXJlbmNlcy94c2xvdXRwdXRwcm9wZXJ0aWVzLmh0bWwiID8+Ci0gICAgICAgIDx0aXRsZT5PdXRwdXQgUHJvcGVydGllczwvdGl0bGU+Ci0gICAgICAgIDxwYXJhPiBUaGUgdmFyaW91cyB4c2wgcHJvY2Vzc29ycyBzdXBwb3J0IGEgd2lkZSB2YXJpZXR5IG9mIHByb2Nlc3NvciBzcGVjaWZpYwotICAgICAgICAgICAgdHdlYWtzLiBIb3dldmVyIHRoZXJlIGFyZSBzZXZlcmFsIFN0YW5kYXJkIHByb2Nlc3NvciBmZWF0dXJlcyB0aGF0IGFsbCBYU0xUCi0gICAgICAgICAgICBwcm9jZXNzb3JzIHN1cHBvcnQuIFRoZXNlIG9wdGlvbnMgY2FuIGJlIHNldCBhbmQgd2lsbCBhY3QgYXMgdGhlIGRlZmF1bHRzIGZvcgotICAgICAgICAgICAgYWxsIHRyYW5zZm9ybWF0aW9ucyB1bmxlc3MgdGhleSBhcmUgc3BlY2lmaWNhbGx5IG92ZXJyaWRlbiBieSB0aGUgc3R5bGVzaGVldAotICAgICAgICAgICAgb3IgdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uLjwvcGFyYT4KLSAgICAgICAgPG1lZGlhb2JqZWN0PgotICAgICAgICAgICAgPGltYWdlb2JqZWN0PgotICAgICAgICAgICAgICAgIDxpbWFnZWRhdGEgYWxpZ249ImNlbnRlciIKLSAgICAgICAgICAgICAgICAgICAgZmlsZXJlZj0iLi4vaW1hZ2VzL3ByZWZlcmVuY2VzL3hzbF9vdXRwdXRwcm9wZXJ0aWVzLnBuZyIgZm9ybWF0PSJQTkciLz4KLSAgICAgICAgICAgIDwvaW1hZ2VvYmplY3Q+Ci0gICAgICAgIDwvbWVkaWFvYmplY3Q+Ci0gICAgICAgIDxwYXJhPiBJbiBhZGRpdGlvbiB0byB0aGUgU3RhbmRhcmQgT3V0cHV0IFByb3BlcnRpZXMsIGVhY2ggWFNMVCBwcm9jZXNzb3IgY2FuIGhhdmUKLSAgICAgICAgICAgIHByb2Nlc3NvcnMgc3BlY2lmaWMgZmVhdHVyZXMuPC9wYXJhPgotICAgIDwvc2VjdGlvbj4KLSAgICA8c2VjdGlvbiBpZD0iWFBhdGhUZW1wbGF0ZXMiPgotCQk8P2RiaHRtbCBmaWxlbmFtZT0icHJlZmVyZW5jZXMveHBhdGh0ZW1wbGF0ZXMuaHRtbCIgPz4KLSAgICAgICAgPHRpdGxlPlhQYXRoIFRlbXBsYXRlczwvdGl0bGU+Ci0gICAgICAgIDxwYXJhPiBYUGF0aCB0ZW1wbGF0ZSBwcm9wb3NhbCBpcyBzdXBwb3J0ZWQgYnkgdGhlIFhTTCBUb29saW5nIHByb2plY3QgdGhyb3VnaCB0aGUKLSAgICAgICAgICAgIGJ1aWx0IGluIHRlbXBsYXRlIGZ1bmN0aW9uYWxpdHkgb2YgZWNsaXBzZS4gVXNlcnMgYW5kIEFkb3B0ZXJzIGNhbiBhZGQgdGhlaXIKLSAgICAgICAgICAgIG93biBzcGVjaWZpYyB4cGF0aCBleHRlbnNpb25zIGZvciBwcm9jZXNzb3Igc3BlY2lmaWMgZXh0ZW5zaW9ucy4gQW4gZXhhbXBsZQotICAgICAgICAgICAgd291bGQgYmUgdG8gYWRkIHRoZSBFWFNMVCBleHRlbnNpb25zIGZvciBwcm9wb3NhbCBzdXBwb3J0LjwvcGFyYT4KLSAgICAgICAgPG1lZGlhb2JqZWN0PgotICAgICAgICAgICAgPGltYWdlb2JqZWN0PgotICAgICAgICAgICAgICAgIDxvYmplY3RpbmZvPgotICAgICAgICAgICAgICAgICAgICA8dGl0bGU+WFBhdGggVGVtcGxhdGVzPC90aXRsZT4KLSAgICAgICAgICAgICAgICA8L29iamVjdGluZm8+Ci0gICAgICAgICAgICAgICAgPGltYWdlZGF0YSBhbGlnbj0iY2VudGVyIiBmaWxlcmVmPSIuLi9pbWFnZXMvcHJlZmVyZW5jZXMvWFBhdGhUZW1wbGF0ZXMucG5nIgotICAgICAgICAgICAgICAgICAgICBmb3JtYXQ9IlBORyIvPgotICAgICAgICAgICAgPC9pbWFnZW9iamVjdD4KLSAgICAgICAgPC9tZWRpYW9iamVjdD4KLSAgICAgICAgPHBhcmE+IFRoZSBmb2xsb3dpbmcgY29udGVudCB0eXBlcyBhcmUgYXZhaWxhYmxlOjwvcGFyYT4KLSAgICAgICAgPGl0ZW1pemVkbGlzdD4KLSAgICAgICAgICAgIDxsaXN0aXRlbT4KLSAgICAgICAgICAgICAgICA8cGFyYT4KLSAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzIHJvbGU9ImJvbGQiPmF4aXM8L2VtcGhhc2lzPgotICAgICAgICAgICAgICAgICAgICAtIGFuIFhQYXRoIG5hdmlnYXRpb24gYXhpcyBzdGF0ZW1lbnQuCi0gICAgICAgICAgICAgICAgPC9wYXJhPgotICAgICAgICAgICAgPC9saXN0aXRlbT4KLSAgICAgICAgICAgIDxsaXN0aXRlbT4KLSAgICAgICAgICAgICAgICA8cGFyYT4KLSAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzIHJvbGU9ImJvbGQiPmV4c2x0PC9lbXBoYXNpcz4KLSAgICAgICAgICAgICAgICAgICAgLSBBbiBYUGF0aCBzdGF0ZW1lbnQgdGhhdCBpcyBkZWZpbmVkIGJ5IHRoZQotICAgICAgICAgICAgICAgICAgICA8dWxpbmsgdXJsPSJodHRwOi8vd3d3LmV4c2x0Lm9yZy8iPkVYU0xUPC91bGluaz4KLSAgICAgICAgICAgICAgICAgICAgbGlicmFyeS4gWGFsYW4gYW5kIG1vc3Qgb3RoZXIgcHJvY2Vzc29ycyBoYXZlIGJ1aWx0IGluIHN1cHBvcnQgZm9yIHRoZQotICAgICAgICAgICAgICAgICAgICBFWFNMVCBsaWJyYXJ5LgotICAgICAgICAgICAgICAgIDwvcGFyYT4KLSAgICAgICAgICAgIDwvbGlzdGl0ZW0+Ci0gICAgICAgICAgICA8bGlzdGl0ZW0+Ci0gICAgICAgICAgICAgICAgPHBhcmE+Ci0gICAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcyByb2xlPSJib2xkIj54cGF0aDwvZW1waGFzaXM+Ci0gICAgICAgICAgICAgICAgICAgIC0gUmVwcmVzZW50cyBhbiBYUEFUSCAxLjAgZnVuY3Rpb24uIFRoZXNlIGFyZSBmdW5jdGlvbnMgYXMgZGVmaW5lZCBieQotICAgICAgICAgICAgICAgICAgICB0aGUgWFBhdGggMS4wIHNwZWNpZmljYXRpb24uCi0gICAgICAgICAgICAgICAgPC9wYXJhPgotICAgICAgICAgICAgPC9saXN0aXRlbT4KLSAgICAgICAgICAgIDxsaXN0aXRlbT4KLSAgICAgICAgICAgICAgICA8cGFyYT4KLSAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzIHJvbGU9ImJvbGQiPnhwYXRoIDIuMDwvZW1waGFzaXM+Ci0gICAgICAgICAgICAgICAgICAgIC0gUmVwcmVzZW50cyBhbiBYUGF0aCAyLjAgZnVuY3Rpb24uCi0gICAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcz5Ob3RlOiBUaGF0IGN1cnJlbnRseSBYU0wgVG9vbHMgb25seSBzaGlwcyB3aXRoCi0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZXMgZGVmaW5lZCBmb3IgWFBhdGggMS4wIC48L2VtcGhhc2lzPgotICAgICAgICAgICAgICAgIDwvcGFyYT4KLSAgICAgICAgICAgIDwvbGlzdGl0ZW0+Ci0gICAgICAgICAgICA8bGlzdGl0ZW0+Ci0gICAgICAgICAgICAgICAgPHBhcmE+Ci0gICAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcyByb2xlPSJib2xkIj5vcGVyYXRvcjwvZW1waGFzaXM+Ci0gICAgICAgICAgICAgICAgICAgIC0gQW4geHBhdGggbG9naWNhbCBvcGVyYXRvciBsaWtlIEFORCwgT1IsIGV0Yy4KLSAgICAgICAgICAgICAgICA8L3BhcmE+Ci0gICAgICAgICAgICA8L2xpc3RpdGVtPgotICAgICAgICA8L2l0ZW1pemVkbGlzdD4KLSAgICAgICAgPHNlY3Rpb24gaWQ9IlhQYXRoVGVtcGxhdGVOZXciPgotCQkgICA8P2RiaHRtbCBmaWxlbmFtZT0icHJlZmVyZW5jZXMveHBhdGh0ZW1wbGF0ZW5ldy5odG1sIiA/PgotICAgICAgICAgICAgPHRpdGxlPkNyZWF0aW5nIE5ldyBUZW1wbGF0ZXM8L3RpdGxlPgotICAgICAgICAgICAgPCEtLSBUT0RPOiBDcmVhdGUgQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiBjcmVhdGluZyBuZXcgdGVtcGxhdGVzLS0+Ci0gICAgICAgICAgICA8cGFyYT4gQWRkIGRvY3VtZW50YXRpb24gYWJvdXQgY3JlYXRpbmcgbmV3IHRlbXBsYXRlcy48L3BhcmE+Ci0gICAgICAgIDwvc2VjdGlvbj4KLSAgICAgICAgPHNlY3Rpb24gaWQ9IlhQYXRoSW1wb3J0Ij4KLQkJICAgPD9kYmh0bWwgZmlsZW5hbWU9InByZWZlcmVuY2VzL3hwYXRoaW1wb3J0Lmh0bWwiID8+Ci0gICAgICAgICAgICA8dGl0bGU+SW1wb3J0IFhQYXRoIFRlbXBsYXRlczwvdGl0bGU+Ci0gICAgICAgICAgICA8cGFyYT4gQWRkIGRvY3VtZW50YXRpb24gYWJvdXQgaW1wb3J0aW5nIG5ldyB0ZW1wbGF0ZXMuPC9wYXJhPgotICAgICAgICA8L3NlY3Rpb24+Ci0gICAgICAgIDxzZWN0aW9uIGlkPSJYUGF0aEV4cG9ydCI+Ci0JCSAgIDw/ZGJodG1sIGZpbGVuYW1lPSJwcmVmZXJlbmNlcy94cGF0aGV4cG9ydC5odG1sIiA/PgotICAgICAgICAgICAgPHRpdGxlPkltcG9ydCBYUGF0aCBUZW1wbGF0ZXM8L3RpdGxlPgotICAgICAgICAgICAgPHBhcmE+IEFkZCBkb2N1bWVudGF0aW9uIGFib3V0IGltcG9ydGluZyBuZXcgdGVtcGxhdGVzLjwvcGFyYT4KLSAgICAgICAgPC9zZWN0aW9uPgotICAgIDwvc2VjdGlvbj4KLSAgICA8c2VjdGlvbiBpZD0icHJlZl9Qcm9qZWN0VmFsaWRhdGlvblByZWZlcmVuY2VzIj4KLSAgICAgICAgPD9kYmh0bWwgZmlsZW5hbWU9InByZWZlcmVuY2VzL3ZhbGlkYXRpb24uaHRtbCIgPz4KLSAgICAgICAgPHRpdGxlPlByb2plY3QgVmFsaWRhdGlvbiBQcmVmZXJlbmNlczwvdGl0bGU+Ci0gICAgICAgIDxwYXJhPgotICAgICAgICAgICAgWFNMIFRvb2xzIGhhcyB0aGUgYWJpbGl0eSB0byBzZXQgYm90aCB3b3Jrc3BhY2Ugd2lkZSBwcmVmZXJlbmNlcyBmb3IKLSAgICAgICAgICAgIHZhbGlkYXRpb24gYXMgd2VsbCBhcyBwcm9qZWN0IGxldmVsIHByZWZlcmVuY2VzLiBUaGVzZSBwcmVmZXJlbmNlcywgYXMgc2hvd24KLSAgICAgICAgICAgIGluCi0gICAgICAgICAgICA8eHJlZiBsaW5rZW5kPSJmaWdfUHJvamVjdExldmVsUHJlZmVyZW5jZXMiLz4KLSAgICAgICAgICAgIGFsbG93IGZvciB0aGUgZmluZSBncmFpbiBjb250cm9sIG9mIHdoYXQgdGhlIHZhbGlkYXRvciB3aWxsIGNvbnNpZGVyIHRvIGJlIGFuCi0gICAgICAgICAgICBzeW50YXggZXJyb3IuCi0gICAgICAgIDwvcGFyYT4KLSAgICAgICAgPGZpZ3VyZSBpZD0iZmlnX1Byb2plY3RMZXZlbFByZWZlcmVuY2VzIj4KLSAgICAgICAgICAgIDx0aXRsZT5Qcm9qZWN0IExldmVsIFZhbGlkYXRpb24gUHJlZmVyZW5jZXM8L3RpdGxlPgotICAgICAgICAgICAgPG1lZGlhb2JqZWN0PgotICAgICAgICAgICAgICAgIDxpbWFnZW9iamVjdD4KLSAgICAgICAgICAgICAgICAgICAgPGltYWdlZGF0YSBhbGlnbj0iY2VudGVyIgotICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXJlZj0iLi4vaW1hZ2VzL3ByZWZlcmVuY2VzL3Byb2plY3RMZXZlbFZhbGlkYXRpb24ucG5nIiBmb3JtYXQ9IlBORyIvPgotICAgICAgICAgICAgICAgIDwvaW1hZ2VvYmplY3Q+Ci0gICAgICAgICAgICA8L21lZGlhb2JqZWN0PgotICAgICAgICA8L2ZpZ3VyZT4KLSAgICAgICAgPHBhcmE+IFRoZXNlIHByZWZlcmVuY2VzIGFyZSBhY2Nlc3NlZCB2aWEgdGhlIFByb2plY3RzIHByb3BlcnRpZXMgZGlhbG9nLjwvcGFyYT4KLSAgICA8L3NlY3Rpb24+Ci0gICAgPHNlY3Rpb24gaWQ9InByZWZfU3ludGF4Q29sb3JpbmciPgotICAgICAgICA8P2RiaHRtbCBmaWxlbmFtZT0icHJlZmVyZW5jZXMvc3ludGF4Q29sb3JpbmcuaHRtbCIgPz4KLSAgICAgICAgPHRpdGxlPlhTTFQgU3ludGF4IENvbG9yaW5nPC90aXRsZT4KLSAgICAgICAgPHBhcmE+Ci0gICAgICAgICAgICBYU0wgVG9vbHMgYWxzbyBoYXMgdGhlIGFiaWxpdHkgdG8gc3ludGF4IGNvbG9yIHRoZSBYU0xUIG5hbWVzcGFjZSBpdGVtcyBhIGRpZmZlcmVudAotICAgICAgICAgICAgY29sb3IgdGhhbiB0aGUgcmVzdCBvZiB0aGUgWE1MIHN5bnRheCBpbmNsdWRlZC4gICBUaGUgZGVmYXVsdCBpcyBmb3IgYWxsIFhTTCBzeW50YXggdG8gYmUKLSAgICAgICAgICAgIDxlbXBoYXNpcyByb2xlPSJib2xkIj5ib2xkPC9lbXBoYXNpcz4uCi0gICAgICAgIDwvcGFyYT4KLSAgICAgICAgPGZpZ3VyZSBpZD0iZmlnX1hTTFN5bnRheENvbG9yaW5nUHJlZmVyZW5jZSI+Ci0gICAgICAgICAgICA8dGl0bGU+WFNMIFRvb2xzIFN5bnRheCBDb2xvcmluZyBQcmVmZXJlbmNlPC90aXRsZT4KLSAgICAgICAgICAgIDxtZWRpYW9iamVjdD4KLSAgICAgICAgICAgICAgICA8aW1hZ2VvYmplY3Q+Ci0gICAgICAgICAgICAgICAgICAgIDxpbWFnZWRhdGEgYWxpZ249ImNlbnRlciIKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVyZWY9Ii4uL2ltYWdlcy9wcmVmZXJlbmNlcy94c2xTeW50YXhDb2xvcmluZy5wbmciIGZvcm1hdD0iUE5HIi8+Ci0gICAgICAgICAgICAgICAgPC9pbWFnZW9iamVjdD4KLSAgICAgICAgICAgIDwvbWVkaWFvYmplY3Q+Ci0gICAgICAgIDwvZmlndXJlPgotICAgICAgICA8bm90ZT4KLSAgICAgICAgICAgIDx0aXRsZT5YTUwgQ29sb3JzPC90aXRsZT4KLSAgICAgICAgICAgIDxwYXJhPgotICAgICAgICAgICAgICAgIFRoZSBjb2xvciBmb3Igc3RhbmRhcmQgWE1MIGlzIHN0aWxsIGhhbmRsZWQgYnkgdGhlIFhNTCBGaWxlcyBzeW50YXggY29sb3JpbmcKLSAgICAgICAgICAgICAgICBwcmVmZXJlbmNlIHBhZ2UuICAgQ2hhbmdlcyBtYWRlIHRoZXJlIGFyZSByZWZsZWN0ZWQgaW4gdGhlIFhTTCBlZGl0b3IgYXMgd2VsbC4KLSAgICAgICAgICAgIDwvcGFyYT4KLSAgICAgICAgPC9ub3RlPgotICAgIDwvc2VjdGlvbj4KLTwvY2hhcHRlcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2RvY2Jvb2svc2FtcGxlcy9zYW1wbGVzLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvZG9jYm9vay9zYW1wbGVzL3NhbXBsZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTBjZjFjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvZG9jYm9vay9zYW1wbGVzL3NhbXBsZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBjaGFwdGVyIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBEb2NCb29rIFhNTCBWNC41Ly9FTiIKLSAgICAgICAgICAiaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9kb2Nib29rL3htbC80LjUvZG9jYm9va3guZHRkIj4KLTxjaGFwdGVyPgotCTw/ZGJodG1sIGZpbGVuYW1lPSJzYW1wbGVzL3NhbXBsZXMuaHRtbCIgPz4KLQk8dGl0bGU+WFNMIFRvb2xpbmcgU2FtcGxlczwvdGl0bGU+Ci0JPHBhcmE+VGhpcyBzZWN0aW9uIGNvbnRhaW5zIHNldmVyYWwgc2FtcGxlcyBhbmQgcmVmZXJlbmNlcyB0byBzYW1wbGUgcHJvamVjdHMuPC9wYXJhPgotCTxzZWN0aW9uIGlkPSJFY2xpcHNlSGVscCI+Ci0JCTw/ZGJodG1sIGZpbGVuYW1lPSJzYW1wbGVzL2VjbGlwc2VoZWxwLmh0bWwiID8+Ci0JCTx0aXRsZT5FY2xpcHNlIEhlbHA8L3RpdGxlPgotCQk8cGFyYT48L3BhcmE+Ci0JCTxzZWN0aW9uIGlkPSJEb2Nib29rRWNsaXBzZUhlbHAiPgotCQkJPD9kYmh0bWwgZmlsZW5hbWU9InNhbXBsZXMvZG9jYm9va2hlbHAuaHRtbCIgPz4KLQkJCTx0aXRsZT5DcmVhdGluZyBFY2xpcHNlIEhlbHAgd2l0aCBEb2Nib29rIGFuZCBYU0wgVG9vbHM8L3RpdGxlPgotCQkJPHBhcmE+Ci0JCQkJVGhpcyB0dXRvcmlhbCBhc3N1bWVzIHRoYXQgeW91IGhhdmUga25vd2xlZGdlIG9mIERvY2Jvb2ssIEFOVCwgYW5kIHRoZQotCQkJCWFiaWxpdHkgdG8gc2V0dXAgQU5UIGJ1aWxkIHNjcmlwdHMuCi0JCQk8L3BhcmE+Ci0JCQk8cGFyYT4KLQkJCQlUbyBEbyB3cml0ZSB1cCB0aGUgcmVzdCBvZiB0aGUgdHV0b3JpYWwuCi0JCQk8L3BhcmE+Ci0JCTwvc2VjdGlvbj4KLQkJPHNlY3Rpb24gaWQ9IkRJVEFFY2xpcHNlSGVscCI+Ci0JCQk8P2RiaHRtbCBmaWxlbmFtZT0ic2FtcGxlcy9kaXRhaGVscC5odG1sIiA/PgotCQkJPHRpdGxlPkNyZWF0aW5nIEVjbGlwc2UgSGVscCB3aXRoIERJVEEgYW5kIFhTTCBUb29sczwvdGl0bGU+Ci0JCQk8cGFyYT4KLQkJCQlUaGlzIHR1dG9yaWFsIGFzc3VtZXMgdGhhdCB5b3UgaGF2ZSBrbm93bGVkZ2Ugb2YgRElUQSwgQU5ULCBhbmQgdGhlCi0JCQkJYWJpbGl0eSB0byBzZXR1cCBBTlQgYnVpbGQgc2NyaXB0cy4KLQkJCTwvcGFyYT4KLQkJCTxwYXJhPgotCQkJCVRvIERvIHdyaXRlIHVwIHRoZSByZXN0IG9mIHRoZSB0dXRvcmlhbC4KLQkJCTwvcGFyYT4KLQkJPC9zZWN0aW9uPgotCTwvc2VjdGlvbj4KLTwvY2hhcHRlcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2RvY2Jvb2sveHNsaGVscC5kYmsgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2RvY2Jvb2sveHNsaGVscC5kYmsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNjZjZTkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9kb2Nib29rL3hzbGhlbHAuZGJrCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBib29rIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBEb2NCb29rIFhNTCBWNC41Ly9FTiIKLSAgICAgICAgICAiaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9kb2Nib29rL3htbC80LjUvZG9jYm9va3guZHRkIj4KLTxib29rIGlkPSJYU0xVc2VyIiB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSI+Ci0gIDxib29raW5mbz4KLSAgICAgIDx0aXRsZT5YU0wgVG9vbHMgVXNlciBEb2N1bWVudGF0aW9uPC90aXRsZT4KLSAgICAgIDxhdXRob3I+Ci0gICAgICAgICA8Zmlyc3RuYW1lPkRhdmlkPC9maXJzdG5hbWU+Ci0gICAgICAgICA8c3VybmFtZT5DYXJ2ZXI8L3N1cm5hbWU+Ci0gICAgICA8L2F1dGhvcj4KLSAgICAgIDxjb3B5cmlnaHQ+Ci0gICAgICAgICA8eWVhcj4yMDA4PC95ZWFyPgotICAgICAgICAgPGhvbGRlcj5FY2xpcHNlIEZvdW5kYXRpb24gYW5kIG90aGVyczwvaG9sZGVyPgotICAgICAgPC9jb3B5cmlnaHQ+Ci0gICA8L2Jvb2tpbmZvPgotICAgPHhpOmluY2x1ZGUgaHJlZj0iY29uY2VwdHMvZ2V0dGluZ3N0YXJ0ZWQueG1sIi8+Ci0gICA8eGk6aW5jbHVkZSBocmVmPSJjb25jZXB0cy9jb25jZXB0cy54bWwiLz4KLSAgIDx4aTppbmNsdWRlIGhyZWY9ImVkaXRvci9lZGl0b3IueG1sIi8+Ci0gICA8eGk6aW5jbHVkZSBocmVmPSJsYXVuY2hpbmcvbGF1bmNoaW5nLnhtbCIvPgotICAgPHhpOmluY2x1ZGUgaHJlZj0icHJlZmVyZW5jZXMvcHJlZmVyZW5jZXMueG1sIi8+Ci0gICA8eGk6aW5jbHVkZSBocmVmPSJnZW5lcmFsL2dlbmVyYWwueG1sIi8+Ci0gICA8eGk6aW5jbHVkZSBocmVmPSJzYW1wbGVzL3NhbXBsZXMueG1sIi8+Ci0gICA8eGk6aW5jbHVkZSBocmVmPSJsZWdhbC54bWwiLz4KLTwvYm9vaz4KLQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL2Fib3V0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL2Jvb2suY3NzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL2Jvb2suY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzBmNWFmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9ib29rLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi1wLkNvZGUgewotCWRpc3BsYXk6IGJsb2NrOwotCXRleHQtYWxpZ246IGxlZnQ7Ci0JdGV4dC1pbmRlbnQ6IDAuMDBwdDsKLQltYXJnaW4tdG9wOiAwLjAwMDAwMHB0OwotCW1hcmdpbi1ib3R0b206IDAuMDAwMDAwcHQ7Ci0JbWFyZ2luLXJpZ2h0OiAwLjAwMDAwMHB0OwotCW1hcmdpbi1sZWZ0OiAxNXB0OwotCWZvbnQtd2VpZ2h0OiBub3JtYWw7Ci0JZm9udC1zdHlsZTogbm9ybWFsOwotCWNvbG9yOiAjNDQ0NENDOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLQl2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7Ci0JdGV4dC10cmFuc2Zvcm06IG5vbmU7Ci0JZm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIENvdXJpZXIsIG1vbm9zcGFjZTsKLX0KLQotSDYuQ2FwdGlvbkZpZ0NvbHVtbiB7Ci0JZGlzcGxheTogYmxvY2s7Ci0JdGV4dC1hbGlnbjogbGVmdDsKLQl0ZXh0LWluZGVudDogMC4wMDAwMDBwdDsKLQltYXJnaW4tdG9wOiAzLjAwMDAwMHB0OwotCW1hcmdpbi1ib3R0b206IDExLjAwMDAwMHB0OwotCW1hcmdpbi1yaWdodDogMC4wMDAwMDBwdDsKLQltYXJnaW4tbGVmdDogMC4wMDAwMDBwdDsKLQlmb250LXNpemU6IDc1JTsKLQlmb250LXdlaWdodDogYm9sZDsKLQlmb250LXN0eWxlOiBJdGFsaWM7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotCXZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsKLQl0ZXh0LXRyYW5zZm9ybTogbm9uZTsKLX0KLQotcC5Ob3RlIHsKLQlkaXNwbGF5OiBibG9jazsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotCXRleHQtaW5kZW50OiAwcHQ7Ci0JbWFyZ2luLXRvcDogMTkuNTAwMDAwcHQ7Ci0JbWFyZ2luLWJvdHRvbTogMTkuNTAwMDAwcHQ7Ci0JbWFyZ2luLXJpZ2h0OiAwLjAwMDAwMHB0OwotCW1hcmdpbi1sZWZ0OiAzMHB0OwotCWZvbnQtc2l6ZTogMTEwJTsKLQlmb250LXdlaWdodDogbm9ybWFsOwotCWZvbnQtc3R5bGU6IEl0YWxpYzsKLQljb2xvcjogIzAwMDAwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOwotCXRleHQtdHJhbnNmb3JtOiBub25lOwotfQotCi1FTS5VSUxhYmVsIHsKLQlmb250LXdlaWdodDogQm9sZDsKLQlmb250LXN0eWxlOiBub3JtYWw7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotCXZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsKLQl0ZXh0LXRyYW5zZm9ybTogbm9uZTsKLX0KLQotRU0uQ29kZU5hbWUgewotCWZvbnQtd2VpZ2h0OiBCb2xkOwotCWZvbnQtc3R5bGU6IG5vcm1hbDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOwotCXRleHQtdHJhbnNmb3JtOiBub25lOwotCWZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vc3BhY2U7Ci19Ci0KLVVMLk5hdkxpc3QgewotCW1hcmdpbi1sZWZ0OiAxLjVlbTsKLQlwYWRkaW5nLWxlZnQ6IDBweDsKLQlsaXN0LXN0eWxlLXR5cGU6IG5vbmU7Ci19Ci0KLWJvZHksaHRtbCB7Ci0JYm9yZGVyOiAwcHgKLX0KLQotLyogZm9sbG93aW5nIGZvbnQgZmFjZSBkZWNsYXJhdGlvbnMgbmVlZCB0byBiZSByZW1vdmVkIGZvciBEQkNTICovCi1ib2R5LGgxLGgyLGgzLGg0LGg1LGg2LHAsdGFibGUsdGQsY2FwdGlvbix0aCx1bCxvbCxkbCxsaSxkZCxkdCB7Ci0JZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JY29sb3I6ICMwMDAwMDAKLX0KLQotcHJlLGNvZGUgewotCWZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vc3BhY2U7Ci19Ci0KLS8qIGVuZCBmb250IGZhY2UgZGVjbGFyYXRpb25zICovCi1AbWVkaWEgcHJpbnQgewotCWh0bWwgewotCQlmb250LXNpemU6IDEycHQKLQl9Ci19Ci0KLWJvZHkgewotCWZvbnQtc2l6ZTogODMlOwotCWJhY2tncm91bmQ6ICNGRkZGRkY7Ci0JbWFyZ2luLWJvdHRvbTogMWVtCi19Ci0KLWgxIHsKLQlmb250LXNpemU6IDE4MCU7Ci0JbWFyZ2luLXRvcDogNXB4OwotCW1hcmdpbi1ib3R0b206IDFweAotfQotCi1oMiB7Ci0JZm9udC1zaXplOiAxNDAlOwotCW1hcmdpbi10b3A6IDI1cHg7Ci0JbWFyZ2luLWJvdHRvbTogM3B4Ci19Ci0KLWgzIHsKLQlmb250LXNpemU6IDExMCU7Ci0JbWFyZ2luLXRvcDogMjBweDsKLQltYXJnaW4tYm90dG9tOiAzcHgKLX0KLQotaDQgewotCWZvbnQtc2l6ZTogMTAwJTsKLQltYXJnaW4tdG9wOiAyMHB4OwotCW1hcmdpbi1ib3R0b206IDNweDsKLQlmb250LXN0eWxlOiBpdGFsaWMKLX0KLQotcCB7Ci0JbWFyZ2luLXRvcDogMTBweDsKLQltYXJnaW4tYm90dG9tOiAxMHB4Ci19Ci0KLXByZSB7Ci0JZm9udC1zaXplOiA5MyU7Ci0JbWFyZ2luLWxlZnQ6IDY7Ci0JY29sb3I6ICM0NDQ0Q0MKLX0KLQotY29kZSB7Ci0JZm9udC1zaXplOiA5MyU7Ci19Ci0KLXRhYmxlIHsKLQlmb250LXNpemU6IDEwMCUKLX0gIC8qIG5lZWRlZCBmb3IgcXVpcmtzIG1vZGUgKi8KLWE6bGluayB7Ci0JY29sb3I6ICMwMDAwRkYKLX0KLQotYTpob3ZlciB7Ci0JY29sb3I6ICMwMDAwODAKLX0KLQotYTp2aXNpdGVkIHsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZQotfQotCi11bCB7Ci0JbWFyZ2luLXRvcDogMTBweDsKLQltYXJnaW4tYm90dG9tOiAxMHB4OwotfQotCi1saSB7Ci0JbWFyZ2luLXRvcDogNXB4OwotCW1hcmdpbi1ib3R0b206IDVweDsKLX0KLQotbGkgcCB7Ci0JbWFyZ2luLXRvcDogNXB4OwotCW1hcmdpbi1ib3R0b206IDVweDsKLX0KLQotb2wgewotCW1hcmdpbi10b3A6IDEwcHg7Ci0JbWFyZ2luLWJvdHRvbTogMTBweDsKLX0KLQotZGwgewotCW1hcmdpbi10b3A6IDEwcHg7Ci0JbWFyZ2luLWJvdHRvbTogMTBweDsKLX0KLQotZHQgewotCW1hcmdpbi10b3A6IDVweDsKLQltYXJnaW4tYm90dG9tOiA1cHg7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLWRkIHsKLQltYXJnaW4tdG9wOiA1cHg7Ci0JbWFyZ2luLWJvdHRvbTogNXB4OwotfQotCi1zdHJvbmcgewotCWZvbnQtd2VpZ2h0OiBib2xkCi19Ci0KLWVtIHsKLQlmb250LXN0eWxlOiBpdGFsaWMKLX0KLQotdmFyIHsKLQlmb250LXN0eWxlOiBpdGFsaWMKLX0KLQotZGl2LnJldmlzaW9uIHsKLQlib3JkZXItbGVmdC1zdHlsZTogc29saWQ7Ci0JYm9yZGVyLWxlZnQtd2lkdGg6IHRoaW47Ci0JYm9yZGVyLWxlZnQtY29sb3I6ICM3QjY4RUU7Ci0JcGFkZGluZy1sZWZ0OiA1Ci19Ci0KLXRoIHsKLQlmb250LXdlaWdodDogYm9sZAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9jb25jZXB0cy9jb25jZXB0cy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL2NvbmNlcHRzL2NvbmNlcHRzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ZDI1OTMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL2NvbmNlcHRzL2NvbmNlcHRzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MTggKzAsMCBAQAotPGh0bWw+PGhlYWQ+PE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPjx0aXRsZT5YU0xUIENvbmNlcHRzPC90aXRsZT48bGluayBocmVmPSJib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+PGxpbmsgaHJlZj0iLi4vYm9vay5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPjxtZXRhIGNvbnRlbnQ9IkRvY0Jvb2sgWFNMIFN0eWxlc2hlZXRzIFYxLjc0LjAiIG5hbWU9ImdlbmVyYXRvciI+PGxpbmsgcmVsPSJob21lIiBocmVmPSIuLi9pbmRleC5odG1sIiB0aXRsZT0iWFNMIFRvb2xzIFVzZXIgRG9jdW1lbnRhdGlvbiI+PGxpbmsgcmVsPSJ1cCIgaHJlZj0iLi4vaW5kZXguaHRtbCIgdGl0bGU9IlhTTCBUb29scyBVc2VyIERvY3VtZW50YXRpb24iPjxsaW5rIHJlbD0icHJldiIgaHJlZj0iLi4vaW50cm9kdWN0aW9uL2dldHRpbmdzdGFydGVkLmh0bWwiIHRpdGxlPSJHZXR0aW5nIFN0YXJ0ZWQiPjxsaW5rIHJlbD0ibmV4dCIgaHJlZj0icmVzb3VyY2VzLmh0bWwiIHRpdGxlPSJSZXNvdXJjZXMiPjwvaGVhZD48Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgdGV4dD0iYmxhY2siIGxpbms9IiMwMDAwRkYiIHZsaW5rPSIjODQwMDg0IiBhbGluaz0iIzAwMDBGRiI+PGRpdiBjbGFzcz0iY2hhcHRlciIgbGFuZz0iZW4iPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoMiBjbGFzcz0idGl0bGUiPjxhIG5hbWU9Ik4xMDAxOSI+PC9hPlhTTFQgQ29uY2VwdHM8L2gyPjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9InRvYyI+PHA+PGI+VGFibGUgb2YgQ29udGVudHM8L2I+PC9wPjx1bD48bGk+PHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9ImNvbmNlcHRzLmh0bWwjUmVzdWNpbmdYU0xUIj5SZXNjdWluZyBYU0xUIEZyb20gTmljaGUgU3RhdHVzPC9hPjwvc3Bhbj48dWw+PGxpPjxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJjb25jZXB0cy5odG1sI04xMDAzNCI+VGhlIFByb2JsZW08L2E+PC9zcGFuPjwvbGk+PGxpPjxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJjb25jZXB0cy5odG1sI04xMDA1QSI+VGhlIFNvbHV0aW9uPC9hPjwvc3Bhbj48L2xpPjxsaT48c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iY29uY2VwdHMuaHRtbCNOMTAwODEiPlF1ZXJpZXM8L2E+PC9zcGFuPjx1bD48bGk+PHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9ImNvbmNlcHRzLmh0bWwjTjEwMDhGIj54c2w6Zm9yLWVhY2g8L2E+PC9zcGFuPjwvbGk+PGxpPjxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJjb25jZXB0cy5odG1sI04xMDA5QiI+eHNsOmlmPC9hPjwvc3Bhbj48L2xpPjxsaT48c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iY29uY2VwdHMuaHRtbCNOMTAwQTUiPnhzbDpjaG9vc2U8L2E+PC9zcGFuPjwvbGk+PC91bD48L2xpPjxsaT48c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iY29uY2VwdHMuaHRtbCNOMTAwQUYiPkNvbmNsdXNpb248L2E+PC9zcGFuPjwvbGk+PC91bD48L2xpPjxsaT48c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0icmVzb3VyY2VzLmh0bWwiPlJlc291cmNlczwvYT48L3NwYW4+PC9saT48L3VsPjwvZGl2PjxwPgotICAgICAgICAgCi0gICA8L3A+PGRpdiBjbGFzcz0ic2VjdGlvbiIgbGFuZz0iZW4iPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoMiBjbGFzcz0idGl0bGUiIHN0eWxlPSJjbGVhcjogYm90aCI+PGEgbmFtZT0iUmVzdWNpbmdYU0xUIj48L2E+UmVzY3VpbmcgWFNMVCBGcm9tIE5pY2hlIFN0YXR1czwvaDI+PC9kaXY+PGRpdj48aDMgY2xhc3M9InN1YnRpdGxlIj5BIEdlbnRsZSBJbnRyb2R1Y3Rpb24gdG8gWFNMVCB0aHJvdWdoIEhUTUwgVGVtcGxhdGVzPC9oMz48L2Rpdj48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJub3RlIiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDAuNWluOyBtYXJnaW4tcmlnaHQ6IDAuNWluOyI+PGgzIGNsYXNzPSJ0aXRsZSI+Tm90ZTwvaDM+PHA+Ci0gICAgICAgICA8c3BhbiBjbGFzcz0iZW1waGFzaXMiPjxlbT4KLSAgICAgICAgICAgIEVkaXRvcnMgTm90ZTogVGhpcyBvcmlnaW5hbGx5IGFwcGVhcmVkIGF0Ci0gICAgICAgICAgICA8YSBjbGFzcz0idWxpbmsiIGhyZWY9Imh0dHA6Ly93d3cueGZyb250LmNvbS9yZXNjdWluZy14c2x0Lmh0bWwiIHRhcmdldD0iX3RvcCI+WEZyb250LmNvbTwvYT4KLSAgICAgICAgICAgICwgYW5kIGlzIHJlcHVibGlzaGVkIGhlcmUgd2l0aCBwZXJtaXNzaW9uLiBUaGUgYXJ0aWNsZSBpcyB3cml0dGVuIGJ5IERhdmlkIEphY29icy4KLSAgICAgICAgIDwvZW0+PC9zcGFuPgotICAgICAgPC9wPjwvZGl2PjxkaXYgY2xhc3M9ImFic3RyYWN0Ij48cCBjbGFzcz0idGl0bGUiPjxiPkFic3RyYWN0PC9iPjwvcD48cD4KLSAgICAgICAgIFhTTFQgaXMgb25lIG9mIHRoZSBtb3N0IGV4Y2l0aW5nIHRlY2hub2xvZ2llcyB0byBjb21lIG91dCBvZiB0aGUgWE1MIGZhbWlseS4gVW5mb3J0dW5hdGVseSwgaXRzIGluY3JlZGlibGUKLSAgICAgICAgIHBvd2VyIGFuZCBhc3NvY2lhdGVkIGNvbXBsZXhpdHkgY2FuIGJlIG92ZXJ3aGVsbWluZyB0byBuZXcgdXNlcnMgcHJldmVudGluZyBtYW55IGZyb20gZXhwZXJpbWVudGluZyB3aXRoIGl0IG9yCi0gICAgICAgICBjYXVzaW5nIHRoZW0gdG8gcXVpY2tseSBnaXZlIHVwIGluIGRpc2d1c3QuIEluIGZhY3QsIHVubGVzcyB0aGUgbWV0aG9kIG9mIHRlYWNoaW5nIGFuZCB0aGUgY29tbW9uIHN0eWxlIG9mIHVzZQotICAgICAgICAgZm9yIFhTTFQgaXMgcmFkaWNhbGx5IGNoYW5nZWQgdG8gbWFrZSBpdCBtb3JlIGFjY2Vzc2libGUsIFhTTFQgd2lsbCBiZSByZWxlZ2F0ZWQgdG8gbmljaGUgc3RhdHVzIGxpa2UgU0dNTCBhbmQKLSAgICAgICAgIG90aGVyIHBvd2VyZnVsIHRlY2hub2xvZ2llcy4KLSAgICAgIDwvcD48L2Rpdj48ZGl2IGNsYXNzPSJzZWN0aW9uIiBsYW5nPSJlbiI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgzIGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0iTjEwMDM0Ij48L2E+VGhlIFByb2JsZW08L2gzPjwvZGl2PjwvZGl2PjwvZGl2PjxwPgotICAgICAgICAgVGhlIDE5OTAmcnNxdW87cyBzYXcgYW4gaW5jcmVkaWJsZSBwcm9saWZlcmF0aW9uIG9mIG5ldyB3ZWIgcmVsYXRlZCBsYW5ndWFnZXMuIExvb2tpbmcgYmFjayB3ZSBjYW4gc2VlIHdoYXQKLSAgICAgICAgIGZlYXR1cmVzIHNlcGFyYXRlZCB0aGUgd2lubmVycyBhbmQgbG9zZXJzLiBUaGUgYmlnZ2VzdCBrZXkgaGFzIGJlZW4gaGF2aW5nIGEgdmVyeSBsb3cgYmFycmllciB0byBlbnRyeS4gTWFueQotICAgICAgICAgbGFuZ3VhZ2VzIGFjY29tcGxpc2hlZCB0aGlzIGJ5IGZvbGxvd2luZyB0aGUgZm9sbG93aW5nIHJ1bGVzLgotICAgICAgPC9wPjxkaXYgY2xhc3M9Iml0ZW1pemVkbGlzdCI+PHVsIHR5cGU9ImRpc2MiPjxsaT48cD4KLSAgICAgICAgICAgICAgIExldmVyYWdlIGFzIG11Y2ggZXhpc3Rpbmcga25vd2xlZGdlIGFzIHBvc3NpYmxlLgotICAgICAgICAgICAgPC9wPjwvbGk+PGxpPjxwPgotICAgICAgICAgICAgICAgTWFrZSBpdCBlYXN5IHRvIGdldCBzdGFydGVkIHdpdGggImhlbGxvIHdvcmxkIiBzdHlsZSBleGFtcGxlLgotICAgICAgICAgICAgPC9wPjwvbGk+PGxpPjxwPgotICAgICAgICAgICAgICAgVGhlIG1vc3QgY29tbW9uIGFuZCB1c2VmdWwgbGFuZ3VhZ2UgY29uc3RydWN0cyBzaG91bGQgYmUgZWFzaWx5IGNvbnZleWVkIHdpdGggYSBmZXcgc21hbGwgZXhhbXBsZXMuCi0gICAgICAgICAgICA8L3A+PC9saT48bGk+PHA+Ci0gICAgICAgICAgICAgICBDb21wbGV4IHByb2dyYW1taW5nIGNvbnN0cnVjdHMgc2hvdWxkIG9ubHkgYmUgcmVxdWlyZWQgd2hlbiB3aGF0IGlzIHRyeWluZyB0byBiZSBhY2NvbXBsaXNoZWQgaXMKLSAgICAgICAgICAgICAgIGNvbXBsZXguICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3A+PC9saT48L3VsPjwvZGl2PjxwPgotICAgICAgICAgRnJvbSB0aGVzZSBydWxlcyB3ZSBjYW4gc2VlIHdoeSBlbWJlZGRlZCB3ZWIgc2NyaXB0aW5nIGxhbmd1YWdlcyBsaWtlIEFjdGl2ZSBTZXJ2ZXIgUGFnZXMgKEFTUHMpLCBDb2xkCi0gICAgICAgICBGdXNpb24sIFBIUCBhbmQKLSAgICAgICAgIEphdmEgU2VydmVyIFBhZ2VzIChKU1BzKSBhcmUgc28gcG9wdWxhci4gVGhleSBhbGwgbGV2ZXJhZ2UgYSB1c2VyJnJzcXVvO3Mga25vd2xlZGdlIG9mIEhUTUwuIFRoZXkgYWxzbwotICAgICAgICAgYWxsb3cgdGhlCi0gICAgICAgICBtaW5pbXVtIGFtb3VudCBvZiBzY3JpcHRpbmcgdG8gYmUgYWRkZWQgdG8gYWNjb21wbGlzaCB0aGUgZHluYW1pYyBmZWF0dXJlIGEgZGV2ZWxvcGVyIGlzIGxvb2tpbmcgZm9yLgotICAgICAgICAgVGhpcyBoYXMKLSAgICAgICAgIGFsbG93ZWQgbnVtZXJvdXMgd2ViIGRldmVsb3BlcnMgdG8gc3RhcnQgb2ZmIHdpdGggdmVyeSBzbWFsbCBwcm9qZWN0cyBhbmQgdGhlbiB0aHJvdWdoIGNvbnRpbnVvcwotICAgICAgICAgZW5oYW5jZW1lbnQKLSAgICAgICAgIGFuZCBsZWFybmluZywgZmluZCB0aGVtc2VsdmVzIHVzaW5nIHRoZSBmdWxsIHBvd2VyIG9mIGEgY29tcGxleCBwcm9ncmFtbWluZyBsYW5ndWFnZS4gRnVydGhlcm1vcmUsCi0gICAgICAgICBiZWNhdXNlIG9mCi0gICAgICAgICB0aGUgdmVyeSBpbmNyZW1lbnRhbCBuYXR1cmUgb2YgdGhhdCBsZWFybmluZyB0aGUgZGV2ZWxvcGVyIHdhcyBuZXZlciBzY2FyZWQgb2ZmLiAgICAgICAgIAotICAgICAgPC9wPjxwPgotICAgICAgICAgSFRNTCBoYXMgYWxzbyBmb3N0ZXJlZCB0aGUgdGVjaG5pcXVlIG9mIGxlYXJuaW5nIGJ5IGV4YW1wbGUuIFdoZW4gYSB3ZWIgYXV0aG9yIHNlZXMgYW5vdGhlciBzaXRlIHdpdGggYQotICAgICAgICAgZmVhdHVyZSB0aGV5Ci0gICAgICAgICBsaWtlLCB0aGV5IGltbWVkaWF0ZWx5IGJyaW5nIHVwIHRoZSBzb3VyY2UgdG8gc2VlIGhvdyBpdCB3YXMgaW1wbGVtZW50ZWQuIEluIHRoaXMgd2F5IG1hbnkgd2ViCi0gICAgICAgICBhdXRob3JzIHdlcmUKLSAgICAgICAgIGFibGUgdG8gbGVhcm4gY29tcGxleCBIVE1MIHRyaWNrcyB3aXRoIG5vIGZvcm1hbCB0cmFpbmluZy4gV2hpbGUgc2VydmVyLXNpZGUgc2NyaXB0cyBhcmUgbm90IGFzCi0gICAgICAgICBlYXN5IHRvIGNvbWUKLSAgICAgICAgIGJ5LCB0aGVyZSBhcmUgc3RpbGwgbnVtZXJvdXMgc2l0ZXMgdGhhdCBob3VzZSB0aG91c2FuZHMgb2YgZXhhbXBsZSBzY3JpcHRzIGZvciBhIGJsb3Nzb21pbmcKLSAgICAgICAgIGRldmVsb3BlciB0bwotICAgICAgICAgZXhhbWluZS4gICAgICAgICAKLSAgICAgIDwvcD48cD4KLSAgICAgICAgIFRyYWRpdGlvbmFsbHkgWFNMVCBoYXMgYmVlbiBwcmVzZW50ZWQgYXMgYSBwcm9ncmFtbWluZyBsYW5ndWFnZSBmb3IgdHJhbnNsYXRpbmcgWE1MIGRvY3VtZW50cyBpbnRvIGFub3RoZXIKLSAgICAgICAgIGZvcm1hdCwgb2Z0ZW4gZm9yIHByZXNlbnRhdGlvbi4gVGhpcyBmcmFtZXMgdGhlIHByb2JsZW0sIHN1Y2ggdGhhdCBmb3IgZWFjaCBlbGVtZW50LCB0aGUgcHJvZ3JhbW1lciBoYXMgdGhlCi0gICAgICAgICB0YXNrIG9mIGZpZ3VyaW5nIG91dCBob3cgdGhhdCBlbGVtZW50IG5lZWRzIHRvIGJlIHRyYW5zbGF0ZWQuIEFzIGxvbmcgYXMgdGhlcmUgYXJlIG9uZSB0byBvbmUgbWFwcGluZ3Mgb3Igb25lCi0gICAgICAgICB0byB6ZXJvIG1hcHBpbmdzIHRoaXMgaXMgc3RyYWlnaHRmb3J3YXJkLiBGb3IgZXhhbXBsZSwgaWYgZXZlcnkgb2NjdXJyZW5jZSBvZiBhIAotICAgICAgICAgJmx0O25hbWUmZ3Q7Ci0gICAgICAgICBlbGVtZW50IGlzIGdvaW5nIHRvCi0gICAgICAgICBiZWNvbWUgYW4gSFRNTCBoZWFkZXIuIEl0IGlzIGEgc2ltcGxlIG1hdHRlciB0byB3cml0ZSBhIG1hdGNoaW5nIHRlbXBsYXRlIHRvIGFjY29tcGxpc2gKLSAgICAgICAgIHRoaXMuCi0gICAgICA8L3A+PGEgbmFtZT0icGxfTmFtZVRlbXBsYXRlIj48L2E+PHByZSBjbGFzcz0icHJvZ3JhbWxpc3RpbmciPgotCi0mbHQ7eHNsOnRlbXBsYXRlIG1hdGNoPSJuYW1lIiZndDsKLSAgJmx0O2gxJmd0OyZsdDt4c2w6YXBwbHktdGVtcGxhdGVzLyZndDsmbHQ7L2gxJmd0OwotJmx0Oy94c2w6dGVtcGxhdGUmZ3Q7Ci0gICAgICAKLSAgICAgIDwvcHJlPjxwPgotICAgICAgICAgSG93ZXZlciB3aGVuIGFkZGluZyBvbmUgdG8gbWFueSBtYXBwaW5ncyAoaS5lLiB3aGVuIGFuIGVsZW1lbnQmcnNxdW87cyBjb250ZW50cyB3aWxsIGFwcGVhciBtdWx0aXBsZSB0aW1lcyBpbiB0aGUKLSAgICAgICAgIHRhcmdldCBkb2N1bWVudCB3aXRoIGRpZmZlcmVudCBmb3JtYXR0aW5nKSwga2VlcGluZyB0cmFjayBvZiBhbGwgdGhlIHJlbGF0aW9uc2hpcHMgcXVpY2tseSBncm93cyBpbiBjb21wbGV4aXR5Ci0gICAgICAgICBhbmQgYmVjb21lcyBjb25mdXNpbmcuIEZvciBleGFtcGxlLCBpZiwgYWZ0ZXIgd3JpdGluZyB0aGUgcHJldmlvdXMgdGVtcGxhdGUsIHRoZSBwcm9ncmFtbWVyIGRpc2NvdmVycyB0aGF0IHRoZQotICAgICAgICAgbmFtZSBhbHNvIG5lZWRzIHRvIGJlIHBsYWNlZCBpbiB0aGUgdGl0bGUgdGhlIHByb2dyYW1tZXIgbWlnaHQgYWRkIHRoZSB0ZW1wbGF0ZQotICAgICAgPC9wPjxhIG5hbWU9InBsX3ZhbHVlT2YiPjwvYT48cHJlIGNsYXNzPSJwcm9ncmFtbGlzdGluZyI+Ci0KLSZsdDt4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iJmd0OwotICAmbHQ7dGl0bGUmZ3Q7Jmx0O3hzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5hbWUiLyZndDsmbHQ7L3RpdGxlJmd0OwotJmx0Oy94c2w6dGVtcGxhdGUmZ3Q7Ci0gICAgICAKLSAgICAgIDwvcHJlPjxwPgotICAgICAgICAgTm90aWNlIHRoZSB1c2Ugb2YgdGhlICZsdDt4c2w6dmFsdWUtb2YmZ3Q7Ci0gICAgICAgICBmdW5jdGlvbiBpbiB0aGlzIHRlbXBsYXRlIGJlY2F1c2UgdXNpbmcgJmx0O2FwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Im5hbWUiJmd0OwotICAgICAgICAgd291bGQgaGF2ZSBjYXVzZWQgYSB0cmlnZ2VyaW5nIG9mIHRoZSBwcmV2aW91cyB0ZW1wbGF0ZSBhZGRpbmcgdW5kZXNpcmVkIGhlYWRlciB0YWdzIHRvIG15IGNvbnRlbnQuIFRoaXMgbWVhbnMKLSAgICAgICAgIGJlZm9yZSBhZGRpbmcgYSB0cmFuc2xhdGlvbiB0byBhbiBlbGVtZW50IHRoZSBwcm9ncmFtbWVyIG11c3QgZmlyc3QgYmUgYXdhcmUgb2YgYWxsIHRoZSBleGlzdGluZyB0cmFuc2xhdGlvbnMKLSAgICAgICAgICh1Z2ghKS4gT2YgY291cnNlIGlmIHRoZSBwcm9ncmFtbWVyIGJlY2FtZSBhd2FyZSBvZiB0aGUKLSAgICAgICAgICZsdDt0aXRsZSZndDsKLSAgICAgICAgIHJlcXVpcmVtZW50IGZpcnN0LCB0aGUgY29udGVudHMgb2YgdGhlc2UgdGVtcGxhdGVzIGNvdWxkIGhhdmUgYmVlbiByZXZlcnNlZC4gT25lIGNhbiBxdWlja2x5IHNlZSBob3cKLSAgICAgICAgIHRoZQotICAgICAgICAgYXJiaXRyYXJ5IGRlY2lzaW9ucyBvZiBkZXZlbG9wbWVudCBhbmQgZGlzY292ZXJ5IG9mIHJlcXVpcmVtZW50cyBjYW4gbGVhZCB0byBhIHNldCBvZiB0ZW1wbGF0ZXMgdGhhdCBhcmUKLSAgICAgICAgIG5vCi0gICAgICAgICBsb25nZXIgaW50dWl0aXZlLgotICAgICAgPC9wPjxwPgotICAgICAgICAgQXMgYSBwcm9ncmFtbWVyIHdpdGggbW9yZSB0aGFuIDIwIHllYXJzIGV4cGVyaWVuY2Ugd2l0aCBvdmVyIGEgZG96ZW4gbGFuZ3VhZ2VzLCBYU0xUIHRlbXBsYXRlcyBhbmQgZGVmYXVsdAotICAgICAgICAgcnVsZXMgd2VyZQotICAgICAgICAgbm90IG9idmlvdXMgdG8gbWUuIE92ZXIgdGhlIHBhc3QgeWVhciBvciB0d28gSSBoYWQgbG9va2VkIGF0IG51bWVyb3VzIGV4YW1wbGVzIHRyeWluZyB0byBkaXNjZXJuIGhvdwotICAgICAgICAgdGhleQotICAgICAgICAgd29ya2VkLiBXaGlsZSBJIGNvdWxkIHVuZGVyc3RhbmQgdGhlIGdlbmVyYWwgZ2lzdCBvZiB3aGF0IHdhcyBvY2N1cnJpbmcsIHRoZXJlIHdhcyB0b28gbXVjaCBpbXBsaWVkCi0gICAgICAgICBiZWhhdmlvcgotICAgICAgICAgdGhhdCBJIGRpZCBub3QgcGljayB1cC4gSXQgd2FzIG5vdCB1bnRpbCBnb2luZyB0aHJvdWdoIGZvcm1hbCBYU0xUIHRyYWluaW5nIHRoYXQgSSBmdWxseSB1bmRlcnN0b29kIGhvdwotICAgICAgICAgWFNMVAotICAgICAgICAgd29ya2VkLiBDbGVhcmx5LCBpZiB0aGUgYmFycmllciB0byBlbnRyeSBpcyB0aGF0IGhpZ2ggZm9yIGFuIGV4cGVyaWVuY2VkIHByb2dyYW1tZXIsIHRoZSBhdmVyYWdlIHdlYgotICAgICAgICAgZGV2ZWxvcGVyCi0gICAgICAgICB3YXMgbm90IGdvaW5nIHRvIGZpbmQgdGhpcyB0ZWNobm9sb2d5IHZlcnkgdXNlZnVsLiAgICAgICAgICAKLSAgICAgIDwvcD48L2Rpdj48ZGl2IGNsYXNzPSJzZWN0aW9uIiBsYW5nPSJlbiI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgzIGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0iTjEwMDVBIj48L2E+VGhlIFNvbHV0aW9uPC9oMz48L2Rpdj48L2Rpdj48L2Rpdj48cD4KLSAgICAgICAgIFNvIGhvdyBkbyB3ZSBzb2x2ZSB0aGlzIHByb2JsZW0gYW5kIGhlbHAgZGVsaXZlciBYU0xUJnJzcXVvO3MgcHJvbWlzZSB0byB0aGUgbWFzc2VzPyBGb3IgWFNMVCB0byBiZSBzdWNjZXNzZnVsIGl0Ci0gICAgICAgICBtdXN0IGJlCi0gICAgICAgICBwcmVzZW50ZWQgYW5kIHVzZWQgaW4gYSB3YXkgdGhhdCBhZG9wdHMgdGhvc2UgYXR0cmlidXRlcyBkaXNjdXNzZWQgZWFybGllciAocmV1c2Ugb2Yga25vd2xlZGdlLCBmYXN0Ci0gICAgICAgICBzdGFydCwgYW5kCi0gICAgICAgICBncmFkdWFsaXNtKS4gVGhpcyB0dXRvcmlhbCB3aWxsIGF0dGVtcHQgdG8gZWFzZSBYU0xUJnJzcXVvO3MgaW50cm9kdWN0aW9uIGJ5IGZvY3VzaW5nIG9uIHRoZXNlIGF0dHJpYnV0ZXMuCi0gICAgICAgICBGaXJzdCwgaXQKLSAgICAgICAgIGlzIG9ubHkgZ29pbmcgdG8gZm9jdXMgb24gdGhlIGdlbmVyYXRpb24gb2YgSFRNTCBkb2N1bWVudHMgYW5kIHVzZXJzIHdobyBhcmUgZmFtaWxpYXIgd2l0aCBIVE1MLiBJZgotICAgICAgICAgeW91ciBnb2FsCi0gICAgICAgICBpcyB0byBpbW1lZGlhdGVseSBzdGFydCB0cmFuc2Zvcm1pbmcgb25lIFhNTCBkb2N1bWVudCBpbnRvIGFub3RoZXIgWE1MIGRvY3VtZW50IHRoaXMgdHV0b3JpYWwgaXMgbm90Ci0gICAgICAgICBmb3IgeW91LgotICAgICAgPC9wPjxwPgotICAgICAgICAgVGhlIHNlY29uZCBpcyB0byByZWZyYW1lIHRoZSBwcm9ibGVtIHNvIHRoZSBYU0xUIHNvbHV0aW9ucyBwcm9ncmFtbWVycyB3cml0ZSBhcmUgbW9yZSBuYXR1cmFsbHkgZXh0ZW5zaWJsZQotICAgICAgICAgYW5kCi0gICAgICAgICBpbnR1aXRpdmUuIEluc3RlYWQgb2YgdHJ5aW5nIHRvIHRyYW5zbGF0ZSBhbiBYTUwgc291cmNlIGRvY3VtZW50IGludG8gYW4gSFRNTCBwcmVzZW50YXRpb24gZG9jdW1lbnQsIHRoZQotICAgICAgICAgcHJvZ3JhbW1lciBzaG91bGQgc2VlIHRoZSBYTUwgZG9jdW1lbnQgYXMgYSBjb21wbGV4IGRhdGEgc3RydWN0dXJlIHdpdGggWFNMVCBwcm92aWRpbmcgcG93ZXJmdWwgdG9vbHMgZm9yCi0gICAgICAgICBleHRyYWN0aW5nIHRoYXQgaW5mb3JtYXRpb24gaW50byB0aGVpciBIVE1MIGRvY3VtZW50cy4gVGhpcyBhbGxvd3MgdXMgdG8gbGV2ZXJhZ2UgdGhlIGV4cGVyaWVuY2UgbW9zdCBwZW9wbGUKLSAgICAgICAgIGhhdmUgd2l0aCB1c2luZyBhbiBIVE1MIHRlbXBsYXRpbmcgbGFuZ3VhZ2UgKGUuZy4gQVNQLCBQSFAsIEpTUCwgQ29sZCBGdXNpb24sIFdlYiBNYWNybywgZXRjKS4gVGhlc2UgdGVtcGxhdGluZwotICAgICAgICAgbGFuZ3VhZ2VzIGFyZSBhbGwgYmFzZWQgb24gdGhlIGJhc2ljIHByZW1pc2UgdGhhdCBIVE1MIGNvbWVzIGZpcnN0IGFuZCBhbGwgZW5oYW5jZW1lbnRzIGFyZSB0aGVuIGVtYmVkZGVkIGluCi0gICAgICAgICBzcGVjaWFsIHRhZ3MuICAgICAgICAgCi0gICAgICA8L3A+PHA+Ci0gICAgICAgICBXaXRoIHNvbWUgY2F2ZWF0cywgdGhpcyB0dXRvcmlhbCB3aWxsIHNob3cgaG93IFhTTFQgY2FuIGJlIHVzZWQgaW4gdGhpcyBzYW1lIHdheS4gVGhlIGJlbmVmaXQgb2YgdGhpcwotICAgICAgICAgYXBwcm9hY2ggaXMgaXQKLSAgICAgICAgIGFsbG93cyB0aGUgcXVpY2sgdXNlIG9mIG1hbnkgb2YgWFNMVCZyc3F1bztzIHBvd2VyZnVsIGZ1bmN0aW9ucyB3aGlsZSBsZXR0aW5nIHlvdSBsZWFybiBpdHMgbW9yZQotICAgICAgICAgZXNvdGVyaWMKLSAgICAgICAgIGNhcGFiaWxpdGllcyBhcyB0aGUgbmVlZCBhcmlzZXMuIEluIGFkZGl0aW9uIHRoZSByZXN1bHRpbmcgWFNMVCBmaWxlcyBhcmUgbW9yZSBpbnR1aXRpdmUgYW5kCi0gICAgICAgICBtYWludGFpbmFibGUuCi0gICAgICA8L3A+PHByZSBjbGFzcz0icHJvZ3JhbWxpc3RpbmciPgotPHNwYW4gY2xhc3M9ImJvbGQiPjxzdHJvbmc+Jmx0O3hzbDp2YWx1ZS1vZiZndDsgYW5kIHt9PC9zdHJvbmc+PC9zcGFuPiAgICAgICAgIAotICAgICAgPC9wcmU+PHA+Ci0gICAgICAgICBPbiB0byBhbiBleGFtcGxlLiBIZXJlIGlzIGEgdmVyeSBzaW1wbGUgd2VsY29tZSBwYWdlLiAgICAgICAgIAotICAgICAgPC9wPjxwcmUgY2xhc3M9InByb2dyYW1saXN0aW5nIj4KLQotJmx0O2h0bWwmZ3Q7Ci0gICZsdDtoZWFkJmd0OwotICAgICZsdDt0aXRsZSZndDtXZWxjb21lJmx0Oy90aXRsZSZndDsKLSAgJmx0Oy9oZWFkJmd0OwotICAmbHQ7Ym9keSZndDsKLSAgICBXZWxjb21lIQotICAmbHQ7L2JvZHkmZ3Q7Ci0mbHQ7L2h0bWwmZ3Q7Ci0gICAgICAgICAKLSAgICAgIDwvcHJlPjxwPgotICAgICAgICAgQW5kIGhlcmUgaXMgYW4gWE1MIGRvY3VtZW50IHdpdGggaW5mb3JtYXRpb24gb24gbWVtYmVyLiAgICAgIAotICAgICAgPC9wPjxwcmUgY2xhc3M9InByb2dyYW1saXN0aW5nIj4KLQotJmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8mZ3Q7Ci0mbHQ7eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0gICAgICAgICAgICAgICAgdmVyc2lvbj0iMS4wIiZndDsKLSAgJmx0O3hzbDp0ZW1wbGF0ZSBtYXRjaD0iLyImZ3Q7Ci0gICAgJmx0O2h0bWwmZ3Q7Ci0gICAgICAmbHQ7aGVhZCZndDsKLSAgICAgICAgJmx0O3RpdGxlJmd0O1dlbGNvbWUmbHQ7L3RpdGxlJmd0OwotICAgICAgJmx0Oy9oZWFkJmd0OwotICAgICAgJmx0O2JvZHkmZ3Q7Ci0gICAgICAgIFdlbGNvbWUgJmx0O3hzbDp2YWx1ZS1vZiBzZWxlY3Q9Im1lbWJlci9uYW1lIi8mZ3Q7IQotICAgICAgJmx0Oy9ib2R5Jmd0OwotICAgICZsdDsvaHRtbCZndDsKLSAgJmx0Oy94c2w6dGVtcGxhdGUmZ3Q7Ci0mbHQ7L3hzbDpzdHlsZXNoZWV0Jmd0OwotICAgICAgCi0gICAgICA8L3ByZT48cD4KLSAgICAgICAgIFRoZXJlIGFyZSBhIGNvdXBsZSBvZiB0aGluZ3MgdGhhdCBuZWVkIHRvIGJlIHBvaW50ZWQgb3V0IHJpZ2h0IGF3YXkuIEZpcnN0IHRoaXMgaXMgYSB3ZWxsLWZvcm1lZCBYTUwKLSAgICAgICAgIGRvY3VtZW50LiBUaGlzIG1lYW4gYWxsIEhUTUwgdXNlZCBtdXN0IGNvbmZvcm0gdG8gdGhlIFhIVE1MIHNwZWNpZmljYXRpb24gKGkuZS4gYWxsIHRhZ3MgbXVzdCBiZSBjbG9zZWQgYW5kCi0gICAgICAgICBsb3dlcmNhc2UpLgotICAgICAgPC9wPjxwPgotICAgICAgICAgVGhlIGxpbmVzIGJlZm9yZSB0aGUgJmx0O2h0bWwmZ3Q7Ci0gICAgICAgICB0YWcgYW5kIGFmdGVyIHRoZSAmbHQ7L2h0bWwmZ3Q7Ci0gICAgICAgICB0YWcgd2lsbCBiZSBzZWVuIGluIGFsbCB0aGUgZXhhbXBsZXMuIEZvciBub3csIG90aGVyIHRoYW4gcmVhbGl6aW5nIHRoYXQgdGhleSBhcmUgcmVxdWlyZWQgaW4gYW55IHN0eWxlIHNoZWV0Ci0gICAgICAgICBjcmVhdGVkLCBqdXN0IGdvIGFoZWFkIGFuZCBmb3JnZXQgdGhleSBhcmUgdGhlcmUuIFlvdSBkb24mcnNxdW87dCBORUVEIHRvIHVuZGVyc3RhbmQgdGhlbSByaWdodCBub3cgdG8gZ2V0IHVzZWZ1bAotICAgICAgICAgd29yayBvdXQgb2YgWFNMVC4KLSAgICAgIDwvcD48cD4KLSAgICAgICAgIE5vdGljZSB0aGUgSFRNTCBpcyBpZGVudGljYWwgdG8gdGhlIG9yaWdpbmFsIGV4Y2VwdCBmb3IgdGhlIGludHJvZHVjdGlvbiBvZiBhIG5ldyB0YWcKLSAgICAgICAgICZsdDt4c2w6dmFsdWUtb2YmZ3Q7LgotICAgICAgICAgVGhpcyB0YWcgaXMgdGhlIGtleSB0byBleHRyYWN0aW5nIGFueSBwaWVjZSBvZiBpbmZvcm1hdGlvbiBvdXQgYW4gWE1MIGRvY3VtZW50LiBJdCBoYXMgYSAic2VsZWN0IgotICAgICAgICAgYXR0cmlidXRlIHRoYXQKLSAgICAgICAgIHByb3ZpZGVzIHRoZSBwYXRoIHRocm91Z2ggdGhlIFhNTCBkb2N1bWVudCB0byB0aGUgaW5mb3JtYXRpb24gd2Ugc2Vlay4gSW4gdGhpcyBjYXNlCi0gICAgICAgICAgICAmbHQ7bWVtYmVyJmd0OwotICAgICAgICAgaXMgdGhlIG91dGVyIG1vc3QgdGFnIGFuZAotICAgICAgICAgJmx0O25hbWUmZ3Q7Ci0gICAgICAgICBpcyB0aGUgdGFnIHVuZGVybmVhdGggaXQuIFNsYXNoIGNoYXJhY3RlcnMgKCIvIikgYXJlIHVzZWQgdG8gZGVzaWduYXRlIHBhcmVudC9jaGlsZCByZWxhdGlvbnNoaXBzCi0gICAgICAgICBiZXR3ZWVuIHRhZ3MuCi0gICAgICAgICBJZiB5b3UgYXJlIHVzZWQgdG8gbmF2aWdhdGluZyBhcm91bmQgYSBVbml4IGZpbGUgc3lzdGVtIHRoaXMgc2hvdWxkIGZlZWwgZmFtaWxpYXIuCi0gICAgICA8L3A+PHA+Ci0gICAgICAgICBOb3cgbGV0JnJzcXVvO3MgY29uc2lkZXIgZnVydGhlciBjdXN0b21pemluZyB0aGlzIHBhZ2UgYnkgbWFraW5nIHRoZSB3ZWxjb21lIGluIHRoZSBwZXJzb24mcnNxdW87cyBmYXZvcml0ZSBjb2xvciB1c2luZyB0aGUKLSAgICAgICAgICZsdDtmb250Jmd0OwotICAgICAgICAgdGFnIHdpdGggdGhlICJiZ2NvbG9yIiBhdHRyaWJ1dGUuIEJlY2F1c2UKLSAgICAgICAgICAgICZsdDt4c2w6dmFsdWUtb2YmZ3Q7Ci0gICAgICAgICBpcyBhbiBYTUwgdGFnIGl0IGlzIG5vdCB2YWxpZCB0byBpbnNlcnQgaXQgaW4gYW4gSFRNTCBhdHRyaWJ1dGUgdmFsdWUuIFNvIGFub3RoZXIgbWVjaGFuaXNtCi0gICAgICAgICBpcyBuZWVkZWQgdG8gaW5zZXJ0Ci0gICAgICAgICBpbmZvcm1hdGlvbiBmcm9tIG91ciBYTUwgZmlsZSB0aGVyZS4KLSAgICAgIDwvcD48cHJlIGNsYXNzPSJwcm9ncmFtbGlzdGluZyI+Ci0KLSZsdDs/eG1sIHZlcnNpb249IjEuMCI/Jmd0OwotJmx0O3hzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICAgICAgICAgICAgICAgIHZlcnNpb249IjEuMCImZ3Q7Ci0gICZsdDt4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iJmd0OwotICAgICZsdDtodG1sJmd0OwotICAgICAgJmx0O2hlYWQmZ3Q7Ci0gICAgICAgICZsdDt0aXRsZSZndDtXZWxjb21lJmx0Oy90aXRsZSZndDsKLSAgICAgICZsdDsvaGVhZCZndDsKLSAgICAgICZsdDtib2R5Jmd0OwotICAgICAgICAmbHQ7Zm9udCBiZ2NvbG9yPSJ7bWVtYmVyL2Zhdm9yaXRlQ29sb3J9IiZndDsKLSAgICAgICAgICBXZWxjb21lICZsdDt4c2w6dmFsdWUtb2Ygc2VsZWN0PSJtZW1iZXIvbmFtZSIvJmd0OyEKLSAgICAgICAgJmx0Oy9mb250Jmd0OwotICAgICAgJmx0Oy9ib2R5Jmd0OwotICAgICZsdDsvaHRtbCZndDsKLSAgJmx0Oy94c2w6dGVtcGxhdGUmZ3Q7Ci0mbHQ7L3hzbDpzdHlsZXNoZWV0Jmd0OwotCi0gICAgICA8L3ByZT48cD4KLSAgICAgICAgIE5vdGljZSB0aGUgdXNlIG9mIHRoZSBjdXJseSBicmFja2V0cyAoInt9IikuIFdoZW4gdXNlZCB3aXRoaW4gYW4gYXR0cmlidXRlIGFzc2lnbm1lbnQgIntwYXRofSIgaGFzIHRoZSBleGFjdAotICAgICAgICAgc2FtZSBlZmZlY3QgYXMKLSAgICAgICAgICZsdDt4c2w6dmFsdWUtb2Ygc2VsZWN0PSJwYXRoIiAvJmd0OwotICAgICAgICAgdXNlZCBvdXRzaWRlIG9mIGF0dHJpYnV0ZSBhc3NpZ25tZW50cy4KLSAgICAgIDwvcD48L2Rpdj48ZGl2IGNsYXNzPSJzZWN0aW9uIiBsYW5nPSJlbiI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgzIGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0iTjEwMDgxIj48L2E+UXVlcmllczwvaDM+PC9kaXY+PC9kaXY+PC9kaXY+PHA+Ci0gICAgICAgICBOb3QgYWxsIHBhdGhzIGxlYWQgdG8gYSBzaW5nbGUgbm9kZS4gRm9yIGV4YW1wbGUsIHdoYXQgaWYgd2Ugd2FudGVkIHRvIHB1dCBhIHBlcnNvbiZyc3F1bztzIGhvbWUgcGhvbmUgbnVtYmVyIG9uIHRoZQotICAgICAgICAgcGFnZT8gTm90aWNlIHRoYXQgdGhlIFhNTCBkb2N1bWVudCBjb250YWlucyB0d28gcGhvbmUgZW50cmllcy4gSWYgd2Ugc2ltcGx5IHVzZWQKLSAgICAgICAgICZsdDt4c2w6dmFsdWUtb2Ygc2VsZWN0PSJtZW1iZXIvcGhvbmUiIC8mZ3Q7Ci0gICAgICAgICBib3RoIGVudHJpZXMgd291bGQgYmUgcmV0dXJuZWQuIFdlIG9idmlvdXNseSBuZWVkIGEgd2F5IHRvIGJlIG1vcmUgc3BlY2lmaWMuIEx1Y2tpbHksIFhTTFQgYWxsb3dzIHRoZSBmdWxsCi0gICAgICAgICBwb3dlciBvZiBYUGF0aCB0byBkZXNjcmliZSB0aGUgdmFsdWUocykgb2YgaW50ZXJlc3QuIFhQYXRoIGFsbG93cyBjb25kaXRpb25zIG9uIGFueSBhdHRyaWJ1dGUgb3IgdGFnIHRvIGJlCi0gICAgICAgICBwbGFjZWQgaW4gc3F1YXJlIGJyYWNrZXRzICgiW10iKSB3aGljaCBhcmUgdGhlbiB1c2VkIHRvIHJlc3RyaWN0IHRoZSB2YWx1ZXMgcmV0dXJuZWQuCi0gICAgICA8L3A+PHA+Ci0gICAgICAgICBTbyB0byByZXRyaWV2ZSB0aGUgaG9tZSBwaG9uZSBudW1iZXIgd2Ugd291bGQgdXNlIHRoZSBwYXRoICJtZW1iZXIvcGhvbmVbQHR5cGU9JnJzcXVvO2hvbWUmcnNxdW87XSIuIE5vdGljZSB0aGUgIkAiCi0gICAgICAgICBzeW1ib2wgaW4gZnJvbnQKLSAgICAgICAgIG9mICJ0eXBlIi4gVGhlICJAIiBzeW1ib2wgc2lnbmlmaWVzIHRoYXQgd2UgYXJlIHJlZmVycmluZyB0byBhbiBhdHRyaWJ1dGUuIFNvIG91ciBuZXcgSFRNTAotICAgICAgICAgdGVtcGxhdGUgbG9va3MgbGlrZToKLSAgICAgIDwvcD48cHJlIGNsYXNzPSJwcm9ncmFtbGlzdGluZyI+Ci0gICAgICAKLSZsdDs/eG1sIHZlcnNpb249IjEuMCI/Jmd0OwotJmx0O3hzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICAgICAgICAgICAgICAgIHZlcnNpb249IjEuMCImZ3Q7Ci0gICZsdDt4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iJmd0OwotICAgICZsdDtodG1sJmd0OwotICAgICAgJmx0O2hlYWQmZ3Q7Ci0gICAgICAgICZsdDt0aXRsZSZndDtXZWxjb21lJmx0Oy90aXRsZSZndDsKLSAgICAgICZsdDsvaGVhZCZndDsKLSAgICAgICZsdDtib2R5Jmd0OwotICAgICAgICAmbHQ7Zm9udCBiZ2NvbG9yPSJ7bWVtYmVyL2Zhdm9yaXRlQ29sb3J9IiZndDsKLSAgICAgICAgICBXZWxjb21lICZsdDt4c2w6dmFsdWUtb2Ygc2VsZWN0PSJtZW1iZXIvbmFtZSIvJmd0OyEKLSAgICAgICAgICAmbHQ7YnIvJmd0OwotICAgICAgICAgIFlvdXIgaG9tZSBwaG9uZSBudW1iZXIgaXM6Ci0gICAgICAgICAgPHNwYW4gY2xhc3M9ImJvbGQiPjxzdHJvbmc+Jmx0O3hzbDp2YWx1ZS1vZiBzZWxlY3Q9Im1lbWJlci9waG9uZVtAdHlwZT0mcnNxdW87aG9tZSZyc3F1bztdIi8mZ3Q7PC9zdHJvbmc+PC9zcGFuPgotICAgICAgICAmbHQ7L2ZvbnQmZ3Q7Ci0gICAgICAmbHQ7L2JvZHkKLSAgICAmbHQ7L2h0bWwKLSAgJmx0Oy94c2w6dGVtcGxhdGUmZ3Q7Ci0mbHQ7L3hzbDpzdHlsZXNoZWV0Jmd0OwotCi0gICAgICA8L3ByZT48ZGl2IGNsYXNzPSJzZWN0aW9uIiBsYW5nPSJlbiI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGg0IGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0iTjEwMDhGIj48L2E+eHNsOmZvci1lYWNoPC9oND48L2Rpdj48L2Rpdj48L2Rpdj48cD4KLSAgICAgICAgICAgIFRoZSBwcmV2aW91cyBleGFtcGxlIGJyaW5ncyB1cCBhbm90aGVyIGlzc3VlLiBXaGF0IGlmIHRoaXMKLSAgICAgICAgICAgICZsdDttZW1iZXImZ3Q7Ci0gICAgICAgICAgICBlbnRyeSBoYWQgbnVtZXJvdXMgcGhvbmUgbnVtYmVycyBhbmQgd2Ugd2FudGVkIHRvIHByaW50IHRoZW0gYWxsIG9uIHRoZSB3ZWIgcGFnZS4gV2UgY291bGQgc2ltcGx5IHVzZQotICAgICAgICAgICAgICAgJmx0O3hzbDp2YWx1ZS1vZiBzZWxlY3Q9Im1lbWJlci9waG9uZSIgLyZndDsKLSAgICAgICAgICAgIGJ1dCB0aGlzIHdvdWxkIG5vdCBlbmFibGUgdXMgdG8gZm9ybWF0IHRoZSBwaG9uZSBudW1iZXIgaW50byBhIG5pY2UgbGlzdCB0aGF0IGRlc2NyaWJlcyB0aGUgdHlwZSBvZiBlYWNoCi0gICAgICAgICAgICBudW1iZXIuCi0gICAgICAgICA8L3A+PHA+Ci0gICAgICAgICAgICBUbyBhY2NvbXBsaXNoIHRoaXMgcmVxdWlyZXMgdGhlIGludHJvZHVjdGlvbiBvZiB0aGUKLSAgICAgICAgICAgICZsdDt4c2w6Zm9yLWVhY2gmZ3Q7Ci0gICAgICAgICAgICB0YWcgd2hpY2ggYWxsb3dzIHVzIHRvIGxvb3AgdGhyb3VnaCBlYWNoIG9mIHRoZSBlbGVtZW50cyB0aGF0IG1hdGNoIGEgZ2l2ZW4gcGF0aC4gU28gdG8KLSAgICAgICAgICAgIGNyZWF0ZSBhIHRhYmxlIHRoYXQKLSAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBwaG9uZSBudW1iZXIgdHlwZSBpbiB0aGUgZmlyc3QgY29sdW1uIGFuZCB0aGUgcGhvbmUgbnVtYmVyIGluIHRoZSBzZWNvbmQKLSAgICAgICAgICAgIGNvbHVtbiwgdGhlIGZvbGxvd2luZwotICAgICAgICAgICAgc3R5bGVzaGVldCBjb3VsZCBiZSB1c2VkLgotICAgICAgICAgPC9wPjxwcmUgY2xhc3M9InByb2dyYW1saXN0aW5nIj4KLQotJmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8mZ3Q7Ci0mbHQ7eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0gICAgICAgICAgICAgICAgdmVyc2lvbj0iMS4wIiZndDsKLSAgJmx0O3hzbDp0ZW1wbGF0ZSBtYXRjaD0iLyImZ3Q7Ci0gICAgJmx0O2h0bWwmZ3Q7Ci0gICAgICAmbHQ7aGVhZCZndDsKLSAgICAgICAgJmx0O3RpdGxlJmd0O1dlbGNvbWUmbHQ7L3RpdGxlJmd0OwotICAgICAgJmx0Oy9oZWFkJmd0OwotICAgICAgJmx0O2JvZHkmZ3Q7Ci0gICAgICAgICZsdDtmb250IGJnY29sb3I9InttZW1iZXIvZmF2b3JpdGVDb2xvcn0iJmd0OwotICAgICAgICAgIFdlbGNvbWUgJmx0O3hzbDp2YWx1ZS1vZiBzZWxlY3Q9Im1lbWJlci9uYW1lIi8mZ3Q7IQotICAgICAgICAmbHQ7L2ZvbnQmZ3Q7Ci0gICAgICAgICZsdDt0YWJsZSZndDsKLSAgICAgICAgICAmbHQ7dHImZ3Q7Jmx0O3RoJmd0O1R5cGUmbHQ7L3RoJmd0OyZsdDt0aCZndDtOdW1iZXImbHQ7L3RoJmd0OyZsdDsvdHImZ3Q7Ci0gICAgICAgICAgJmx0O3hzbDpmb3ItZWFjaCBzZWxlY3Q9Im1lbWJlci9waG9uZSImZ3Q7Ci0gICAgICAgICAgICAmbHQ7dHImZ3Q7Ci0gICAgICAgICAgICAgICZsdDt0ZCZndDsmbHQ7eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLyZndDsmbHQ7L3RkJmd0OwotICAgICAgICAgICAgICAmbHQ7dGQmZ3Q7Jmx0O3hzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLyZndDsmbHQ7L3RkJmd0OwotICAgICAgICAgICAgJmx0Oy90ciZndDsKLSAgICAgICAgICAmbHQ7L3hzbDpmb3ItZWFjaCZndDsKLSAgICAgICAgJmx0Oy90YWJsZSZndDsKLSAgICAgICZsdDsvYm9keSZndDsKLSAgICAmbHQ7L2h0bWwmZ3Q7Ci0gICZsdDsveHNsOnRlbXBsYXRlJmd0OwotJmx0Oy94c2w6c3R5bGVzaGVldCZndDsKLSAgICAgICAgIAotICAgICAgICAgPC9wcmU+PHA+Ci0gICAgICAgICAgICBUaGlzIGV4YW1wbGUgYnJpbmdzIHVwIGEgbnVtYmVyIG9mIGlzc3Vlcy4gRmlyc3QsIHdoaWxlIGluIHRoZSBsb29wLCBhbGwKLSAgICAgICAgICAgICZsdDt4c2w6dmFsdWUtb2YgLyZndDsKLSAgICAgICAgICAgIGFjY2Vzc2VzIGFyZSByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBlbGVtZW50IGJlaW5nIGl0ZXJhdGVkIG92ZXIgKGluIHRoaXMgY2FzZQotICAgICAgICAgICAgJmx0O3Bob25lJmd0OykuCi0gICAgICAgICAgICBOb3RpY2UgdGhlIHVzZSBvZiB0aGUgcGVyaW9kICgiLiIpLCB3aGljaCBsaWtlIGluIGEgVW5peCBmaWxlIHN5c3RlbSBtZWFucyB0aGUgY3VycmVudCBlbGVtZW50LgotICAgICAgICAgICAgU28gaW4gdGhpcwotICAgICAgICAgICAgY2FzZSB0aGUgcGVyaW9kICgiLiIpIHJlZmVycyB0byBlYWNoIHBob25lIGVsZW1lbnQgYXMgdGhlIGxvb3AgaXRlcmF0ZXMuIEFsc28gbGlrZSBpbiBhIGZpbGUKLSAgICAgICAgICAgIHN5c3RlbSB5b3UgY2FuCi0gICAgICAgICAgICBhZGRyZXNzIGEgcGFyZW50IGVsZW1lbnQgdXNpbmcgYSBkb3VibGUgcGVyaW9kICgiLi4iKSBhbmQgY2FuIGFjY2VzcyBhbnkgZWxlbWVudCBpbiB0aGUKLSAgICAgICAgICAgIGRvY3VtZW50IGJ5IHN0YXJ0aW5nCi0gICAgICAgICAgICBvdmVyIGF0IHRoZSByb290IGVsZW1lbnQgdXNpbmcgYSBzbGFzaCAoIi8iKS4KLSAgICAgICAgIDwvcD48L2Rpdj48ZGl2IGNsYXNzPSJzZWN0aW9uIiBsYW5nPSJlbiI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGg0IGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0iTjEwMDlCIj48L2E+eHNsOmlmPC9oND48L2Rpdj48L2Rpdj48L2Rpdj48cD4KLSAgICAgICAgICAgIEFzIGEgbGFzdCBlbmhhbmNlbWVudCB0byBvdXIgcGFnZSBsZXQmcnNxdW87cyBhZGQgYSBzcGVjaWFsIG9mZmVyIHRvICJwbGF0aW51bSIgbGV2ZWwgbWVtYmVycy4gVG8gZG8gdGhpcyByZXF1aXJlcwotICAgICAgICAgICAgdGhlIHVzZSBvZiBhIG5ldyB0YWcKLSAgICAgICAgICAgICZsdDt4c2w6aWYmZ3Q7Ci0gICAgICAgICAgICB3aGljaCBhbGxvd3MgdXMgdG8gaW5zZXJ0IGNvbnRlbnQgYmFzZWQgb24gYSBjb25kaXRpb24gb2YgdGhlIGRhdGEgaW4gdGhlIFhNTCBkb2N1bWVudC4KLSAgICAgICAgIDwvcD48cHJlIGNsYXNzPSJwcm9ncmFtbGlzdGluZyI+Ci0KLSZsdDs/eG1sIHZlcnNpb249IjEuMCI/Jmd0OwotJmx0O3hzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICAgICAgICAgICAgICAgIHZlcnNpb249IjEuMCImZ3Q7Ci0gICZsdDt4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iJmd0OwotICAgICZsdDtodG1sJmd0OwotICAgICAgJmx0O2hlYWQmZ3Q7Ci0gICAgICAgICZsdDt0aXRsZSZndDtXZWxjb21lJmx0Oy90aXRsZSZndDsKLSAgICAgICZsdDsvaGVhZCZndDsKLSAgICAgICZsdDtib2R5Jmd0OwotICAgICAgICAmbHQ7Zm9udCBiZ2NvbG9yPSJ7bWVtYmVyL2Zhdm9yaXRlQ29sb3J9IiZndDsKLSAgICAgICAgICBXZWxjb21lICZsdDt4c2w6dmFsdWUtb2Ygc2VsZWN0PSJtZW1iZXIvbmFtZSIvJmd0OyEKLSAgICAgICAgJmx0Oy9mb250Jmd0OwotICAgICAgICAmbHQ7eHNsOmlmIHRlc3Q9Im1lbWJlcltAbGV2ZWw9J3BsYXRpbnVtJ10iJmd0OwotICAgICAgICAgIE91ciBzcGVjaWFsIG9mZmVyIHRvIHBsYXRpbnVtIG1lbWJlcnMgdG9kYXkgaXMgc29tZXRoaW5nIGdyZWF0Ci0gICAgICAgICZsdDsveHNsOmlmJmd0OwotICAgICAgICAmbHQ7dGFibGUmZ3Q7Ci0gICAgICAgICAgJmx0O3RyJmd0OyZsdDt0aCZndDtUeXBlJmx0Oy90aCZndDsmbHQ7dGgmZ3Q7TnVtYmVyJmx0Oy90aCZndDsmbHQ7L3RyJmd0OwotICAgICAgICAgICZsdDt4c2w6Zm9yLWVhY2ggc2VsZWN0PSJtZW1iZXIvcGhvbmUiJmd0OwotICAgICAgICAgICAgJmx0O3RyJmd0OwotICAgICAgICAgICAgICAmbHQ7dGQmZ3Q7Jmx0O3hzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8mZ3Q7Jmx0Oy90ZCZndDsKLSAgICAgICAgICAgICAgJmx0O3RkJmd0OyZsdDt4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8mZ3Q7Jmx0Oy90ZCZndDsKLSAgICAgICAgICAgICZsdDsvdHImZ3Q7Ci0gICAgICAgICAgJmx0Oy94c2w6Zm9yLWVhY2gmZ3Q7Ci0gICAgICAgICZsdDsvdGFibGUmZ3Q7Ci0gICAgICAmbHQ7L2JvZHkmZ3Q7Ci0gICAgJmx0Oy9odG1sJmd0OwotICAmbHQ7L3hzbDp0ZW1wbGF0ZSZndDsKLSZsdDsveHNsOnN0eWxlc2hlZXQmZ3Q7Ci0gICAgICAgICAKLSAgICAgICAgIDwvcHJlPjxwPgotICAgICAgICAgICAgV2l0aGluIHRoZSAidGVzdCIgYXR0cmlidXRlIHRoZSBmdWxsIGFycmF5IG9mIEJvb2xlYW4gYW5kIHJlbGF0aXZlIG9wZXJhdG9ycyBhcmUgYXZhaWxhYmxlLiBUaGUgb25seSBjYXZlYXQKLSAgICAgICAgICAgIGlzIHRoYXQgc2luY2UgdGhpcyBpcyBhbiBYTUwgZG9jdW1lbnQgbGVzcyB0aGFuIGFuZCBncmVhdGVyIHRoYW4gKCImbHQ7IiwKLSAgICAgICAgICAgICImZ3Q7Iikgc2lnbnMgbXVzdCBiZSBlc2NhcGVkIGFzICImYW1wO2x0OyIgYW5kICImYW1wO2d0OyIuCi0gICAgICAgICA8L3A+PC9kaXY+PGRpdiBjbGFzcz0ic2VjdGlvbiIgbGFuZz0iZW4iPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoNCBjbGFzcz0idGl0bGUiPjxhIG5hbWU9Ik4xMDBBNSI+PC9hPnhzbDpjaG9vc2U8L2g0PjwvZGl2PjwvZGl2PjwvZGl2PjxwPgotICAgICAgICAgICAgT25lIG51YW5jZSBvZiB0aGUKLSAgICAgICAgICAgICZsdDt4c2w6aWYmZ3Q7Ci0gICAgICAgICAgICB0YWcgdGhhdCBpcyBub3QgYWx3YXlzIG9idmlvdXMgYXQgZmlyc3QgZ2xhbmNlIGlzIHRoZSBsYWNrIG9mIGFuICJlbHNlIiBzdGF0ZW1lbnQuIFRoaXMgbWVhbnMgdG8gaGF2ZSBhbgotICAgICAgICAgICAgZWxzZSBzdGF0ZW1lbnQgcmVxdWlyZXMgdHdvIGlmcy4gVGhlIGZpcnN0IG9uZSBzYXlpbmcgImlmIGNvbmRpdGlvbiIgYW5kIHRoZSBzZWNvbmQgb25lIHNheWluZyAmbGRxdW87aWYgbm90Ci0gICAgICAgICAgICBjb25kaXRpb24mcmRxdW87LiBUaGlzIHNjaGVtZSBxdWlja2x5IGJlY29tZXMgdW53b3JrYWJsZSB3aXRoIGVtYmVkZGVkIGlmIHRoZW4gZWxzZSBsb2dpYy4gTHVja2lseSBYU0xUCi0gICAgICAgICAgICBzdXBwb3J0cyBhbgotICAgICAgICAgICAgYWRkaXRpb25hbCB0ZXN0IG9wZXJhdG9yIGNhbGxlZAotICAgICAgICAgICAgJmx0O3hzbDpjaG9vc2UmZ3Q7Ci0gICAgICAgICAgICB3aGljaCB3b3JrcyBsaWtlIGEgc3dpdGNoL2Nhc2Ugc3RhdGVtZW50LgotICAgICAgICAgPC9wPjxwcmUgY2xhc3M9InByb2dyYW1saXN0aW5nIj4KLQotJmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8mZ3Q7Ci0mbHQ7eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0gICAgICAgICAgICAgICAgdmVyc2lvbj0iMS4wIiZndDsKLSAgJmx0O3hzbDp0ZW1wbGF0ZSBtYXRjaD0iLyImZ3Q7Ci0gICAgJmx0O2h0bWwmZ3Q7Ci0gICAgICAmbHQ7aGVhZCZndDsKLSAgICAgICAgJmx0O3RpdGxlJmd0O1dlbGNvbWUmbHQ7L3RpdGxlJmd0OwotICAgICAgJmx0Oy9oZWFkJmd0OwotICAgICAgJmx0O2JvZHkmZ3Q7Ci0gICAgICAgICZsdDtmb250IGJnY29sb3I9InttZW1iZXIvZmF2b3JpdGVDb2xvcn0iJmd0OwotICAgICAgICAgIFdlbGNvbWUgJmx0O3hzbDp2YWx1ZS1vZiBzZWxlY3Q9Im1lbWJlci9uYW1lIi8mZ3Q7IQotICAgICAgICAmbHQ7L2ZvbnQmZ3Q7Ci0gICAgICAgICZsdDt4c2w6Y2hvb3NlJmd0OwotICAgICAgICAgICZsdDt4c2w6d2hlbiB0ZXN0PSJtZW1iZXJbQGxldmVsPSdwbGF0aW51bSddIiZndDsKLSAgICAgICAgICAgIE91ciBzcGVjaWFsIG9mZmVyIHRvIHBsYXRpbnVtIG1lbWJlcnMgdG9kYXkgaXMgc29tZXRoaW5nIGdyZWF0Ci0gICAgICAgICAgJmx0Oy94c2w6d2hlbiZndDsKLSAgICAgICAgICAmbHQ7eHNsOm90aGVyd2lzZSZndDsKLSAgICAgICAgICAgIEJlY29tZSBhIHBsYXRpbnVtIG1lbWJlciB0b2RheSEKLSAgICAgICAgICAmbHQ7L3hzbDpvdGhlcndpc2UmZ3Q7Ci0gICAgICAgICZsdDsveHNsOmNob29zZSZndDsKLSAgICAgICAgJmx0O3RhYmxlJmd0OwotICAgICAgICAgICZsdDt0ciZndDsmbHQ7dGgmZ3Q7VHlwZSZsdDsvdGgmZ3Q7Jmx0O3RoJmd0O051bWJlciZsdDsvdGgmZ3Q7Jmx0Oy90ciZndDsKLSAgICAgICAgICAmbHQ7eHNsOmZvci1lYWNoIHNlbGVjdD0ibWVtYmVyL3Bob25lIiZndDsKLSAgICAgICAgICAgICZsdDt0ciZndDsKLSAgICAgICAgICAgICAgJmx0O3RkJmd0OyZsdDt4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvJmd0OyZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAgICZsdDt0ZCZndDsmbHQ7eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvJmd0OyZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7L3RyJmd0OwotICAgICAgICAgICZsdDsveHNsOmZvci1lYWNoJmd0OwotICAgICAgICAmbHQ7L3RhYmxlJmd0OwotICAgICAgJmx0Oy9ib2R5Jmd0OwotICAgICZsdDsvaHRtbCZndDsKLSAgJmx0Oy94c2w6dGVtcGxhdGUmZ3Q7Ci0mbHQ7L3hzbDpzdHlsZXNoZWV0Jmd0OwotICAgICAgICAgCi0gICAgICAgICA8L3ByZT48cD4KLSAgICAgICAgICAgIFRoZSAmbGRxdW87dGVzdCZyZHF1bzsgYXR0cmlidXRlIGhhcyB0aGUgc2FtZSBjYXBhYmlsaXRpZXMvIGNvbnN0cmFpbnRzIGFzIHRoZSAmbGRxdW87dGVzdCZyZHF1bzsgYXR0cmlidXRlIGluIHRoZQotICAgICAgICAgICAgJmx0O3hzbDppZiZndDsKLSAgICAgICAgICAgIHRhZy4gTXVsdGlwbGUKLSAgICAgICAgICAgICZsdDt4c2w6d2hlbiZndDsKLSAgICAgICAgICAgIGJsb2NrcyBhcmUgYWxsb3dlZC4gQXMgc29vbiBhcyBvbmUgJmxkcXVvO3doZW4gdGVzdCZyZHF1bzsgaXMgbWFjaGVkLCBpdCB3aWxsIG5vdCBldmFsdWF0ZSBhbnkgZnVydGhlciAmbGRxdW87eHNsOndoZW4KLSAgICAgICAgICAgIHRlc3RzJnJkcXVvOwotICAgICAgICAgICAgaW4gdGhlCi0gICAgICAgICAgICAmbHQ7eHNsOmNob29zZSZndDsKLSAgICAgICAgICAgIGJsb2NrLgotICAgICAgICAgPC9wPjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9InNlY3Rpb24iIGxhbmc9ImVuIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDMgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJOMTAwQUYiPjwvYT5Db25jbHVzaW9uPC9oMz48L2Rpdj48L2Rpdj48L2Rpdj48cD4KLSAgICAgICAgIFdpdGgganVzdCB0aGVzZSBmZXcgY29tbWFuZHMgKGFuIGFkbWl0dGVkbHkgc21hbGwgc3Vic2V0IG9mIFhTTFQpIGFuZCBhIHN0cm9uZyBiYWNrZ3JvdW5kIGluIEhUTUwgKERIVE1MIGFuZAotICAgICAgICAgSmF2YVNjcmlwdAotICAgICAgICAgaW5jbHVkZWQpLCBJIGJlbGlldmUgd2ViIGRldmVsb3BlcnMgY291bGQgbWVldCB0aGUgbWFqb3JpdHkgb2YgdGhlaXIgcHJlc2VudGF0aW9uIG5lZWRzLiBPYnZpb3VzbHkKLSAgICAgICAgIHRoZXJlIHdpbGwKLSAgICAgICAgIGJlIGNhc2VzIHdoZXJlIGdyZWF0ZXIgZmxleGliaWxpdHkgaXMgcmVxdWlyZWQsIGJ1dCB0aGUgYWR2YW50YWdlIG9mIHRoaXMgdGVjaG5pcXVlIGlzIHRoYXQgb25seQotICAgICAgICAgdGhlbiwgZG9lcyB0aGUKLSAgICAgICAgIGRldmVsb3BlciBuZWVkIHRvIGxlYXJuIHRob3NlIGNvbnN0cnVjdHMuICAgICAgICAgCi0gICAgICA8L3A+PHA+Ci0gICAgICAgICBBcyBhIGZ1cnRoZXIgYmVuZWZpdCwgdGhpcyB0ZWNobmlxdWUgbWluaW1pemVkIHRoZSBpbnRlcmRlcGVuZGVuY2Ugb2Ygb25lIFhMU1QgY29uc3RydWN0IG9uIGFub3RoZXIuIExvY2FsCi0gICAgICAgICBjaGFuZ2VzIHN0YXkKLSAgICAgICAgIGxvY2FsIHRoZXJlYnkgcmVkdWNpbmcgdGhlIGJyaXR0bGVuZXNzIG9mIHNvbHV0aW9ucy4gVGhlIGRldmVsb3BlciBhbHNvIG5vIGxvbmdlciBoYXMgdG8gcmVtZW1iZXIKLSAgICAgICAgIGFuZCBhY2NvdW50Ci0gICAgICAgICBmb3IgWFNMVCZyc3F1bztzIGRlZmF1bHQgYmVoYXZpb3JzLiAgICAgICAgIAotICAgICAgPC9wPjxwPgotICAgICAgICAgSSBob3BlIGZyb20gdGhlc2UgZmV3IGV4YW1wbGVzLCBJIGhhdmUgb3BlbmVkIGEgZmV3IGV5ZXMgdG8gdGhlIHBvd2VyIG9mIFhTTFQgYW5kIGhvdyBhIHNtYWxsIGNoYW5nZSBpbiBob3cKLSAgICAgICAgIFhTTFQgaXMgZnJhbWVkIGNhbiBtYWtlIGEgaHVnZSBkaWZmZXJlbmNlIGluIGl0cyB1bmRlcnN0YW5kYWJpbGl0eSBhbmQgYWNjZXNzaWJpbGl0eSB0byB3ZWIgZGV2ZWxvcGVycy4gSWYKLSAgICAgICAgIG5vdGhpbmcgZWxzZSwgSSBob3BlIHRvIGVuY291cmFnZSBzb21lIGdvb2QgZGlzY3Vzc2lvbnMuIAotICAgICAgPC9wPjwvZGl2PjwvZGl2PjwvZGl2PjwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL2NvbmNlcHRzL3Jlc291cmNlcy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL2NvbmNlcHRzL3Jlc291cmNlcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTgzZjA0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9jb25jZXB0cy9yZXNvdXJjZXMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPjx0aXRsZT5SZXNvdXJjZXM8L3RpdGxlPjxsaW5rIGhyZWY9ImJvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj48bGluayBocmVmPSIuLi9ib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+PG1ldGEgY29udGVudD0iRG9jQm9vayBYU0wgU3R5bGVzaGVldHMgVjEuNzQuMCIgbmFtZT0iZ2VuZXJhdG9yIj48bGluayByZWw9ImhvbWUiIGhyZWY9Ii4uL2luZGV4Lmh0bWwiIHRpdGxlPSJYU0wgVG9vbHMgVXNlciBEb2N1bWVudGF0aW9uIj48bGluayByZWw9InVwIiBocmVmPSJjb25jZXB0cy5odG1sIiB0aXRsZT0iWFNMVCBDb25jZXB0cyI+PGxpbmsgcmVsPSJwcmV2IiBocmVmPSJjb25jZXB0cy5odG1sIiB0aXRsZT0iWFNMVCBDb25jZXB0cyI+PGxpbmsgcmVsPSJuZXh0IiBocmVmPSIuLi9lZGl0b3IveHNsZWRpdG9yLmh0bWwiIHRpdGxlPSJYU0wgRWRpdGluZyI+PC9oZWFkPjxib2R5IGJnY29sb3I9IndoaXRlIiB0ZXh0PSJibGFjayIgbGluaz0iIzAwMDBGRiIgdmxpbms9IiM4NDAwODQiIGFsaW5rPSIjMDAwMEZGIj48ZGl2IGNsYXNzPSJzZWN0aW9uIiBsYW5nPSJlbiI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgyIGNsYXNzPSJ0aXRsZSIgc3R5bGU9ImNsZWFyOiBib3RoIj48YSBuYW1lPSJjb25jZXB0c19SZXNvdXJjZXMiPjwvYT5SZXNvdXJjZXM8L2gyPjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9Iml0ZW1pemVkbGlzdCI+PHVsIHR5cGU9ImRpc2MiPjxsaT48cD4KLSAgICAgICAgICAgICAgIDxhIGNsYXNzPSJ1bGluayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCIgdGFyZ2V0PSJfdG9wIj5YU0xUIDEuMCBTcGVjaWZpY2F0aW9uPC9hPiAtIFRoZSBvZmZpY2lhbCBXM0MgWFNMVCAxLjAgU3BlY2lmaWNhdGlvbi4KLSAgICAgICAgICAgIDwvcD48L2xpPjxsaT48cD4KLSAgICAgICAgICAgICAgIDxhIGNsYXNzPSJ1bGluayIgaHJlZj0iaHR0cDovL3d3dy5kcGF3c29uLmNvLnVrL3hzbC9pbmRleC5odG1sIiB0YXJnZXQ9Il90b3AiPlhTTFQgRkFRPC9hPiAtIG1haW50YWluZWQgYnkgRGF2ZSBQYXdzb24uCi0gICAgICAgICAgICA8L3A+PC9saT48bGk+PHA+PGEgY2xhc3M9InVsaW5rIiBocmVmPSJodHRwOi8vd3d3Lnhmcm9udC5jb20vcmVzY3VpbmcteHNsdC5odG1sIiB0YXJnZXQ9Il90b3AiPlJlc2N1aW5nIFhTTFQgZnJvbSBOaWNoZSBTdGF0dXM8L2E+IC0gYnkgRGF2aWQgSmFjb2JzLjwvcD48L2xpPjxsaT48cD48YSBjbGFzcz0idWxpbmsiIGhyZWY9Imh0dHA6Ly93d3cueG1sLmNvbS9wdWIvYS8yMDAzLzExLzI2L2xlYXJuWFNMVC5odG1sIiB0YXJnZXQ9Il90b3AiPkZpdmUgWFNMVCBCYXNpY3M8L2E+IC0gYnkgTWljaGFlbCBGaXR6Z2VyYWxkIGF1dGhvciBvZiBMZWFybmluZyBYU0xULjwvcD48L2xpPjxsaT48cD48YSBjbGFzcz0idWxpbmsiIGhyZWY9Imh0dHA6Ly93d3cueGZyb250LmNvbS9maWxlcy90dXRvcmlhbHMuaHRtbCIgdGFyZ2V0PSJfdG9wIj5YRnJvbnQgVHV0b3JpYWxzPC9hPiAtIHByb3ZpZGVzIHNldmVyYWwgdHV0b3JpYWxzIGluY2x1ZGUgWFNMVCAxLjAuPC9wPjwvbGk+PGxpPjxwPjxhIGNsYXNzPSJ1bGluayIgaHJlZj0iaHR0cDovL3d3dy5jYWZlY29ubGVjaGUub3JnL2Jvb2tzL2JpYmxlMi9jaGFwdGVycy9jaDE3Lmh0bWwiIHRhcmdldD0iX3RvcCI+WFNMIFRyYW5zZm9ybWF0aW9uczwvYT4gLSBDaGFwdGVyIDE3IG9mIHRoZSBYTUwgQmlibGUgMm5kIEVkaXRpb24uPC9wPjwvbGk+PC91bD48L2Rpdj48L2Rpdj48L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9lZGl0b3IveHNsZWRpdG9yLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvZWRpdG9yL3hzbGVkaXRvci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDIwNGJlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9lZGl0b3IveHNsZWRpdG9yLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08aHRtbD48aGVhZD48TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+PHRpdGxlPlhTTCBFZGl0aW5nPC90aXRsZT48bGluayBocmVmPSJib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+PGxpbmsgaHJlZj0iLi4vYm9vay5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPjxtZXRhIGNvbnRlbnQ9IkRvY0Jvb2sgWFNMIFN0eWxlc2hlZXRzIFYxLjc0LjAiIG5hbWU9ImdlbmVyYXRvciI+PGxpbmsgcmVsPSJob21lIiBocmVmPSIuLi9pbmRleC5odG1sIiB0aXRsZT0iWFNMIFRvb2xzIFVzZXIgRG9jdW1lbnRhdGlvbiI+PGxpbmsgcmVsPSJ1cCIgaHJlZj0iLi4vaW5kZXguaHRtbCIgdGl0bGU9IlhTTCBUb29scyBVc2VyIERvY3VtZW50YXRpb24iPjxsaW5rIHJlbD0icHJldiIgaHJlZj0iLi4vY29uY2VwdHMvcmVzb3VyY2VzLmh0bWwiIHRpdGxlPSJSZXNvdXJjZXMiPjxsaW5rIHJlbD0ibmV4dCIgaHJlZj0ieHNsZWRpdG9yX2NvbnRlbnRhc3Npc3QuaHRtbCIgdGl0bGU9IkNvbnRlbnQgQXNzaXN0Ij48L2hlYWQ+PGJvZHkgYmdjb2xvcj0id2hpdGUiIHRleHQ9ImJsYWNrIiBsaW5rPSIjMDAwMEZGIiB2bGluaz0iIzg0MDA4NCIgYWxpbms9IiMwMDAwRkYiPjxkaXYgY2xhc3M9ImNoYXB0ZXIiIGxhbmc9ImVuIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDIgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJOMTAwRTQiPjwvYT5YU0wgRWRpdGluZzwvaDI+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0idG9jIj48cD48Yj5UYWJsZSBvZiBDb250ZW50czwvYj48L3A+PHVsPjxsaT48c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0ieHNsZWRpdG9yLmh0bWwjVmFsaWRhdGlvbiI+VmFsaWRhdGlvbjwvYT48L3NwYW4+PC9saT48bGk+PHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9InhzbGVkaXRvcl9jb250ZW50YXNzaXN0Lmh0bWwiPkNvbnRlbnQgQXNzaXN0PC9hPjwvc3Bhbj48dWw+PGxpPjxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJ4c2xlZGl0b3JfY29udGVudGFzc2lzdC5odG1sI2VkX1hTTFByb3Bvc2FscyI+WFNMVCBFbGVtZW50IFByb3Bvc2FsczwvYT48L3NwYW4+PC9saT48bGk+PHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9InhzbGVkaXRvcl9jb250ZW50YXNzaXN0X3NlbGVjdHRlc3QuaHRtbCI+U2VsZWN0LCBUZXN0LCBhbmQgTWF0Y2ggQXR0cmlidXRlczwvYT48L3NwYW4+PC9saT48bGk+PHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9InhzbGVkaXRvcl9jb250ZW50YXNzaXN0X2V4Y2x1ZGUuaHRtbCI+RXhjbHVkZS1SZXN1bHQtUHJlZml4ZXM8L2E+PC9zcGFuPjwvbGk+PGxpPjxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJ4c2xlZGl0b3JfY29udGVudGFzc2lzdF9tb2RlYXNzaXN0Lmh0bWwiPk1vZGUgYXR0cmlidXRlIGFzc2lzdGFuY2U8L2E+PC9zcGFuPjwvbGk+PGxpPjxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJ4c2xlZGl0b3JfY29udGVudGFzc2lzdF9uYW1lZHRlbXBsYXRlLmh0bWwiPk5hbWVkIFRlbXBsYXRlIEFzc2lzdGFuY2U8L2E+PC9zcGFuPjwvbGk+PGxpPjxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJ4c2xlZGl0b3JfY29udGVudGFzc2lzdF9jYWxsdGVtcGxhdGUuaHRtbCI+Q2FsbC1UZW1wbGF0ZSBBc3Npc3RhbmNlPC9hPjwvc3Bhbj48L2xpPjxsaT48c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0ieHNsZWRpdG9yX2NvbnRlbnRhc3Npc3RfaW5jbHVkZS5odG1sIj4KLSAgICAgICAgICAgICAgICBJbmNsdWRlIGFuZCBJbXBvcnQKLSAgICAgICAgICAgICAgICBocmVmCi0gICAgICAgICAgICAgICAgQXNzaXN0YW5jZQotICAgICAgICAgICAgPC9hPjwvc3Bhbj48L2xpPjwvdWw+PC9saT48bGk+PHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9InhzbGVkaXRvcl90ZW1wbGF0ZXMuaHRtbCI+VGVtcGxhdGVzPC9hPjwvc3Bhbj48dWw+PGxpPjxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJ4c2xlZGl0b3JfdGVtcGxhdGVzLmh0bWwjTjEwMUQzIj5YUGF0aCBUZW1wbGF0ZXM8L2E+PC9zcGFuPjwvbGk+PC91bD48L2xpPjxsaT48c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0ieHNsZWRpdG9yX2NvbG9yaW5nLmh0bWwiPlhTTFQgU3ludGF4IENvbG9yaW5nPC9hPjwvc3Bhbj48L2xpPjxsaT48c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0ieHNsZWRpdG9yX21hcmtlcnMuaHRtbCI+WFNMVCBNYXJrZXJzIGFuZCBBbm5vdGF0aW9uczwvYT48L3NwYW4+PHVsPjxsaT48c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0ieHNsZWRpdG9yX21hcmtlcnMuaHRtbCN4c2x0T3ZlclJpZGUiPlRlbXBsYXRlIE92ZXJyaWRlPC9hPjwvc3Bhbj48L2xpPjwvdWw+PC9saT48bGk+PHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9InhzbGVkaXRvcl9kZWJ1Z2dpbmcuaHRtbCI+WFNMIERlYnVnZ2luZzwvYT48L3NwYW4+PC9saT48bGk+PHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9InhzbGVkaXRvcl9kZWJ1Z2dpbmcuaHRtbCI+TmF2aWdhdGlvbjwvYT48L3NwYW4+PC9saT48L3VsPjwvZGl2PjxwPlRoZSBYU0wgVG9vbHMgcGx1Z2lucyBleHRlbmQgdGhlIGFiaWxpdHkgb2YgdGhlIFdlYiBTdGFuZGFyZCBUb29scyBYTUwKLSAgICAgICAgZWRpdG9yLiBUaGlzIGV4dGVuc2lvbiBhZGRzIHNwZWNpZmljIHN1cHBvcnQgYW5kIGZ1bmN0aW9uYWxpdHkgZm9yIHdvcmtpbmcgd2l0aAotICAgICAgICBhbmQgZGVidWdnaW5nIFhTTCBmaWxlcy48L3A+PGRpdiBjbGFzcz0ic2VjdGlvbiIgbGFuZz0iZW4iPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoMiBjbGFzcz0idGl0bGUiIHN0eWxlPSJjbGVhcjogYm90aCI+PGEgbmFtZT0iVmFsaWRhdGlvbiI+PC9hPlZhbGlkYXRpb248L2gyPjwvZGl2PjwvZGl2PjwvZGl2PjxwPlRoZSBYU0wgZXh0ZW5zaW9ucyBmb3IgdGhlIGVjbGlwc2UgWE1MIGVkaXRvciBpbmNsdWRlIGFzIHlvdSB0eXBlCi0gICAgICAgICAgICB2YWxpZGF0aW9uIGZvciBYU0wgc3BlY2lmaWMgZmVhdHVyZXMuIFRoaXMgaW5jbHVkZXMgbm90IG9ubHkgdGhlIGFiaWxpdHkgdG8KLSAgICAgICAgICAgIHN5bnRheCBjaGVjayB0aGUgZ3JhbW1hciwgYnV0IHRvIGFsc28gdG8gdmFsaWRhdGUgc3BlY2lmaWMgWFNMIHNwZWNpZmljYXRpb24KLSAgICAgICAgICAgIHJ1bGVzLiBHcmFtbWFyIHZhbGlkYXRpb24gd2lsbCBiZSB0cmlnZ2VyZWQgYmFzZWQgb24gdGhlIHZlcnNpb24gYXR0cmlidXRlIGZvcgotICAgICAgICAgICAgdGhlIHN0eWxlIHNoZWV0IHRoYXQgaXMgYmVpbmcgZWRpdGVkLiBWYWxpZCB2ZXJzaW9uIG51bWJlcnMgYXJlIDEuMCwgYW5kIDIuMC4KLSAgICAgICAgPC9wPjwvZGl2PjwvZGl2PjwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL2VkaXRvci94c2xlZGl0b3JfY29sb3JpbmcuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9lZGl0b3IveHNsZWRpdG9yX2NvbG9yaW5nLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlY2YyMTUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL2VkaXRvci94c2xlZGl0b3JfY29sb3JpbmcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTxodG1sPjxoZWFkPjxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij48dGl0bGU+WFNMVCBTeW50YXggQ29sb3Jpbmc8L3RpdGxlPjxsaW5rIGhyZWY9ImJvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj48bGluayBocmVmPSIuLi9ib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+PG1ldGEgY29udGVudD0iRG9jQm9vayBYU0wgU3R5bGVzaGVldHMgVjEuNzQuMCIgbmFtZT0iZ2VuZXJhdG9yIj48bGluayByZWw9ImhvbWUiIGhyZWY9Ii4uL2luZGV4Lmh0bWwiIHRpdGxlPSJYU0wgVG9vbHMgVXNlciBEb2N1bWVudGF0aW9uIj48bGluayByZWw9InVwIiBocmVmPSJ4c2xlZGl0b3IuaHRtbCIgdGl0bGU9IlhTTCBFZGl0aW5nIj48bGluayByZWw9InByZXYiIGhyZWY9InhzbGVkaXRvcl90ZW1wbGF0ZXMuaHRtbCIgdGl0bGU9IlRlbXBsYXRlcyI+PGxpbmsgcmVsPSJuZXh0IiBocmVmPSJ4c2xlZGl0b3JfbWFya2Vycy5odG1sIiB0aXRsZT0iWFNMVCBNYXJrZXJzIGFuZCBBbm5vdGF0aW9ucyI+PC9oZWFkPjxib2R5IGJnY29sb3I9IndoaXRlIiB0ZXh0PSJibGFjayIgbGluaz0iIzAwMDBGRiIgdmxpbms9IiM4NDAwODQiIGFsaW5rPSIjMDAwMEZGIj48ZGl2IGNsYXNzPSJzZWN0aW9uIiBsYW5nPSJlbiI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgyIGNsYXNzPSJ0aXRsZSIgc3R5bGU9ImNsZWFyOiBib3RoIj48YSBuYW1lPSJ4c2x0U3ludGF4Q29sb3JpbmciPjwvYT5YU0xUIFN5bnRheCBDb2xvcmluZzwvaDI+PC9kaXY+PC9kaXY+PC9kaXY+PHA+Ci0gICAgICAgICAgICBYU0wgVG9vbHMgRWRpdG9yIGNhbiBoYXZlIHN5bnRheCBjb2xvcmluZyB0aGF0IGlzIHNwZWNpZmljIGp1c3QgZm9yIHRoZSB0aGUKLSAgICAgICAgICAgIFhTTFQgTmFtZXNwYWNlIGFzIHNob3dpbmcgaW4KLSAgICAgICAgICAgIDxhIGNsYXNzPSJ4cmVmIiBocmVmPSJ4c2xlZGl0b3JfY29sb3JpbmcuaHRtbCNmaWdfZWRpdG9yU3ludGF4Q29sb3JpbmciIHRpdGxlPSJGaWd1cmUmbmJzcDs4LiZuYnNwO1hTTFQgU3BlY2lmaWMgU3ludGF4IENvbG9yaW5nIj5GaWd1cmUmbmJzcDs4LCAmbGRxdW87WFNMVCBTcGVjaWZpYyBTeW50YXggQ29sb3JpbmcmcmRxdW87PC9hPgotICAgICAgICAgICAgLgotICAgICAgICA8L3A+PGRpdiBjbGFzcz0iZmlndXJlIj48YSBuYW1lPSJmaWdfZWRpdG9yU3ludGF4Q29sb3JpbmciPjwvYT48cCBjbGFzcz0idGl0bGUiPjxiPkZpZ3VyZSZuYnNwOzguJm5ic3A7WFNMVCBTcGVjaWZpYyBTeW50YXggQ29sb3Jpbmc8L2I+PC9wPjxkaXYgY2xhc3M9ImZpZ3VyZS1jb250ZW50cyI+PGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiIGFsaWduPSJjZW50ZXIiPjxpbWcgc3JjPSIuLi9pbWFnZXMvZWRpdG9yL3N5bnRheENvbG9yaW5nLnBuZyIgYWxpZ249Im1pZGRsZSIgYWx0PSJYU0xUIFNwZWNpZmljIFN5bnRheCBDb2xvcmluZyI+PC9kaXY+PC9kaXY+PC9kaXY+PGJyIGNsYXNzPSJmaWd1cmUtYnJlYWsiPjxwPgotICAgICAgICAgICAgVGhlIGRlZmF1bHQgY29sb3Jpbmcgc2hvd24gaXMgdG8gbWFrZSBhbGwgWFNMVCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBib2xkLgotICAgICAgICAgICAgVGhlIHNldHRpbmdzIGFyZSBjb250cm9sZWQgaW4KLSAgICAgICAgICAgIDxhIGNsYXNzPSJ4cmVmIiBocmVmPSIuLi9wcmVmZXJlbmNlcy94c2xwcmVmZXJlbmNlcy5odG1sIiB0aXRsZT0iWFNMIFRvb2xzIFByZWZlcmVuY2VzIj48aT5YU0wgVG9vbHMgUHJlZmVyZW5jZXM8L2k+PC9hPgotICAgICAgICAgICAgLgotICAgICAgICA8L3A+PC9kaXY+PC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvZWRpdG9yL3hzbGVkaXRvcl9jb250ZW50YXNzaXN0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvZWRpdG9yL3hzbGVkaXRvcl9jb250ZW50YXNzaXN0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViNWMzZGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL2VkaXRvci94c2xlZGl0b3JfY29udGVudGFzc2lzdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPjx0aXRsZT5Db250ZW50IEFzc2lzdDwvdGl0bGU+PGxpbmsgaHJlZj0iYm9vay5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPjxsaW5rIGhyZWY9Ii4uL2Jvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj48bWV0YSBjb250ZW50PSJEb2NCb29rIFhTTCBTdHlsZXNoZWV0cyBWMS43NC4wIiBuYW1lPSJnZW5lcmF0b3IiPjxsaW5rIHJlbD0iaG9tZSIgaHJlZj0iLi4vaW5kZXguaHRtbCIgdGl0bGU9IlhTTCBUb29scyBVc2VyIERvY3VtZW50YXRpb24iPjxsaW5rIHJlbD0idXAiIGhyZWY9InhzbGVkaXRvci5odG1sIiB0aXRsZT0iWFNMIEVkaXRpbmciPjxsaW5rIHJlbD0icHJldiIgaHJlZj0ieHNsZWRpdG9yLmh0bWwiIHRpdGxlPSJYU0wgRWRpdGluZyI+PGxpbmsgcmVsPSJuZXh0IiBocmVmPSJ4c2xlZGl0b3JfY29udGVudGFzc2lzdF9zZWxlY3R0ZXN0Lmh0bWwiIHRpdGxlPSJTZWxlY3QsIFRlc3QsIGFuZCBNYXRjaCBBdHRyaWJ1dGVzIj48L2hlYWQ+PGJvZHkgYmdjb2xvcj0id2hpdGUiIHRleHQ9ImJsYWNrIiBsaW5rPSIjMDAwMEZGIiB2bGluaz0iIzg0MDA4NCIgYWxpbms9IiMwMDAwRkYiPjxkaXYgY2xhc3M9InNlY3Rpb24iIGxhbmc9ImVuIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDIgY2xhc3M9InRpdGxlIiBzdHlsZT0iY2xlYXI6IGJvdGgiPjxhIG5hbWU9IkNvbnRlbnRBc3Npc3QiPjwvYT5Db250ZW50IEFzc2lzdDwvaDI+PC9kaXY+PC9kaXY+PC9kaXY+PHA+Ci0gICAgICAgICAgICBYU0wgVG9vbHMgZXh0ZW5kcyB0aGUgZXhpc3RpbmcgY29udGVudCBhc3Npc3RhbmNlIHN1cHBvcnQgb2YgdGhlIFhNTCBFZGl0b3IgdG8KLSAgICAgICAgICAgIHByb3ZpZGUgY29udGVudCBhc3Npc3RhbmNlIGZvciBzZXZlcmFsIFhTTCBuYW1lc3BhY2UgYXR0cmlidXRlcy4gVGhlIGNvbnRlbnQKLSAgICAgICAgICAgIGFzc2lzdGFuY2UgcHJvdmlkZWQgY292ZXJzIHRoZSBhdmFpbGFibGUgWFBhdGggc3RhdGVtZW50cyBhcyBkZWZpbmVkIGluIHRoZQotICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVtcGhhc2lzIj48ZW0+WFBhdGggVGVtcGxhdGVzPC9lbT48L3NwYW4+Ci0gICAgICAgICAgICBwcmVmZXJlbmNlIHBhZ2UuCi0gICAgICAgIDwvcD48ZGl2IGNsYXNzPSJpbXBvcnRhbnQiIHN0eWxlPSJtYXJnaW4tbGVmdDogMC41aW47IG1hcmdpbi1yaWdodDogMC41aW47Ij48aDMgY2xhc3M9InRpdGxlIj5YUGF0aCAyLjAgU3VwcG9ydDwvaDM+PHA+Q3VycmVudGx5IFhQYXRoIDIuMCBpcyBub3Qgc3VwcG9ydGVkIGRpcmVjdGx5LiBIb3dldmVyLCBhIHVzZXIKLSAgICAgICAgICAgICAgICBjYW4gYWRkIHRoaXMgc3VwcG9ydCBpZiB0aGV5IG5lZWQgaXQgYnkgYWRkaW5nIHRoZSBtaXNzaW5nIFhQYXRoIGZ1bmN0aW9ucwotICAgICAgICAgICAgICAgIHRvIHRoZSBYUGF0aCBUZW1wbGF0ZXMuPC9wPjwvZGl2PjxwPlRvIGluaXRpYXRlIGNvbnRlbnQgYXNzaXN0YW5jZSBwcmVzcyBDVFJMICsgU1BBQ0Ugb3IgQ01EICsgU1BBQ0UuIFRoaXMKLSAgICAgICAgICAgIHdpbGwgYnJpbmcgdXAgYSBkaWFsb2cgdGhhdCB3aWxsIGNvbnRhaW4gYW55IHByb3Bvc2FscyB0aGF0IGFyZSBhdmFpbGFibGUuIElmCi0gICAgICAgICAgICBubyBwcm9wb3NhbHMgYXJlIGF2YWlsYWJsZSBhbiBtZXNzYWdlIHdpbGwgYmUgZGlzcGxheWVkIGluIHRoZSBzdGF0dXMgYmFyLgotICAgICAgICA8L3A+PGRpdiBjbGFzcz0ic2VjdGlvbiIgbGFuZz0iZW4iPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoMyBjbGFzcz0idGl0bGUiPjxhIG5hbWU9ImVkX1hTTFByb3Bvc2FscyI+PC9hPlhTTFQgRWxlbWVudCBQcm9wb3NhbHM8L2gzPjwvZGl2PjwvZGl2PjwvZGl2PjxwPgotICAgICAgICAgICAgICAgIFNpbmNlIFhTTFQgaXMgYSB0ZW1wbGF0aW5nIGxhbmd1YWdlLCBpdCdzIGVsZW1lbnRzIG11c3QgYmUgYWJsZSB0byBiZQotICAgICAgICAgICAgICAgIGFkZGVkIHRvIHRoZSB2YXJpb3VzIG1hcmt1cCBpdCBpbmNsdWRlcy4gVGhlIFhTTFQgRWRpdG9yIHdpbGwgcHJvdmlkZQotICAgICAgICAgICAgICAgIGNvbnRlbnQgYXNzaXN0YW5jZSBhbmQgcHJvcG9zYWxzIGZvciBYU0xUIGVsZW1lbnRzIHRoYXQgYXJlIGF2YWlsYWJsZSB0bwotICAgICAgICAgICAgICAgIGJlIHVzZWQgd2l0aGluIG5vbi1YU0xUIG5hbWVzcGFjZWQgZWxlbWVudHMuIFRoaXMgaXMgZGVwaWN0ZWQgaW4KLSAgICAgICAgICAgICAgICA8YSBjbGFzcz0ieHJlZiIgaHJlZj0ieHNsZWRpdG9yX2NvbnRlbnRhc3Npc3QuaHRtbCNmaWdfWFNMUHJvcG9zYWxzIiB0aXRsZT0iRmlndXJlJm5ic3A7MS4mbmJzcDtYU0xUIFByb3Bvc2FscyB3aXRoaW4gTm9uLVhTTFQgZWxlbWVudHMiPkZpZ3VyZSZuYnNwOzEsICZsZHF1bztYU0xUIFByb3Bvc2FscyB3aXRoaW4gTm9uLVhTTFQgZWxlbWVudHMmcmRxdW87PC9hPgotICAgICAgICAgICAgICAgIC4KLSAgICAgICAgICAgIDwvcD48ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIG5hbWU9ImZpZ19YU0xQcm9wb3NhbHMiPjwvYT48cCBjbGFzcz0idGl0bGUiPjxiPkZpZ3VyZSZuYnNwOzEuJm5ic3A7WFNMVCBQcm9wb3NhbHMgd2l0aGluIE5vbi1YU0xUIGVsZW1lbnRzPC9iPjwvcD48ZGl2IGNsYXNzPSJmaWd1cmUtY29udGVudHMiPjxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0IiBhbGlnbj0iY2VudGVyIj48aW1nIHNyYz0iLi4vaW1hZ2VzL2VkaXRvci94c2xwcm9wb3NhbHMucG5nIiBhbGlnbj0ibWlkZGxlIiBhbHQ9IlhTTFQgUHJvcG9zYWxzIHdpdGhpbiBOb24tWFNMVCBlbGVtZW50cyI+PC9kaXY+PC9kaXY+PC9kaXY+PGJyIGNsYXNzPSJmaWd1cmUtYnJlYWsiPjwvZGl2PjwvZGl2PjwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL2VkaXRvci94c2xlZGl0b3JfY29udGVudGFzc2lzdF9jYWxsdGVtcGxhdGUuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9lZGl0b3IveHNsZWRpdG9yX2NvbnRlbnRhc3Npc3RfY2FsbHRlbXBsYXRlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NGZmMzMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL2VkaXRvci94c2xlZGl0b3JfY29udGVudGFzc2lzdF9jYWxsdGVtcGxhdGUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPjx0aXRsZT5DYWxsLVRlbXBsYXRlIEFzc2lzdGFuY2U8L3RpdGxlPjxsaW5rIGhyZWY9ImJvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj48bGluayBocmVmPSIuLi9ib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+PG1ldGEgY29udGVudD0iRG9jQm9vayBYU0wgU3R5bGVzaGVldHMgVjEuNzQuMCIgbmFtZT0iZ2VuZXJhdG9yIj48bGluayByZWw9ImhvbWUiIGhyZWY9Ii4uL2luZGV4Lmh0bWwiIHRpdGxlPSJYU0wgVG9vbHMgVXNlciBEb2N1bWVudGF0aW9uIj48bGluayByZWw9InVwIiBocmVmPSJ4c2xlZGl0b3JfY29udGVudGFzc2lzdC5odG1sIiB0aXRsZT0iQ29udGVudCBBc3Npc3QiPjxsaW5rIHJlbD0icHJldiIgaHJlZj0ieHNsZWRpdG9yX2NvbnRlbnRhc3Npc3RfbmFtZWR0ZW1wbGF0ZS5odG1sIiB0aXRsZT0iTmFtZWQgVGVtcGxhdGUgQXNzaXN0YW5jZSI+PGxpbmsgcmVsPSJuZXh0IiBocmVmPSJ4c2xlZGl0b3JfY29udGVudGFzc2lzdF9pbmNsdWRlLmh0bWwiIHRpdGxlPSJJbmNsdWRlIGFuZCBJbXBvcnQgaHJlZiBBc3Npc3RhbmNlIj48L2hlYWQ+PGJvZHkgYmdjb2xvcj0id2hpdGUiIHRleHQ9ImJsYWNrIiBsaW5rPSIjMDAwMEZGIiB2bGluaz0iIzg0MDA4NCIgYWxpbms9IiMwMDAwRkYiPjxkaXYgY2xhc3M9InNlY3Rpb24iIGxhbmc9ImVuIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDMgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJlZF9DYWxsVGVtcGxhdGVBc3Npc3QiPjwvYT5DYWxsLVRlbXBsYXRlIEFzc2lzdGFuY2U8L2gzPjwvZGl2PjwvZGl2PjwvZGl2PjxwPgotICAgICAgICAgICAgICAgIEFueQotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbXBoYXNpcyI+PGVtPmNhbGwtdGVtcGxhdGU8L2VtPjwvc3Bhbj4KLSAgICAgICAgICAgICAgICB4c2x0IGVsZW1lbnQgaGFzIGNvbnRlbnQgYXNzaXN0YW5jZSBhdmFpbGFibGUgZm9yIGl0J3MgbmFtZSBhdHRyaWJ1dGUuCi0gICAgICAgICAgICAgICAgVGhpcyB3aWxsIHByb3ZpZGUgYSBsaXN0IG9mIHBvc3NpYmxlIFhTTFQgbmFtZWQgdGVtcGxhdGVzIHRoYXQgY2FuIGJlCi0gICAgICAgICAgICAgICAgY2FsbGVkIGZyb20gdGhlIGN1cnJlbnQgc3R5bGVzaGVldC4gVGhpcyB0YWtlcyBpbnRvIGVmZmVjdCBhbGwgaW5jbHVkZWQKLSAgICAgICAgICAgICAgICBhbmQgaW1wb3J0ZWQgc3R5bGVzaGVldHMgYXMgd2VsbCBhcyB0aG9zZSBkZWZpbmVkIGluIHRoZSBjdXJyZW50Ci0gICAgICAgICAgICAgICAgc3R5bGVzaGVldC4KLSAgICAgICAgICAgIDwvcD48ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIG5hbWU9ImZpZ19DYWxsVGVtcGxhdGVBc3Npc3QiPjwvYT48cCBjbGFzcz0idGl0bGUiPjxiPkZpZ3VyZSZuYnNwOzYuJm5ic3A7Q2FsbC1UZW1wbGF0ZSBBc3Npc3RhbmNlPC9iPjwvcD48ZGl2IGNsYXNzPSJmaWd1cmUtY29udGVudHMiPjxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0IiBhbGlnbj0iY2VudGVyIj48aW1nIHNyYz0iLi4vaW1hZ2VzL2VkaXRvci9jYWxsdGVtcGxhdGUucG5nIiBhbGlnbj0ibWlkZGxlIiBhbHQ9IkNhbGwtVGVtcGxhdGUgQXNzaXN0YW5jZSI+PC9kaXY+PC9kaXY+PC9kaXY+PGJyIGNsYXNzPSJmaWd1cmUtYnJlYWsiPjwvZGl2PjwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL2VkaXRvci94c2xlZGl0b3JfY29udGVudGFzc2lzdF9leGNsdWRlLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvZWRpdG9yL3hzbGVkaXRvcl9jb250ZW50YXNzaXN0X2V4Y2x1ZGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY2Y2RhYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvZWRpdG9yL3hzbGVkaXRvcl9jb250ZW50YXNzaXN0X2V4Y2x1ZGUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTxodG1sPjxoZWFkPjxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij48dGl0bGU+RXhjbHVkZS1SZXN1bHQtUHJlZml4ZXM8L3RpdGxlPjxsaW5rIGhyZWY9ImJvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj48bGluayBocmVmPSIuLi9ib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+PG1ldGEgY29udGVudD0iRG9jQm9vayBYU0wgU3R5bGVzaGVldHMgVjEuNzQuMCIgbmFtZT0iZ2VuZXJhdG9yIj48bGluayByZWw9ImhvbWUiIGhyZWY9Ii4uL2luZGV4Lmh0bWwiIHRpdGxlPSJYU0wgVG9vbHMgVXNlciBEb2N1bWVudGF0aW9uIj48bGluayByZWw9InVwIiBocmVmPSJ4c2xlZGl0b3JfY29udGVudGFzc2lzdC5odG1sIiB0aXRsZT0iQ29udGVudCBBc3Npc3QiPjxsaW5rIHJlbD0icHJldiIgaHJlZj0ieHNsZWRpdG9yX2NvbnRlbnRhc3Npc3Rfc2VsZWN0dGVzdC5odG1sIiB0aXRsZT0iU2VsZWN0LCBUZXN0LCBhbmQgTWF0Y2ggQXR0cmlidXRlcyI+PGxpbmsgcmVsPSJuZXh0IiBocmVmPSJ4c2xlZGl0b3JfY29udGVudGFzc2lzdF9tb2RlYXNzaXN0Lmh0bWwiIHRpdGxlPSJNb2RlIGF0dHJpYnV0ZSBhc3Npc3RhbmNlIj48L2hlYWQ+PGJvZHkgYmdjb2xvcj0id2hpdGUiIHRleHQ9ImJsYWNrIiBsaW5rPSIjMDAwMEZGIiB2bGluaz0iIzg0MDA4NCIgYWxpbms9IiMwMDAwRkYiPjxkaXYgY2xhc3M9InNlY3Rpb24iIGxhbmc9ImVuIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDMgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJFeGNsdWRlUmVzdWx0UHJlZml4ZXNDb250ZW50QXNzaXN0Ij48L2E+RXhjbHVkZS1SZXN1bHQtUHJlZml4ZXM8L2gzPjwvZGl2PjwvZGl2PjwvZGl2PjxwPgotICAgICAgICAgICAgICAgIFRoZQotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbXBoYXNpcyI+PGVtPmV4Y2x1ZGUtcmVzdWx0LXByZWZpeGVzPC9lbT48L3NwYW4+Ci0gICAgICAgICAgICAgICAgYXR0cmlidXRlIGluIGJvdGggWFNMVCAxLjAgYW5kIFhTTFQgMi4wIGFsbG93cyBmb3IgdGhlIGV4Y2x1c2lvbiBvZgotICAgICAgICAgICAgICAgIGNlcnRhaW4gbmFtZXNwYWNlIGRlY2xhcmF0aW9ucyBpbiB0aGUgb3V0cHV0IGRvY3VtZW50LiBUaGUgY29udGVudAotICAgICAgICAgICAgICAgIGFzc2lzdGFuY2UgcG9wdWxhdGVzIGEgbGlzdCBvZiBhdmFpbGFibGUgbmFtZXNwYWNlcyB0aGF0IGhhdmUgYmVlbiBkZWZpbmVkCi0gICAgICAgICAgICAgICAgaW4gdGhlIHN0eWxzZWhlZXQgYW5kIHByb3ZpZGVzIHRoZW0gYXMgcHJvcG9zYWxzIGFzIHNob3duIGluCi0gICAgICAgICAgICAgICAgPGEgY2xhc3M9InhyZWYiIGhyZWY9InhzbGVkaXRvcl9jb250ZW50YXNzaXN0X2V4Y2x1ZGUuaHRtbCNmaWdfRXhjbHVkZVJlc3VsdFByZWZpeGVzQ29udGVudEFzc2lzdDEiIHRpdGxlPSJGaWd1cmUmbmJzcDsyLiZuYnNwO0V4Y2x1ZGUtcmVzdWx0LXByZWZpeGVzIENvbnRlbnQgQXNzaXN0YW5jZSI+RmlndXJlJm5ic3A7MiwgJmxkcXVvO0V4Y2x1ZGUtcmVzdWx0LXByZWZpeGVzIENvbnRlbnQgQXNzaXN0YW5jZQotICAgICAgICAgICAgICAgICZyZHF1bzs8L2E+Ci0gICAgICAgICAgICAgICAgLgotICAgICAgICAgICAgPC9wPjxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgbmFtZT0iZmlnX0V4Y2x1ZGVSZXN1bHRQcmVmaXhlc0NvbnRlbnRBc3Npc3QxIj48L2E+PHAgY2xhc3M9InRpdGxlIj48Yj5GaWd1cmUmbmJzcDsyLiZuYnNwO0V4Y2x1ZGUtcmVzdWx0LXByZWZpeGVzIENvbnRlbnQgQXNzaXN0YW5jZQotICAgICAgICAgICAgICAgIDwvYj48L3A+PGRpdiBjbGFzcz0iZmlndXJlLWNvbnRlbnRzIj48ZGl2IGNsYXNzPSJtZWRpYW9iamVjdCIgYWxpZ249ImNlbnRlciI+PGltZyBzcmM9Ii4uL2ltYWdlcy9lZGl0b3IvRXhjbHVkZUNvbnRlbnRBc3Npc3QxLnBuZyIgYWxpZ249Im1pZGRsZSIgYWx0PSJFeGNsdWRlLXJlc3VsdC1wcmVmaXhlcyBDb250ZW50IEFzc2lzdGFuY2UiPjwvZGl2PjwvZGl2PjwvZGl2PjxiciBjbGFzcz0iZmlndXJlLWJyZWFrIj48cD4KLSAgICAgICAgICAgICAgICBJZiB0aGUgYXR0cmlidXRlIGhhcyBubyB2YWx1ZXMgZGVmaW5lZCwgdGhlbiB0aGUKLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW1waGFzaXMiPjxlbT4jYWxsPC9lbT48L3NwYW4+Ci0gICAgICAgICAgICAgICAgdmFsdWUgd2lsbCBiZSBhdmFpbGFibGUgaW4gdGhlIGxpc3QuIElmICNhbGwgaXMgYWxyZWFkeSBpbiB0aGUgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIHZhbHVlLCB0aGVuIG5vIGNvbnRlbnQgYXNzaXN0YW5jZSB3aWxsIGJlIGF2YWlsYWJsZS4KLSAgICAgICAgICAgIDwvcD48ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIG5hbWU9ImZpZ19FeGNsdWRlUmVzdWx0UHJlZml4ZXNDb250ZW50QXNzaXN0MiI+PC9hPjxwIGNsYXNzPSJ0aXRsZSI+PGI+RmlndXJlJm5ic3A7My4mbmJzcDtGaWx0ZXJlZCBleGNsdWRlLXJlc3VsdC1wcmVmaXhlcyBwcm9wb3NhbHM8L2I+PC9wPjxkaXYgY2xhc3M9ImZpZ3VyZS1jb250ZW50cyI+PGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiIGFsaWduPSJjZW50ZXIiPjxpbWcgc3JjPSIuLi9pbWFnZXMvZWRpdG9yL0V4Y2x1ZGVDb250ZW50QXNzaXN0Mi5wbmciIGFsaWduPSJtaWRkbGUiIGFsdD0iRmlsdGVyZWQgZXhjbHVkZS1yZXN1bHQtcHJlZml4ZXMgcHJvcG9zYWxzIj48L2Rpdj48L2Rpdj48L2Rpdj48YnIgY2xhc3M9ImZpZ3VyZS1icmVhayI+PHA+Q29udGVudCBhc3Npc3RhbmNlIGlzIGludGVsbGlnZW50IGVub3VnaCB0byBrbm93IHdoZW4gYSBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICBwcmVmaXggaXMgYWxyZWFkeSBpbiB0aGUgbGlzdCBvZiBleGNsdWRlZCBuYW1lc3BhY2VzLiBJbiB0aGlzIGNhc2UgaXQgd2lsbAotICAgICAgICAgICAgICAgIG5vdCBzaG93IHRoZSBuYW1lc3BhY2UgaW4gdGhlIHByb3Bvc2FsIGxpc3QuPC9wPjxkaXYgY2xhc3M9Im5vdGUiIHN0eWxlPSJtYXJnaW4tbGVmdDogMC41aW47IG1hcmdpbi1yaWdodDogMC41aW47Ij48aDMgY2xhc3M9InRpdGxlIj4gV2h5IGlzbid0IHRoZSBYU0wgTmFtZXNwYWNlIHByZWZpeCBpbiB0aGUgcHJvcG9zYWxzPzwvaDM+PHA+Q3VycmVudGx5IHRoZSB4c2wgcHJlZml4IG9yIGFueSBwcmVmaXggdGhhdCB1c2VzIHRoZSBYU0wKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlIGlzIGV4Y2x1ZGVkIGZyb20gdGhlIGxpc3QuIFRoaXMgbWF5IGJlIGNoYW5nZWQgYXQgYSBmdXR1cmUKLSAgICAgICAgICAgICAgICAgICAgZGF0ZS4gVGhpcyB3aWxsIGRlcGVuZCBvbiB1c2VyIGZlZWRiYWNrLjwvcD48L2Rpdj48L2Rpdj48L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9lZGl0b3IveHNsZWRpdG9yX2NvbnRlbnRhc3Npc3RfaW5jbHVkZS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL2VkaXRvci94c2xlZGl0b3JfY29udGVudGFzc2lzdF9pbmNsdWRlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMTViNzcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL2VkaXRvci94c2xlZGl0b3JfY29udGVudGFzc2lzdF9pbmNsdWRlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08aHRtbD48aGVhZD48TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+PHRpdGxlPkluY2x1ZGUgYW5kIEltcG9ydCBocmVmIEFzc2lzdGFuY2U8L3RpdGxlPjxsaW5rIGhyZWY9ImJvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj48bGluayBocmVmPSIuLi9ib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+PG1ldGEgY29udGVudD0iRG9jQm9vayBYU0wgU3R5bGVzaGVldHMgVjEuNzQuMCIgbmFtZT0iZ2VuZXJhdG9yIj48bGluayByZWw9ImhvbWUiIGhyZWY9Ii4uL2luZGV4Lmh0bWwiIHRpdGxlPSJYU0wgVG9vbHMgVXNlciBEb2N1bWVudGF0aW9uIj48bGluayByZWw9InVwIiBocmVmPSJ4c2xlZGl0b3JfY29udGVudGFzc2lzdC5odG1sIiB0aXRsZT0iQ29udGVudCBBc3Npc3QiPjxsaW5rIHJlbD0icHJldiIgaHJlZj0ieHNsZWRpdG9yX2NvbnRlbnRhc3Npc3RfY2FsbHRlbXBsYXRlLmh0bWwiIHRpdGxlPSJDYWxsLVRlbXBsYXRlIEFzc2lzdGFuY2UiPjxsaW5rIHJlbD0ibmV4dCIgaHJlZj0ieHNsZWRpdG9yX3RlbXBsYXRlcy5odG1sIiB0aXRsZT0iVGVtcGxhdGVzIj48L2hlYWQ+PGJvZHkgYmdjb2xvcj0id2hpdGUiIHRleHQ9ImJsYWNrIiBsaW5rPSIjMDAwMEZGIiB2bGluaz0iIzg0MDA4NCIgYWxpbms9IiMwMDAwRkYiPjxkaXYgY2xhc3M9InNlY3Rpb24iIGxhbmc9ImVuIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDMgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJlZF9ocmVmIj48L2E+Ci0gICAgICAgICAgICAgICAgSW5jbHVkZSBhbmQgSW1wb3J0Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVtcGhhc2lzIj48ZW0+aHJlZjwvZW0+PC9zcGFuPgotICAgICAgICAgICAgICAgIEFzc2lzdGFuY2UKLSAgICAgICAgICAgIDwvaDM+PC9kaXY+PC9kaXY+PC9kaXY+PHA+WFNMVCBzdHlsZXNoZWV0cyBoYXZlIHRoZSBhYmlsaXR5IHRvIGltcG9ydCBhbmQgaW5jbHVkZSBvdGhlcgotICAgICAgICAgICAgICAgIHN0eWxlc2hlZXRzLiBUaGlzIGFsbG93cyBmb3IgYSBtb2R1bGFyIHN0cnVjdHVyZSBmb3IgdGhlIHRlbXBsYXRlcyB0byBiZQotICAgICAgICAgICAgICAgIGNyZWF0ZWQuIEl0IGFsc28gYWxsb3dzIGZvciBlYXNpZXIgbWFpbnRlbmFuY2UuIEhvd2V2ZXIsIGlmIG9uZSBpcyB3b3JraW5nCi0gICAgICAgICAgICAgICAgd2l0aCBhIGxhcmdlIHByb2plY3QgbGlrZSB0aGUgRG9jQm9vayBQcm9qZWN0cyBzdHlsZXNoZWV0cyBpdCBjYW4gYmUKLSAgICAgICAgICAgICAgICBkaWZmaWN1bHQgdG8gcmVtZW1iZXIgdGhlIG5hbWVzIGFuZCBsb2NhdGlvbnMgb2YgYWxsIHRoZSBzdHlsZXNoZWV0cy4KLSAgICAgICAgICAgIDwvcD48cD4KLSAgICAgICAgICAgICAgICBUbyB0aGlzIGVuZCwgdGhlIFhTTFQgZWRpdG9yIHByb3ZpZGVzIGNvbnRlbnQgYXNzaXN0YW5jZSBmb3IgdGhlCi0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVtcGhhc2lzIj48ZW0+aHJlZjwvZW0+PC9zcGFuPgotICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS4gVGhlIHNjb3BlIG9mIHRoZSBhc3Npc3RhbmNlIGlzIHJlc3RyaWN0ZWQgdG8gdGhlIHByb2plY3QgdGhhdAotICAgICAgICAgICAgICAgIHRoZSBjdXJyZW50IHN0eWxlc2hlZXQgdGhhdCBpcyBiZWluZyBlZGl0dGVkIHJlc2lkZXMuCi0gICAgICAgICAgICA8L3A+PGRpdiBjbGFzcz0iZmlndXJlIj48YSBuYW1lPSJmaWdfSFJFRkFzc2lzdGFuY2UiPjwvYT48cCBjbGFzcz0idGl0bGUiPjxiPkZpZ3VyZSZuYnNwOzcuJm5ic3A7SW5jbHVkZS9JbXBvcnQgaHJlZiBBc3Npc3RhbmNlPC9iPjwvcD48ZGl2IGNsYXNzPSJmaWd1cmUtY29udGVudHMiPjxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0IiBhbGlnbj0iY2VudGVyIj48aW1nIHNyYz0iLi4vaW1hZ2VzL2VkaXRvci9ocmVmQXNzaXN0YW5jZS5wbmciIGFsaWduPSJtaWRkbGUiIGFsdD0iSW5jbHVkZS9JbXBvcnQgaHJlZiBBc3Npc3RhbmNlIj48L2Rpdj48L2Rpdj48L2Rpdj48YnIgY2xhc3M9ImZpZ3VyZS1icmVhayI+PC9kaXY+PC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvZWRpdG9yL3hzbGVkaXRvcl9jb250ZW50YXNzaXN0X21vZGVhc3Npc3QuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9lZGl0b3IveHNsZWRpdG9yX2NvbnRlbnRhc3Npc3RfbW9kZWFzc2lzdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmM2NWIwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9lZGl0b3IveHNsZWRpdG9yX2NvbnRlbnRhc3Npc3RfbW9kZWFzc2lzdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPjx0aXRsZT5Nb2RlIGF0dHJpYnV0ZSBhc3Npc3RhbmNlPC90aXRsZT48bGluayBocmVmPSJib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+PGxpbmsgaHJlZj0iLi4vYm9vay5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPjxtZXRhIGNvbnRlbnQ9IkRvY0Jvb2sgWFNMIFN0eWxlc2hlZXRzIFYxLjc0LjAiIG5hbWU9ImdlbmVyYXRvciI+PGxpbmsgcmVsPSJob21lIiBocmVmPSIuLi9pbmRleC5odG1sIiB0aXRsZT0iWFNMIFRvb2xzIFVzZXIgRG9jdW1lbnRhdGlvbiI+PGxpbmsgcmVsPSJ1cCIgaHJlZj0ieHNsZWRpdG9yX2NvbnRlbnRhc3Npc3QuaHRtbCIgdGl0bGU9IkNvbnRlbnQgQXNzaXN0Ij48bGluayByZWw9InByZXYiIGhyZWY9InhzbGVkaXRvcl9jb250ZW50YXNzaXN0X2V4Y2x1ZGUuaHRtbCIgdGl0bGU9IkV4Y2x1ZGUtUmVzdWx0LVByZWZpeGVzIj48bGluayByZWw9Im5leHQiIGhyZWY9InhzbGVkaXRvcl9jb250ZW50YXNzaXN0X25hbWVkdGVtcGxhdGUuaHRtbCIgdGl0bGU9Ik5hbWVkIFRlbXBsYXRlIEFzc2lzdGFuY2UiPjwvaGVhZD48Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgdGV4dD0iYmxhY2siIGxpbms9IiMwMDAwRkYiIHZsaW5rPSIjODQwMDg0IiBhbGluaz0iIzAwMDBGRiI+PGRpdiBjbGFzcz0ic2VjdGlvbiIgbGFuZz0iZW4iPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoMyBjbGFzcz0idGl0bGUiPjxhIG5hbWU9ImVkX01vZGVBc3Npc3QiPjwvYT5Nb2RlIGF0dHJpYnV0ZSBhc3Npc3RhbmNlPC9oMz48L2Rpdj48L2Rpdj48L2Rpdj48cD4KLSAgICAgICAgICAgICAgICBDb250ZW50IGFzc2lzdGFuY2UgaXMgYXZhaWxhYmxlIGZvciB0aG9zZSB4c2wgZWxlbWVudHMgdGhhdCBzdXBwb3J0IHRoZQotICAgICAgICAgICAgICAgIG1vZGUgYXR0cmlidXRlLiBGb3IgWFNMVCAxLjAgdGhlc2UgZWxlbWVudHMgYXJlCi0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVtcGhhc2lzIj48ZW0+dGVtcGxhdGU8L2VtPjwvc3Bhbj4KLSAgICAgICAgICAgICAgICAsCi0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVtcGhhc2lzIj48ZW0+YXBwbHktdGVtcGxhdGVzPC9lbT48L3NwYW4+Ci0gICAgICAgICAgICAgICAgLCBhbmQKLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW1waGFzaXMiPjxlbT5hcHBseS1pbXBvcnRzPC9lbT48L3NwYW4+Ci0gICAgICAgICAgICAgICAgLgotICAgICAgICAgICAgPC9wPjxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgbmFtZT0iZmlnX01vZGVBc3Npc3RhbmNlIj48L2E+PHAgY2xhc3M9InRpdGxlIj48Yj5GaWd1cmUmbmJzcDs0LiZuYnNwO01vZGUgYXR0cmlidXRlIGFzc2lzdGFuY2U8L2I+PC9wPjxkaXYgY2xhc3M9ImZpZ3VyZS1jb250ZW50cyI+PGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiIGFsaWduPSJjZW50ZXIiPjxpbWcgc3JjPSIuLi9pbWFnZXMvZWRpdG9yL21vZGVBc3Npc3RhbmNlLnBuZyIgYWxpZ249Im1pZGRsZSIgYWx0PSJNb2RlIGF0dHJpYnV0ZSBhc3Npc3RhbmNlIj48L2Rpdj48L2Rpdj48L2Rpdj48YnIgY2xhc3M9ImZpZ3VyZS1icmVhayI+PHA+Ci0gICAgICAgICAgICAgICAgVGhlIHByb3Bvc2FsIGxpc3QgaXMgcG9wdWxhdGVkIGJ5IHRob3NlIG1vZGVzIGRlZmluZWQgb24gdGVtcGxhdGVzIGluIHRoZQotICAgICAgICAgICAgICAgIGN1cnJlbnQgc3R5bGVzaGVldCwgYW5kIGFueSBvZiB0aGUgdGVtcGxhdGVzIHRoYXQgYXJlCi0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVtcGhhc2lzIj48ZW0+aW5jbHVkZWQ8L2VtPjwvc3Bhbj4KLSAgICAgICAgICAgICAgICBvcgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbXBoYXNpcyI+PGVtPmltcG9ydGVkPC9lbT48L3NwYW4+Ci0gICAgICAgICAgICAgICAgLgotICAgICAgICAgICAgPC9wPjwvZGl2PjwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL2VkaXRvci94c2xlZGl0b3JfY29udGVudGFzc2lzdF9uYW1lZHRlbXBsYXRlLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvZWRpdG9yL3hzbGVkaXRvcl9jb250ZW50YXNzaXN0X25hbWVkdGVtcGxhdGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI4NzUwMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvZWRpdG9yL3hzbGVkaXRvcl9jb250ZW50YXNzaXN0X25hbWVkdGVtcGxhdGUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPjx0aXRsZT5OYW1lZCBUZW1wbGF0ZSBBc3Npc3RhbmNlPC90aXRsZT48bGluayBocmVmPSJib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+PGxpbmsgaHJlZj0iLi4vYm9vay5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPjxtZXRhIGNvbnRlbnQ9IkRvY0Jvb2sgWFNMIFN0eWxlc2hlZXRzIFYxLjc0LjAiIG5hbWU9ImdlbmVyYXRvciI+PGxpbmsgcmVsPSJob21lIiBocmVmPSIuLi9pbmRleC5odG1sIiB0aXRsZT0iWFNMIFRvb2xzIFVzZXIgRG9jdW1lbnRhdGlvbiI+PGxpbmsgcmVsPSJ1cCIgaHJlZj0ieHNsZWRpdG9yX2NvbnRlbnRhc3Npc3QuaHRtbCIgdGl0bGU9IkNvbnRlbnQgQXNzaXN0Ij48bGluayByZWw9InByZXYiIGhyZWY9InhzbGVkaXRvcl9jb250ZW50YXNzaXN0X21vZGVhc3Npc3QuaHRtbCIgdGl0bGU9Ik1vZGUgYXR0cmlidXRlIGFzc2lzdGFuY2UiPjxsaW5rIHJlbD0ibmV4dCIgaHJlZj0ieHNsZWRpdG9yX2NvbnRlbnRhc3Npc3RfY2FsbHRlbXBsYXRlLmh0bWwiIHRpdGxlPSJDYWxsLVRlbXBsYXRlIEFzc2lzdGFuY2UiPjwvaGVhZD48Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgdGV4dD0iYmxhY2siIGxpbms9IiMwMDAwRkYiIHZsaW5rPSIjODQwMDg0IiBhbGluaz0iIzAwMDBGRiI+PGRpdiBjbGFzcz0ic2VjdGlvbiIgbGFuZz0iZW4iPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoMyBjbGFzcz0idGl0bGUiPjxhIG5hbWU9ImVkX05hbWVkVGVtcGxhdGVBc3Npc3QiPjwvYT5OYW1lZCBUZW1wbGF0ZSBBc3Npc3RhbmNlPC9oMz48L2Rpdj48L2Rpdj48L2Rpdj48cD4KLSAgICAgICAgICAgICAgICBDYWxsIE5hbWVkIHRlbXBsYXRlcyBoYXZlIGNvbnRlbnQgYXNzaXN0YW5jZSBhdmFpbGFibGUgZm9yIHRoZWlyCi0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVtcGhhc2lzIj48ZW0+bmFtZTwvZW0+PC9zcGFuPgotICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMuIFRoaXMgd2lsbCBwcm92aWRlIGEgbGlzdCBvZiBjYWxsZWQtdGVtcGxhdGVzIHRoYXQgaGF2ZSBiZWVuCi0gICAgICAgICAgICAgICAgdXNlZCwgYnV0IGhhdmUgbm90IHlldCBiZWVuIGRlZmluZWQgb3Igb3ZlcnJpZGRlbiB3aXRoaW4gdGhlIGN1cnJlbnQKLSAgICAgICAgICAgICAgICBzdHlsZXNoZWV0LgotICAgICAgICAgICAgPC9wPjxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgbmFtZT0iZmlnX05hbWVkVGVtcGxhdGVzIj48L2E+PHAgY2xhc3M9InRpdGxlIj48Yj5GaWd1cmUmbmJzcDs1LiZuYnNwO05hbWVkIFRlbXBsYXRlIEFzc2lzdGFuY2U8L2I+PC9wPjxkaXYgY2xhc3M9ImZpZ3VyZS1jb250ZW50cyI+PGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiIGFsaWduPSJjZW50ZXIiPjxpbWcgc3JjPSIuLi9pbWFnZXMvZWRpdG9yL25hbWVkVGVtcGxhdGUucG5nIiBhbGlnbj0ibWlkZGxlIiBhbHQ9Ik5hbWVkIFRlbXBsYXRlIEFzc2lzdGFuY2UiPjwvZGl2PjwvZGl2PjwvZGl2PjxiciBjbGFzcz0iZmlndXJlLWJyZWFrIj48L2Rpdj48L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9lZGl0b3IveHNsZWRpdG9yX2NvbnRlbnRhc3Npc3Rfc2VsZWN0dGVzdC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL2VkaXRvci94c2xlZGl0b3JfY29udGVudGFzc2lzdF9zZWxlY3R0ZXN0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NDE4MDcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL2VkaXRvci94c2xlZGl0b3JfY29udGVudGFzc2lzdF9zZWxlY3R0ZXN0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08aHRtbD48aGVhZD48TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+PHRpdGxlPlNlbGVjdCwgVGVzdCwgYW5kIE1hdGNoIEF0dHJpYnV0ZXM8L3RpdGxlPjxsaW5rIGhyZWY9ImJvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj48bGluayBocmVmPSIuLi9ib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+PG1ldGEgY29udGVudD0iRG9jQm9vayBYU0wgU3R5bGVzaGVldHMgVjEuNzQuMCIgbmFtZT0iZ2VuZXJhdG9yIj48bGluayByZWw9ImhvbWUiIGhyZWY9Ii4uL2luZGV4Lmh0bWwiIHRpdGxlPSJYU0wgVG9vbHMgVXNlciBEb2N1bWVudGF0aW9uIj48bGluayByZWw9InVwIiBocmVmPSJ4c2xlZGl0b3JfY29udGVudGFzc2lzdC5odG1sIiB0aXRsZT0iQ29udGVudCBBc3Npc3QiPjxsaW5rIHJlbD0icHJldiIgaHJlZj0ieHNsZWRpdG9yX2NvbnRlbnRhc3Npc3QuaHRtbCIgdGl0bGU9IkNvbnRlbnQgQXNzaXN0Ij48bGluayByZWw9Im5leHQiIGhyZWY9InhzbGVkaXRvcl9jb250ZW50YXNzaXN0X2V4Y2x1ZGUuaHRtbCIgdGl0bGU9IkV4Y2x1ZGUtUmVzdWx0LVByZWZpeGVzIj48L2hlYWQ+PGJvZHkgYmdjb2xvcj0id2hpdGUiIHRleHQ9ImJsYWNrIiBsaW5rPSIjMDAwMEZGIiB2bGluaz0iIzg0MDA4NCIgYWxpbms9IiMwMDAwRkYiPjxkaXYgY2xhc3M9InNlY3Rpb24iIGxhbmc9ImVuIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDMgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJTZWxlY3RUZXN0Ij48L2E+U2VsZWN0LCBUZXN0LCBhbmQgTWF0Y2ggQXR0cmlidXRlczwvaDM+PC9kaXY+PC9kaXY+PC9kaXY+PHA+Ci0gICAgICAgICAgICAgICAgV2hlcmUgZXZlciBhbiB4c2wgZWxlbWVudCBzdXBwb3J0cyBhCi0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVtcGhhc2lzIj48ZW0+c2VsZWN0PC9lbT48L3NwYW4+Ci0gICAgICAgICAgICAgICAgLAotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbXBoYXNpcyI+PGVtPnRlc3Q8L2VtPjwvc3Bhbj4KLSAgICAgICAgICAgICAgICAsIG9yCi0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVtcGhhc2lzIj48ZW0+bWF0Y2g8L2VtPjwvc3Bhbj4KLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGUsIGNvbnRlbnQgYXNzaXN0YW5jZSBpcyBhdmFpbGFibGUuIFRoaXMgaW5jbHVkZXMgc3VwcG9ydCBmb3IgdGhlCi0gICAgICAgICAgICAgICAgZm9sbG93aW5nOgotICAgICAgICAgICAgPC9wPjxkaXYgY2xhc3M9Iml0ZW1pemVkbGlzdCI+PHAgY2xhc3M9InRpdGxlIj48Yj5TZWxlY3QsIE1hdGNoIGFuZCBUZXN0IEFzc2lzdGFuY2U8L2I+PC9wPjx1bCB0eXBlPSJkaXNjIj48bGk+PHA+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW1waGFzaXMiPjxlbT5WYXJpYWJsZXM8L2VtPjwvc3Bhbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIC0gYm90aCBsb2NhbCBhbmQgZ2xvYmFsIHZhcmlhYmxlcyBhcmUgc3VwcG9ydGVkIHdpdGhpbiB0aGUgY3VycmVudAotICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzaGVldC4gQW55IGxvY2FsIG9yIGdsb2JhbCB2YXJpYWJsZSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBsaXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIG5hbWUgaXMgcHJlZml4ZWQgd2l0aCBhIGRvbGxhciBzaWduICQgc3ltYm9sLgotICAgICAgICAgICAgICAgICAgICA8L3A+PC9saT48bGk+PHA+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW1waGFzaXMiPjxlbT5YUGF0aCAxLjA8L2VtPjwvc3Bhbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIC0gWFBhdGggMS4wIGlzIHN1cHBvcnRlZCB0aHJvdWdoIHRoZSB1c2Ugb2YgdGVtcGxhdGVzLiBBbGwgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBYUGF0aCAxLjAgYW5kIFhTTFQgeHBhdGggZXh0ZW5zaW9uIGZ1bmN0aW9ucyBhcmUgYXZhaWxhYmxlLCBhcwotICAgICAgICAgICAgICAgICAgICAgICAgd2VsbCBhcwotICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVtcGhhc2lzIj48ZW0+YXhpczwvZW0+PC9zcGFuPgotICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9ucy4gQ3VycmVudGx5IFhQYXRoIDIuMCBpcyBub3Qgc3VwcG9ydGVkIGRpcmVjdGx5LCBidXQKLSAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgYWRkZWQgaW4gdGhlIGZ1dHVyZS4KLSAgICAgICAgICAgICAgICAgICAgPC9wPjwvbGk+PC91bD48L2Rpdj48cD5Db250ZW50IGFzc2lzdGFuY2UgZm9yIHRoZSBzZWxlY3QgYW5kIHRlc3QgYXR0cmlidXRlcyBpcwotICAgICAgICAgICAgICAgIGludGVsbGlnZW50IGVub3VnaCB0byBrbm93IHRoYXQgaXQgaXMgd2l0aGluIGFuIFhQYXRoIGV4cHJlc3Npb24sIGFuZCB3aWxsCi0gICAgICAgICAgICAgICAgdHJ5IHRvIGRldGVybWluZSBhbmQgcHJvdmlkZSBjb250ZW50IGFzc2lzdGFuY2UgYmFzZWQgb24gdGhlIGN1cnJlbnQKLSAgICAgICAgICAgICAgICBjdXJzb3IgcG9zaXRpb24uIElmIGEgd29yZCBoYXMgYmVlbiBwYXJ0aWFsbHkgdHlwZWQgaXQgd2lsbCBmaWx0ZXIgdGhlCi0gICAgICAgICAgICAgICAgYXZhaWxhYmxlIGFzc2lzdGFuY2UuPC9wPjwvZGl2PjwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL2VkaXRvci94c2xlZGl0b3JfZGVidWdnaW5nLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvZWRpdG9yL3hzbGVkaXRvcl9kZWJ1Z2dpbmcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZlMzg0YS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvZWRpdG9yL3hzbGVkaXRvcl9kZWJ1Z2dpbmcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTxodG1sPjxoZWFkPjxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij48dGl0bGU+TmF2aWdhdGlvbjwvdGl0bGU+PGxpbmsgaHJlZj0iYm9vay5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPjxsaW5rIGhyZWY9Ii4uL2Jvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj48bWV0YSBjb250ZW50PSJEb2NCb29rIFhTTCBTdHlsZXNoZWV0cyBWMS43NC4wIiBuYW1lPSJnZW5lcmF0b3IiPjxsaW5rIHJlbD0iaG9tZSIgaHJlZj0iLi4vaW5kZXguaHRtbCIgdGl0bGU9IlhTTCBUb29scyBVc2VyIERvY3VtZW50YXRpb24iPjxsaW5rIHJlbD0idXAiIGhyZWY9InhzbGVkaXRvci5odG1sIiB0aXRsZT0iWFNMIEVkaXRpbmciPjxsaW5rIHJlbD0icHJldiIgaHJlZj0ieHNsZWRpdG9yX2RlYnVnZ2luZy5odG1sIiB0aXRsZT0iWFNMIERlYnVnZ2luZyI+PGxpbmsgcmVsPSJuZXh0IiBocmVmPSIuLi9sYXVuY2hpbmcvbGF1bmNoaW5nLmh0bWwiIHRpdGxlPSJYU0wgTGF1bmNoaW5nIGFuZCBEZWJ1Z2dpbmciPjwvaGVhZD48Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgdGV4dD0iYmxhY2siIGxpbms9IiMwMDAwRkYiIHZsaW5rPSIjODQwMDg0IiBhbGluaz0iIzAwMDBGRiI+PGRpdiBjbGFzcz0ic2VjdGlvbiIgbGFuZz0iZW4iPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoMiBjbGFzcz0idGl0bGUiIHN0eWxlPSJjbGVhcjogYm90aCI+PGEgbmFtZT0iTjEwMjIzIj48L2E+TmF2aWdhdGlvbjwvaDI+PC9kaXY+PC9kaXY+PC9kaXY+PHA+Ci0gICAgICAgICAgICBNYW55IG9mIHRoZSB2YXJpYWJsZXMsIGltcG9ydHMvaW5jbHVkZXMsIGFuZCB0ZW1wbGF0ZXMgY2FuIGJlIG5hdmlnYXRlZCB0bwotICAgICAgICAgICAgdXNpbmcgdGhlCi0gICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW1waGFzaXMiPjxlbT5PcGVuIERlY2xhcmF0aW9uIChGMyk8L2VtPjwvc3Bhbj4KLSAgICAgICAgICAgIHBvcHVwIG1lbnUgb3B0aW9uLiBUaGV5IGNhbiBhbHNvIGJlIG5hdmlnYXRlZCB0byBkaXJlY3RseSBieSBDVFJMLUNsaWNraW5nIG9uCi0gICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUsIGltcG9ydC9pbmNsdWRlLCBvciB0ZW1wbGF0ZS4gSXRlbXMgdGhhdCBjdXJyZW50bHkKLSAgICAgICAgICAgIGhhdmUgaHlwZXJsaW5raW5nIG5hdmlnYXRpb24gYXJlOgotICAgICAgICA8L3A+PGRpdiBjbGFzcz0iaXRlbWl6ZWRsaXN0Ij48dWwgdHlwZT0iZGlzYyI+PGxpPjxwPkNhbGxlZC1UZW1wbGF0ZXM8L3A+PC9saT48bGk+PHA+aHJlZnMgZm9yIEltcG9ydCBhbmQgSW5jbHVkZXM8L3A+PC9saT48bGk+PHA+V2l0aC1QYXJhbSB2YXJpYWJsZXM8L3A+PC9saT48L3VsPjwvZGl2PjxkaXYgY2xhc3M9InRpcCIgc3R5bGU9Im1hcmdpbi1sZWZ0OiAwLjVpbjsgbWFyZ2luLXJpZ2h0OiAwLjVpbjsiPjxoMyBjbGFzcz0idGl0bGUiPk5hdmlnYXRpb24gdG8gYSBOYW1lZCBUZW1wbGF0ZSBpbiBhbiBpbmNsdWRlZC9pbXBvcnRlZAotICAgICAgICAgICAgICAgIHN0eWxzaGVldDwvaDM+PHA+IFRoZSBoeXBlcmxpbmtpbmcgYWJpbGl0eSB3aWxsIG5hdmlnYXRlIHlvdSB0byB3aGVyZSBldmVyIHRoZSBmaXJzdAotICAgICAgICAgICAgICAgIGRlZmluaXRpb24gb2YgdGhlIHRlbXBsYXRlIGlzIGRlZmluZWQuIFNvIGlmIHRoZSB0ZW1wbGF0ZSBpcyBkZWZpbmVkCi0gICAgICAgICAgICAgICAgd2l0aGluIHRoZSBjdXJyZW50IHN0eWxlc2hlZXQgaXQgd2lsbCBuYXZpZ2F0ZSB0byB0aGF0IGRlZmluaXRpb24uIEhvd2V2ZXIKLSAgICAgICAgICAgICAgICBpZiBpdCBpcyBkZWZpbmVkIGluIGFuIGltcG9ydGVkIG9yIGluY2x1ZGVkIHN0eWxlc2hlZXQsIG9yIGFueSBvZiB0aG9zZQotICAgICAgICAgICAgICAgIGltcG9ydGVkIG9yIGluY2x1ZGVkIHN0eWxlc2hlZXRzIGl0IHdpbGwgdGFrZSB5b3UgdG8gdGhhdCBkZWZpbml0aW9uLiBVc2UKLSAgICAgICAgICAgICAgICB0aGUgc3RhbmRhcmQgbmF2aWdhdGlvbiBlcnJvcnMgdG8gbW92ZSBiYWNrIGFuZCBmb3J0aCBkdXJpbmcgdGhpcwotICAgICAgICAgICAgICAgIGh5cGVybGlua2luZy48L3A+PC9kaXY+PC9kaXY+PC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvZWRpdG9yL3hzbGVkaXRvcl9tYXJrZXJzLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvZWRpdG9yL3hzbGVkaXRvcl9tYXJrZXJzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MzcxNjAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL2VkaXRvci94c2xlZGl0b3JfbWFya2Vycy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPjx0aXRsZT5YU0xUIE1hcmtlcnMgYW5kIEFubm90YXRpb25zPC90aXRsZT48bGluayBocmVmPSJib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+PGxpbmsgaHJlZj0iLi4vYm9vay5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPjxtZXRhIGNvbnRlbnQ9IkRvY0Jvb2sgWFNMIFN0eWxlc2hlZXRzIFYxLjc0LjAiIG5hbWU9ImdlbmVyYXRvciI+PGxpbmsgcmVsPSJob21lIiBocmVmPSIuLi9pbmRleC5odG1sIiB0aXRsZT0iWFNMIFRvb2xzIFVzZXIgRG9jdW1lbnRhdGlvbiI+PGxpbmsgcmVsPSJ1cCIgaHJlZj0ieHNsZWRpdG9yLmh0bWwiIHRpdGxlPSJYU0wgRWRpdGluZyI+PGxpbmsgcmVsPSJwcmV2IiBocmVmPSJ4c2xlZGl0b3JfY29sb3JpbmcuaHRtbCIgdGl0bGU9IlhTTFQgU3ludGF4IENvbG9yaW5nIj48bGluayByZWw9Im5leHQiIGhyZWY9InhzbGVkaXRvcl9kZWJ1Z2dpbmcuaHRtbCIgdGl0bGU9IlhTTCBEZWJ1Z2dpbmciPjwvaGVhZD48Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgdGV4dD0iYmxhY2siIGxpbms9IiMwMDAwRkYiIHZsaW5rPSIjODQwMDg0IiBhbGluaz0iIzAwMDBGRiI+PGRpdiBjbGFzcz0ic2VjdGlvbiIgbGFuZz0iZW4iPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoMiBjbGFzcz0idGl0bGUiIHN0eWxlPSJjbGVhcjogYm90aCI+PGEgbmFtZT0ieHNsdE1hcmtlcnMiPjwvYT5YU0xUIE1hcmtlcnMgYW5kIEFubm90YXRpb25zPC9oMj48L2Rpdj48L2Rpdj48L2Rpdj48cD5UaGUgWFNMIGVkaXRvciBzdXBwb3J0cyB0aGUgYWJpbGl0eSB0byBhbm5vdGF0ZSBvciBwcm92aWRlIG1hcmtlcnMuIFRoZXNlCi0gICAgICAgICAgICBhbm5vdGF0aW9ucyBwcm92aWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRlbXBsYXRlcyBhbmQgWFNMVAotICAgICAgICAgICAgZWxlbWVudHMgaW4gdGhlIHN0eWxlc2hlZXQuPC9wPjxkaXYgY2xhc3M9InNlY3Rpb24iIGxhbmc9ImVuIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDMgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJ4c2x0T3ZlclJpZGUiPjwvYT5UZW1wbGF0ZSBPdmVycmlkZTwvaDM+PC9kaXY+PC9kaXY+PC9kaXY+PHA+VGhlIFhTTFQgZWRpdG9yIHdpbGwgbWFyayB0ZW1wbGF0ZXMgdGhhdCBoYXZlIG92ZXJyaWRlbiBhbiBpbXBvcnRlZAotICAgICAgICAgICAgICAgIHRlbXBsYXRlIG9mIHRoZSBzYW1lIG5hbWUuPC9wPjxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgbmFtZT0iZmlnX092ZXJSaWRlMSI+PC9hPjxwIGNsYXNzPSJ0aXRsZSI+PGI+RmlndXJlJm5ic3A7OS4mbmJzcDtPdmVycmlkZW4gVGVtcGxhdGU8L2I+PC9wPjxkaXYgY2xhc3M9ImZpZ3VyZS1jb250ZW50cyI+PGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiIGFsaWduPSJjZW50ZXIiPjxpbWcgc3JjPSIuLi9pbWFnZXMvZWRpdG9yL292ZXJyaWRlMS5wbmciIGFsaWduPSJtaWRkbGUiIGFsdD0iT3ZlcnJpZGVuIFRlbXBsYXRlIj48L2Rpdj48L2Rpdj48L2Rpdj48YnIgY2xhc3M9ImZpZ3VyZS1icmVhayI+PHA+Ci0gICAgICAgICAgICAgICAgSW4KLSAgICAgICAgICAgICAgICA8YSBjbGFzcz0ieHJlZiIgaHJlZj0ieHNsZWRpdG9yX21hcmtlcnMuaHRtbCNmaWdfT3ZlclJpZGUxIiB0aXRsZT0iRmlndXJlJm5ic3A7OS4mbmJzcDtPdmVycmlkZW4gVGVtcGxhdGUiPkZpZ3VyZSZuYnNwOzksICZsZHF1bztPdmVycmlkZW4gVGVtcGxhdGUmcmRxdW87PC9hPgotICAgICAgICAgICAgICAgICwgdGhlIHRlbXBsYXRlCi0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVtcGhhc2lzIj48ZW0+VGVtcEI8L2VtPjwvc3Bhbj4KLSAgICAgICAgICAgICAgICBvdmVycmlkZXMgYW4gaW1wb3J0ZWQgdGVtcGxhdGUuIEJ5IG1vdmluZyB0aGUgbW91c2UgcG9pbnRlciBvdmVyIHRoZQotICAgICAgICAgICAgICAgIHRyaWFuZ2xlIGljb24gaW4gdGhlIHJ1bGUgYmFyLCBpbmZvcm1hdGlvbiBhYm91dCB3aGljaCBmaWxlIHRoZSBvcmlnaW5hbAotICAgICAgICAgICAgICAgIHRlbXBsYXRlIHJlc2lkZXMuCi0gICAgICAgICAgICA8L3A+PGRpdiBjbGFzcz0iZmlndXJlIj48YSBuYW1lPSJmaWdfT3ZlclJpZGUyIj48L2E+PHAgY2xhc3M9InRpdGxlIj48Yj5GaWd1cmUmbmJzcDsxMC4mbmJzcDtPdmVycmlkZW4gVGVtcGxhdGUgSW5mb3JtYXRpb248L2I+PC9wPjxkaXYgY2xhc3M9ImZpZ3VyZS1jb250ZW50cyI+PGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiIGFsaWduPSJjZW50ZXIiPjxpbWcgc3JjPSIuLi9pbWFnZXMvZWRpdG9yL292ZXJyaWRlMi5wbmciIGFsaWduPSJtaWRkbGUiIGFsdD0iT3ZlcnJpZGVuIFRlbXBsYXRlIEluZm9ybWF0aW9uIj48L2Rpdj48L2Rpdj48L2Rpdj48YnIgY2xhc3M9ImZpZ3VyZS1icmVhayI+PC9kaXY+PC9kaXY+PC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvZWRpdG9yL3hzbGVkaXRvcl90ZW1wbGF0ZXMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9lZGl0b3IveHNsZWRpdG9yX3RlbXBsYXRlcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTAyZWVlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9lZGl0b3IveHNsZWRpdG9yX3RlbXBsYXRlcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPjx0aXRsZT5UZW1wbGF0ZXM8L3RpdGxlPjxsaW5rIGhyZWY9ImJvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj48bGluayBocmVmPSIuLi9ib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+PG1ldGEgY29udGVudD0iRG9jQm9vayBYU0wgU3R5bGVzaGVldHMgVjEuNzQuMCIgbmFtZT0iZ2VuZXJhdG9yIj48bGluayByZWw9ImhvbWUiIGhyZWY9Ii4uL2luZGV4Lmh0bWwiIHRpdGxlPSJYU0wgVG9vbHMgVXNlciBEb2N1bWVudGF0aW9uIj48bGluayByZWw9InVwIiBocmVmPSJ4c2xlZGl0b3IuaHRtbCIgdGl0bGU9IlhTTCBFZGl0aW5nIj48bGluayByZWw9InByZXYiIGhyZWY9InhzbGVkaXRvcl9jb250ZW50YXNzaXN0X2luY2x1ZGUuaHRtbCIgdGl0bGU9IkluY2x1ZGUgYW5kIEltcG9ydCBocmVmIEFzc2lzdGFuY2UiPjxsaW5rIHJlbD0ibmV4dCIgaHJlZj0ieHNsZWRpdG9yX2NvbG9yaW5nLmh0bWwiIHRpdGxlPSJYU0xUIFN5bnRheCBDb2xvcmluZyI+PC9oZWFkPjxib2R5IGJnY29sb3I9IndoaXRlIiB0ZXh0PSJibGFjayIgbGluaz0iIzAwMDBGRiIgdmxpbms9IiM4NDAwODQiIGFsaW5rPSIjMDAwMEZGIj48ZGl2IGNsYXNzPSJzZWN0aW9uIiBsYW5nPSJlbiI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgyIGNsYXNzPSJ0aXRsZSIgc3R5bGU9ImNsZWFyOiBib3RoIj48YSBuYW1lPSJYU0xFZGl0b3JUZW1wbGF0ZXMiPjwvYT5UZW1wbGF0ZXM8L2gyPjwvZGl2PjwvZGl2PjwvZGl2PjxwPlNwZWNpZmljIFhTTCBjb2RlIGNvbXBsZXRpb24gdGVtcGxhdGVzIGNhbiBiZSBhZGRlZCB0byB0aGUgWE1MCi0gICAgICAgICAgICBlZGl0b3IncyBUZW1wbGF0ZXMuIFRoaXMgYWxsb3dzIGEgdXNlciB0byBkZWZpbmUgc3BlY2lmaWMgbWFya3VwIGNvbXBsZXRpb24KLSAgICAgICAgICAgIHRlbXBsYXRlcyB0aGF0IGFyZSBjb21tb25seSB1c2VkLiBJbiBhZGRpdGlvbiwgdGhlIFhQYXRoIFRlbXBsYXRlcyBwYWdlIGNhbiBiZQotICAgICAgICAgICAgZW5oYW5jZWQgdG8gYWxsb3cgY29tbW9ubHkgdXNlZCBYUGF0aCB0ZW1wbGF0ZXMgdG8gYmUgaW5jbHVkZWQsIGluIGFkZGl0aW9uIHRvCi0gICAgICAgICAgICB0aG9zZSBpbnN0YWxsZWQgYnkgZGVmYXVsdC4gVGhpcyBhbGxvd3MgYSB1c2VyIHRoZSBhYmlsaXR5IHRvIGFkZCBjdXN0b20KLSAgICAgICAgICAgIGV4dGVuc2lvbiBmdW5jdGlvbnMgZm9yIFhTTFQgdGhhdCBtYXkgYmUgcHJvY2Vzc29yIHNwZWNpZmljLiBBZG9wdGVycyBtYXkgYWxzbwotICAgICAgICAgICAgdXNlIHRoZSBzdGFuZGFyZCB0ZW1wbGF0ZSBleHRlbnNpb24gcG9pbnQgdG8gYWRkIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eS4KLSAgICAgICAgPC9wPjxkaXYgY2xhc3M9InNlY3Rpb24iIGxhbmc9ImVuIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDMgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJOMTAxRDMiPjwvYT5YUGF0aCBUZW1wbGF0ZXM8L2gzPjwvZGl2PjwvZGl2PjwvZGl2PjxwPlRoZSBYU0wgWFBhdGggVGVtcGxhdGVzIHByZWZlcmVuY2UgcGFnZSBhbGxvd3MgZm9yIGEgdXNlciBvciBhZG9wdGVyCi0gICAgICAgICAgICAgICAgdG8gYWRkIHNwZWNpZmljIHhwYXRoIGV4dGVuc2lvbnMgc28gdGhhdCB0aGV5IHNob3cgdXAgaW4gdGhlIGNvbnRlbnQKLSAgICAgICAgICAgICAgICBhc3Npc3RhbmNlLiBTZWUgdGhlIFhQYXRoIFRlbXBsYXRlcyBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLgotICAgICAgICAgICAgPC9wPjwvZGl2PjwvZGl2PjwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL2VkaXRvci94c2xlZGl0b3JfdmFsaWRhdGlvbi5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL2VkaXRvci94c2xlZGl0b3JfdmFsaWRhdGlvbi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmRmOGUzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9lZGl0b3IveHNsZWRpdG9yX3ZhbGlkYXRpb24uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTxodG1sPjxoZWFkPjxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij48dGl0bGU+Q29udGVudCBBc3Npc3Q8L3RpdGxlPjxtZXRhIGNvbnRlbnQ9IkRvY0Jvb2sgWFNMIFN0eWxlc2hlZXRzIFYxLjczLjIiIG5hbWU9ImdlbmVyYXRvciI+PGxpbmsgcmVsPSJzdGFydCIgaHJlZj0iLi4vaW5kZXguaHRtbCIgdGl0bGU9IlhTTCBUb29saW5nIFVzZXIgRG9jdW1lbnRhdGlvbiI+PGxpbmsgcmVsPSJ1cCIgaHJlZj0ieHNsZWRpdG9yLmh0bWwiIHRpdGxlPSJDaGFwdGVyJm5ic3A7Mi4mbmJzcDtYU0wgRWRpdGluZyI+PGxpbmsgcmVsPSJwcmV2IiBocmVmPSJ4c2xlZGl0b3IuaHRtbCIgdGl0bGU9IkNoYXB0ZXImbmJzcDsyLiZuYnNwO1hTTCBFZGl0aW5nIj48bGluayByZWw9Im5leHQiIGhyZWY9InhzbGVkaXRvcl90ZW1wbGF0ZXMuaHRtbCIgdGl0bGU9IlRlbXBsYXRlcyI+PC9oZWFkPjxib2R5IGJnY29sb3I9IndoaXRlIiB0ZXh0PSJibGFjayIgbGluaz0iIzAwMDBGRiIgdmxpbms9IiM4NDAwODQiIGFsaW5rPSIjMDAwMEZGIj48ZGl2IGNsYXNzPSJzZWN0aW9uIiBsYW5nPSJlbiI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgyIGNsYXNzPSJ0aXRsZSIgc3R5bGU9ImNsZWFyOiBib3RoIj48YSBuYW1lPSJOMTAwNTYiPjwvYT5Db250ZW50IEFzc2lzdDwvaDI+PC9kaXY+PC9kaXY+PC9kaXY+PHA+Ci0JCSAgICBYU0wgVG9vbGluZyBleHRlbmRzIHRoZSBleGlzdGluZyBjb250ZW50IGFzc2lzdGFuY2Ugc3VwcG9ydCBvZiB0aGUgWE1MCi0JCSAgICBFZGl0b3IgdG8gcHJvdmlkZSBjb250ZW50IGFzc2lzdGFuY2UgZm9yIHNldmVyYWwgWFNMIG5hbWVzcGFjZSBhdHRyaWJ1dGVzLgotCQkgICAgVGhlIGNvbnRlbnQgYXNzaXN0YW5jZSBwcm92aWRlZCBjb3ZlcnMgdGhlIGF2YWlsYWJsZSBYUGF0aCBzdGF0ZW1lbnRzIGFzCi0JCSAgICBkZWZpbmVkIGluIHRoZSA8c3BhbiBjbGFzcz0iZW1waGFzaXMiPjxlbT5YUGF0aCBUZW1wbGF0ZXM8L2VtPjwvc3Bhbj4gcHJlZmVyZW5jZSBwYWdlLgotCQk8L3A+PHA+Ci0JCQlUaGUgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgdGhhdCBoYXZlIGNvbnRlbnQgYXNzaXN0IGF2YWlsYWJsZSBhcmUgYXMgZm9sbG93czoKLQkJPC9wPjxkaXYgY2xhc3M9Iml0ZW1pemVkbGlzdCI+PHVsIHR5cGU9ImRpc2MiPjxsaT48cD4KLQkJCQkgICAgPHNwYW4gY2xhc3M9ImJvbGQiPjxzdHJvbmc+dGVtcGxhdGU8L3N0cm9uZz48L3NwYW4+IC0gVGhlIHRlbXBsYXRlIGVsZW1lbnQgaGFzIHNldmVyYWwgY29udGVudCBhc3Npc3QKLQkJCQkgICAgb3B0aW9ucyBhdmFpbGFibGUgZm9yIHRoZSA8c3BhbiBjbGFzcz0iZW1waGFzaXMiPjxlbT5tYXRjaDwvZW0+PC9zcGFuPiwgPHNwYW4gY2xhc3M9ImVtcGhhc2lzIj48ZW0+bmFtZTwvZW0+PC9zcGFuPiwgYW5kIAotCQkJCSAgICA8c3BhbiBjbGFzcz0iZW1waGFzaXMiPjxlbT5tb2RlPC9lbT48L3NwYW4+IGF0dHJpYnV0ZXMuCi0JCQkJPC9wPjxwPgotCQkJCQlBZGQgaW1hZ2Ugc2hvd2luZyB0ZW1wbGF0ZSBjb21wbGV0aW9uLgotCQkJCTwvcD48L2xpPjxsaT48cD4KLQkJCQkJPHNwYW4gY2xhc3M9ImJvbGQiPjxzdHJvbmc+dmFyaWFibGU8L3N0cm9uZz48L3NwYW4+IGFuZCA8c3BhbiBjbGFzcz0iYm9sZCI+PHN0cm9uZz5wYXJhbTwvc3Ryb25nPjwvc3Bhbj4gLSBUaGUgdmFyaWFibGUgYW5kIHBhcmFtIGVsZW1lbnRzIGhhdmUgY29udGVudCBhc3Npc3QKLQkJCQkJZm9yIHhwYXRoLCBheGlzLCBwYXJtYXRlcnMgYW5kIHZhcmlhYmxlcyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIHByZWRlZmluZWQgd2hlbiB1c2luZyB0aGUgb3B0aW9uYWwKLQkJCQkJPHNwYW4gY2xhc3M9ImVtcGhhc2lzIj48ZW0+c2VsZWN0PC9lbT48L3NwYW4+IGF0dHJpYnV0ZS4KLQkJCQk8L3A+PHA+Ci0JCQkJCUFkZCBpbWFnZSBzaG93aW5nIHZhcmlhYmxlIGNvbXBsZXRpb24uCi0JCQkJPC9wPjwvbGk+PGxpPjxwPgotCQkJCQk8c3BhbiBjbGFzcz0iYm9sZCI+PHN0cm9uZz5pZjwvc3Ryb25nPjwvc3Bhbj4gYW5kIDxzcGFuIGNsYXNzPSJib2xkIj48c3Ryb25nPndoZW48L3N0cm9uZz48L3NwYW4+IC0gVGhlCi0JCQkJCWlmIGFuZCB3aGVuIGVsZW1lbnRzIGhhdmUgY29udGVudCBhc3Npc3QgZm9yIHRoZSA8c3BhbiBjbGFzcz0iZW1waGFzaXMiPjxlbT50ZXN0PC9lbT48L3NwYW4+IGF0dHJpYnV0ZS4KLQkJCQkJVGhpcyBjb250ZW50IGFzc2lzdGFuY2UgaXMgYXZhaWxhYmxlIGZvciBhbGwgcGFyYW1hdGVycyBhbmQgdmFyaWFibGVzIHRoYXQgYXJlIGluCi0JCQkJCXNjb3BlLCBhcyB3ZWxsIGFzIGFueSBhdmFpbGFibGUgeHBhdGggb3IgYXhpcyBzdGF0ZW1lbnQuCi0JCQkJPC9wPjxwPgotCQkJCQlBZGQgaW1hZ2Ugc2hvd2luZyB0ZXN0IGNvbXBsZXRpb24uCi0JCQkJPC9wPjwvbGk+PGxpPjxwPgotCQkJICAgIAk8c3BhbiBjbGFzcz0iYm9sZCI+PHN0cm9uZz5hcHBseS10ZW1wbGF0ZTwvc3Ryb25nPjwvc3Bhbj4gLSBUaGUgYXBwbHkgdGVtcGxhdGUgaGFzIGNvbnRlbnQKLQkJCSAgICAJYXNzaXN0YW5jZSBmb3IgYm90aCB0aGUgPHNwYW4gY2xhc3M9ImVtcGhhc2lzIj48ZW0+bW9kZTwvZW0+PC9zcGFuPiBhbmQgPHNwYW4gY2xhc3M9ImVtcGhhc2lzIj48ZW0+c2VsZWN0PC9lbT48L3NwYW4+Ci0JCQkgICAgCWF0dHJpYnV0ZXMuIAotCQkJICAgIDwvcD48cD4KLQkJCQkJQWRkIGltYWdlIHNob3dpbmcgYXBwbHktdGVtcGxhdGUgY29tcGxldGlvbi4KLQkJCQk8L3A+PC9saT48L3VsPjwvZGl2PjxkaXYgY2xhc3M9ImltcG9ydGFudCIgc3R5bGU9Im1hcmdpbi1sZWZ0OiAwLjVpbjsgbWFyZ2luLXJpZ2h0OiAwLjVpbjsiPjxoMyBjbGFzcz0idGl0bGUiPlhQYXRoIDIuMCBTdXBwb3J0PC9oMz48cD4KLQkJCQlDdXJyZW50bHkgWFBhdGggMi4wIGlzIG5vdCBzdXBwb3J0ZWQgZGlyZWN0bHkuICBIb3dldmVyLCBhIHVzZXIgY2FuIGFkZCB0aGlzIHN1cHBvcnQgaWYgdGhleSBuZWVkIGl0IGJ5Ci0JCQkJYWRkaW5nIHRoZSBtaXNzaW5nIFhQYXRoIGZ1bmN0aW9ucyB0byB0aGUgWFBhdGggVGVtcGxhdGVzLgotCQkJPC9wPjwvZGl2PjwvZGl2PjwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL2dlbmVyYWwvZ2VuZXJhbC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL2dlbmVyYWwvZ2VuZXJhbC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDI5NzdhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9nZW5lcmFsL2dlbmVyYWwuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTxodG1sPjxoZWFkPjxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij48dGl0bGU+R2VuZXJhbDwvdGl0bGU+PGxpbmsgaHJlZj0iYm9vay5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPjxsaW5rIGhyZWY9Ii4uL2Jvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj48bWV0YSBjb250ZW50PSJEb2NCb29rIFhTTCBTdHlsZXNoZWV0cyBWMS43NC4wIiBuYW1lPSJnZW5lcmF0b3IiPjxsaW5rIHJlbD0iaG9tZSIgaHJlZj0iLi4vaW5kZXguaHRtbCIgdGl0bGU9IlhTTCBUb29scyBVc2VyIERvY3VtZW50YXRpb24iPjxsaW5rIHJlbD0idXAiIGhyZWY9Ii4uL2luZGV4Lmh0bWwiIHRpdGxlPSJYU0wgVG9vbHMgVXNlciBEb2N1bWVudGF0aW9uIj48bGluayByZWw9InByZXYiIGhyZWY9Ii4uL3ByZWZlcmVuY2VzL3N5bnRheENvbG9yaW5nLmh0bWwiIHRpdGxlPSJYU0xUIFN5bnRheCBDb2xvcmluZyI+PGxpbmsgcmVsPSJuZXh0IiBocmVmPSIuLi9zYW1wbGVzL3NhbXBsZXMuaHRtbCIgdGl0bGU9IlhTTCBUb29saW5nIFNhbXBsZXMiPjwvaGVhZD48Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgdGV4dD0iYmxhY2siIGxpbms9IiMwMDAwRkYiIHZsaW5rPSIjODQwMDg0IiBhbGluaz0iIzAwMDBGRiI+PGRpdiBjbGFzcz0iY2hhcHRlciIgbGFuZz0iZW4iPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoMiBjbGFzcz0idGl0bGUiPjxhIG5hbWU9Ik4xMDNBNyI+PC9hPkdlbmVyYWw8L2gyPjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9InRvYyI+PHA+PGI+VGFibGUgb2YgQ29udGVudHM8L2I+PC9wPjx1bD48bGk+PHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9ImdlbmVyYWwuaHRtbCNYSW5jbHVkZSI+WEluY2x1ZGU8L2E+PC9zcGFuPjwvbGk+PC91bD48L2Rpdj48cD5UaGlzIHNlY3Rpb24gY292ZXJzIHRvcGljcyB0aGF0IGRvbid0IGhhdmUgYW55IG90aGVyIHBhcnRpY3VsYXIgcGxhY2UgdG8gZ28uPC9wPjxkaXYgY2xhc3M9InNlY3Rpb24iIGxhbmc9ImVuIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDIgY2xhc3M9InRpdGxlIiBzdHlsZT0iY2xlYXI6IGJvdGgiPjxhIG5hbWU9IlhJbmNsdWRlIj48L2E+WEluY2x1ZGU8L2gyPjwvZGl2PjwvZGl2PjwvZGl2PjxwPgotICAgICAgCVhJbmNsdWRlIGFsbG93cyBhIHVzZXIgdG8gaW1wb3J0IG9yIGluY2x1ZGUgb3RoZXIgWE1MIGZpbGVzIGludG8gb25lIHhtbCBmaWxlLgotICAgICAgICBJdCBpcyB1c2VkIHByaW1hcmlseSB3aXRoIGRvY3VtZW50YXRpb24gZmlsZSBmb3JtYXRzIGxpa2UgRG9jYm9vayBhbmQgRElUQS4gIEl0Ci0gICAgICAgIGFsbG93cyBmb3Igc2VwYXJhdGluZyBvdXQgbGFyZ2UgeG1sIGRvY3VtZW50cyBpbnRvIG1vcmUgbWFuYWdlYWJsZSBjaHVua3Mgb2YgaW5mb3JtYXRpb24uCi0gICAgICA8L3A+PHA+Ci0gICAgICAJVGhlIFhTTCBUb29scyBwcm9qZWN0IGluY2x1ZGVzIGFuIEFOVCB0YXNrIHRoYXQgY2FuIGJlIHJ1biB3aXRoIGluIGVjbGlwc2UsIGVjbGlwc2UKLSAgICAgIAloZWFkbGVzcywgYW5kIHdpdGhvdXQgZWNsaXBzZSBhdCBhbGwuICAgSWYgcnVubmluZyBvdXRzaWRlIG9mIGVjbGlwc2UsIHlvdSB3aWxsIG5lZWQKLSAgICAgIAl0byBtYWtlIHN1cmUgdGhhdCB0aGUgamFyIGZpbGUgeGluY2x1ZGUuamFyIGluIHRoZSBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuamFyIGZpbGUKLSAgICAgIAlpcyBtYWRlIGF2YWlhYmxlIG9uIHlvdXIgY2xhc3MgcGF0aC4KLSAgICAgIDwvcD48ZGl2IGNsYXNzPSJtZWRpYW9iamVjdCIgYWxpZ249ImNlbnRlciI+PGltZyBzcmM9Ii4uL2ltYWdlcy9nZW5lcmFsL3hpbmNsdWRlLnBuZyIgYWxpZ249Im1pZGRsZSI+PC9kaXY+PHA+Ci0gICAgICAJVGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGFyZSBhdmFpbGFibGUgb24gdGhlIHhzbC54aW5jbHVkZSBBTlQgdGFzazoKLSAgICAgIDwvcD48ZGl2IGNsYXNzPSJpdGVtaXplZGxpc3QiPjx1bCB0eXBlPSJkaXNjIj48bGk+PHA+Ci0gICAgICAJCQk8c3BhbiBjbGFzcz0iYm9sZCI+PHN0cm9uZz4KLQkJCQkJaW4KLQkJCQk8L3N0cm9uZz48L3NwYW4+IC0gVGhlIGZ1bGwgcGF0aCB0byB0aGUgaW5wdXQgZmlsZSB0aGF0IGNvbnRhaW5zCi0gICAgICAJCQl0aGUgZmlsZSB3aXRoIHRoZSBYSW5jbHVkZXMuICAgSWYgdGhlIGZpbGVzIHRoYXQgaXQgaW5jbHVkZXMgaGF2ZSBpbmNsdWRlcywgdGhlbgotICAgICAgCQkJdGhvc2Ugd2lsbCBiZSBicm91Z2h0IGluIGFuIGV4cGFuZGVkIGFzIHdlbGwuCi0gICAgICAJCTwvcD48L2xpPjxsaT48cD4KLQkJCQkJPHNwYW4gY2xhc3M9ImJvbGQiPjxzdHJvbmc+b3V0PC9zdHJvbmc+PC9zcGFuPiAtIFRoZSBmdWxsIHBhdGggdG8gdGhlIG91dHB1dCBmaWxlIAotCQkJCQl0byBiZSB3cml0dGVuIHdpdGggYWxsIGluY2x1ZGVzIGV4cGFuZGVkLiAgVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCBhcyB0aGUKLQkJCQkJaW5wdXQgdG8gYSBzdHlsZXNoZWV0IHRyYW5zZm9ybWF0aW9uIHByb2Nlc3MuCi0JCQkJPC9wPjwvbGk+PC91bD48L2Rpdj48ZGl2IGNsYXNzPSJleGFtcGxlIj48YSBuYW1lPSJOMTAzRDIiPjwvYT48cCBjbGFzcz0idGl0bGUiPjxiPkV4YW1wbGUmbmJzcDsxLiZuYnNwO1hJbmNsdWRlIEV4YW1wbGU8L2I+PC9wPjxkaXYgY2xhc3M9ImV4YW1wbGUtY29udGVudHMiPjxwcmUgY2xhc3M9InByb2dyYW1saXN0aW5nIj4KLSZsdDt0YXJnZXQgbmFtZT0ibWVyZ2UiJmd0OwotICAgICZsdDt4c2wueGluY2x1ZGUgaW49IiR7ZG9jYm9va3NvdXJjZX0veHNsaGVscC5kYmsiCi0gICAgICAgICAgICAgICAgICBvdXQ9IiR7ZG9jYm9va3NvdXJjZX0veHNsaGVscGNvbWJpbmVkLmRiayIvJmd0OwotJmx0Oy90YXJnZXQmZ3Q7CSAgICAJCSAgICAJCi0JICAgIAk8L3ByZT48L2Rpdj48L2Rpdj48YnIgY2xhc3M9ImV4YW1wbGUtYnJlYWsiPjwvZGl2PjwvZGl2PjwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL2ltYWdlcy9lZGl0b3IvRXhjbHVkZUNvbnRlbnRBc3Npc3QxLnBuZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9pbWFnZXMvZWRpdG9yL0V4Y2x1ZGVDb250ZW50QXNzaXN0MS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMGYyY2IuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL2ltYWdlcy9lZGl0b3IvRXhjbHVkZUNvbnRlbnRBc3Npc3QxLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9pbWFnZXMvZWRpdG9yL0V4Y2x1ZGVDb250ZW50QXNzaXN0Mi5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvaW1hZ2VzL2VkaXRvci9FeGNsdWRlQ29udGVudEFzc2lzdDIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTUzNjc3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9pbWFnZXMvZWRpdG9yL0V4Y2x1ZGVDb250ZW50QXNzaXN0Mi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvaW1hZ2VzL2VkaXRvci9jYWxsdGVtcGxhdGUucG5nIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL2ltYWdlcy9lZGl0b3IvY2FsbHRlbXBsYXRlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ExM2YwNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvaW1hZ2VzL2VkaXRvci9jYWxsdGVtcGxhdGUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL2ltYWdlcy9lZGl0b3IvaHJlZkFzc2lzdGFuY2UucG5nIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL2ltYWdlcy9lZGl0b3IvaHJlZkFzc2lzdGFuY2UucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjQ0OTg2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9pbWFnZXMvZWRpdG9yL2hyZWZBc3Npc3RhbmNlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9pbWFnZXMvZWRpdG9yL21vZGVBc3Npc3RhbmNlLnBuZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9pbWFnZXMvZWRpdG9yL21vZGVBc3Npc3RhbmNlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVhOTg3NS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvaW1hZ2VzL2VkaXRvci9tb2RlQXNzaXN0YW5jZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvaW1hZ2VzL2VkaXRvci9uYW1lZFRlbXBsYXRlLnBuZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9pbWFnZXMvZWRpdG9yL25hbWVkVGVtcGxhdGUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGJkOTI2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9pbWFnZXMvZWRpdG9yL25hbWVkVGVtcGxhdGUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL2ltYWdlcy9lZGl0b3Ivb3ZlcnJpZGUxLnBuZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9pbWFnZXMvZWRpdG9yL292ZXJyaWRlMS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4Yjg3OGIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL2ltYWdlcy9lZGl0b3Ivb3ZlcnJpZGUxLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9pbWFnZXMvZWRpdG9yL292ZXJyaWRlMi5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvaW1hZ2VzL2VkaXRvci9vdmVycmlkZTIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmM0MTVjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9pbWFnZXMvZWRpdG9yL292ZXJyaWRlMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvaW1hZ2VzL2VkaXRvci9zeW50YXhDb2xvcmluZy5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvaW1hZ2VzL2VkaXRvci9zeW50YXhDb2xvcmluZy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZTBlYmQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL2ltYWdlcy9lZGl0b3Ivc3ludGF4Q29sb3JpbmcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL2ltYWdlcy9lZGl0b3IvdGVtcGxhdGVzVmlldy5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvaW1hZ2VzL2VkaXRvci90ZW1wbGF0ZXNWaWV3LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFlMjBkOS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvaW1hZ2VzL2VkaXRvci90ZW1wbGF0ZXNWaWV3LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9pbWFnZXMvZWRpdG9yL3hzbHByb3Bvc2Fscy5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvaW1hZ2VzL2VkaXRvci94c2xwcm9wb3NhbHMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmMxMjdhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9pbWFnZXMvZWRpdG9yL3hzbHByb3Bvc2Fscy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvaW1hZ2VzL2dlbmVyYWwveGluY2x1ZGUucG5nIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL2ltYWdlcy9nZW5lcmFsL3hpbmNsdWRlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBiOWY3My4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvaW1hZ2VzL2dlbmVyYWwveGluY2x1ZGUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL2ltYWdlcy9sYXVuY2hpbmcvbGF1bmNoU2hvcnRjdC5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvaW1hZ2VzL2xhdW5jaGluZy9sYXVuY2hTaG9ydGN0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgxODEzYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvaW1hZ2VzL2xhdW5jaGluZy9sYXVuY2hTaG9ydGN0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9pbWFnZXMvbGF1bmNoaW5nL25vZGVzZXRWYXJpYWJsZS5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvaW1hZ2VzL2xhdW5jaGluZy9ub2Rlc2V0VmFyaWFibGUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2NhN2ZmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9pbWFnZXMvbGF1bmNoaW5nL25vZGVzZXRWYXJpYWJsZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvaW1hZ2VzL2xhdW5jaGluZy9yZXN1bHRWaWV3LnBuZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9pbWFnZXMvbGF1bmNoaW5nL3Jlc3VsdFZpZXcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmQxYjkxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9pbWFnZXMvbGF1bmNoaW5nL3Jlc3VsdFZpZXcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL2ltYWdlcy9wcmVmZXJlbmNlcy9YUGF0aFRlbXBsYXRlcy5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvaW1hZ2VzL3ByZWZlcmVuY2VzL1hQYXRoVGVtcGxhdGVzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY4OTMwNC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvaW1hZ2VzL3ByZWZlcmVuY2VzL1hQYXRoVGVtcGxhdGVzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9pbWFnZXMvcHJlZmVyZW5jZXMvcHJvamVjdExldmVsVmFsaWRhdGlvbi5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvaW1hZ2VzL3ByZWZlcmVuY2VzL3Byb2plY3RMZXZlbFZhbGlkYXRpb24ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmZlODYyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9pbWFnZXMvcHJlZmVyZW5jZXMvcHJvamVjdExldmVsVmFsaWRhdGlvbi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvaW1hZ2VzL3ByZWZlcmVuY2VzL3htX3RlbXBsYXRlX3hzbG5ld2ZpbGUucG5nIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL2ltYWdlcy9wcmVmZXJlbmNlcy94bV90ZW1wbGF0ZV94c2xuZXdmaWxlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY0NmE2ZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvaW1hZ2VzL3ByZWZlcmVuY2VzL3htX3RlbXBsYXRlX3hzbG5ld2ZpbGUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL2ltYWdlcy9wcmVmZXJlbmNlcy94c2xTeW50YXhDb2xvcmluZy5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvaW1hZ2VzL3ByZWZlcmVuY2VzL3hzbFN5bnRheENvbG9yaW5nLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZlYmVmMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvaW1hZ2VzL3ByZWZlcmVuY2VzL3hzbFN5bnRheENvbG9yaW5nLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9pbWFnZXMvcHJlZmVyZW5jZXMveHNsX0luc3RhbGxlZFByb2Nlc3NvcnMucG5nIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL2ltYWdlcy9wcmVmZXJlbmNlcy94c2xfSW5zdGFsbGVkUHJvY2Vzc29ycy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyOTUwNzkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL2ltYWdlcy9wcmVmZXJlbmNlcy94c2xfSW5zdGFsbGVkUHJvY2Vzc29ycy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvaW1hZ2VzL3ByZWZlcmVuY2VzL3hzbF9vdXRwdXRwcm9wZXJ0aWVzLnBuZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9pbWFnZXMvcHJlZmVyZW5jZXMveHNsX291dHB1dHByb3BlcnRpZXMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTAwYTQyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9pbWFnZXMvcHJlZmVyZW5jZXMveHNsX291dHB1dHByb3BlcnRpZXMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL2ltYWdlcy9wcmVmZXJlbmNlcy94c2xmZWF0dXJlcy5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvaW1hZ2VzL3ByZWZlcmVuY2VzL3hzbGZlYXR1cmVzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjlkYmVjOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvaW1hZ2VzL3ByZWZlcmVuY2VzL3hzbGZlYXR1cmVzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9pbWFnZXMvcHJlZmVyZW5jZXMveHNscHJlZmVyZW5jZXMucG5nIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL2ltYWdlcy9wcmVmZXJlbmNlcy94c2xwcmVmZXJlbmNlcy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjYjcxODcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL2ltYWdlcy9wcmVmZXJlbmNlcy94c2xwcmVmZXJlbmNlcy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvaW5kZXguaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9pbmRleC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWNlYTk1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9pbmRleC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD48aGVhZD48TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+PHRpdGxlPlhTTCBUb29scyBVc2VyIERvY3VtZW50YXRpb248L3RpdGxlPjxsaW5rIGhyZWY9ImJvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj48bGluayBocmVmPSIuLi9ib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+PG1ldGEgY29udGVudD0iRG9jQm9vayBYU0wgU3R5bGVzaGVldHMgVjEuNzQuMCIgbmFtZT0iZ2VuZXJhdG9yIj48bGluayByZWw9ImhvbWUiIGhyZWY9ImluZGV4Lmh0bWwiIHRpdGxlPSJYU0wgVG9vbHMgVXNlciBEb2N1bWVudGF0aW9uIj48bGluayByZWw9Im5leHQiIGhyZWY9ImludHJvZHVjdGlvbi9nZXR0aW5nc3RhcnRlZC5odG1sIiB0aXRsZT0iR2V0dGluZyBTdGFydGVkIj48L2hlYWQ+PGJvZHkgYmdjb2xvcj0id2hpdGUiIHRleHQ9ImJsYWNrIiBsaW5rPSIjMDAwMEZGIiB2bGluaz0iIzg0MDA4NCIgYWxpbms9IiMwMDAwRkYiPjxkaXYgY2xhc3M9ImJvb2siIGxhbmc9ImVuIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDEgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJYU0xVc2VyIj48L2E+WFNMIFRvb2xzIFVzZXIgRG9jdW1lbnRhdGlvbjwvaDE+PC9kaXY+PGRpdj48ZGl2IGNsYXNzPSJhdXRob3IiPjxoMyBjbGFzcz0iYXV0aG9yIj48c3BhbiBjbGFzcz0iZmlyc3RuYW1lIj5EYXZpZDwvc3Bhbj4gPHNwYW4gY2xhc3M9InN1cm5hbWUiPkNhcnZlcjwvc3Bhbj48L2gzPjwvZGl2PjwvZGl2PjxkaXY+PHAgY2xhc3M9ImNvcHlyaWdodCI+Q29weXJpZ2h0ICZjb3B5OyAyMDA4IEVjbGlwc2UgRm91bmRhdGlvbiBhbmQgb3RoZXJzPC9wPjwvZGl2PjwvZGl2Pjxocj48L2Rpdj48ZGl2IGNsYXNzPSJ0b2MiPjxwPjxiPlRhYmxlIG9mIENvbnRlbnRzPC9iPjwvcD48dWw+PGxpPjxzcGFuIGNsYXNzPSJjaGFwdGVyIj48YSBocmVmPSJpbnRyb2R1Y3Rpb24vZ2V0dGluZ3N0YXJ0ZWQuaHRtbCI+R2V0dGluZyBTdGFydGVkPC9hPjwvc3Bhbj48L2xpPjxsaT48c3BhbiBjbGFzcz0iY2hhcHRlciI+PGEgaHJlZj0iY29uY2VwdHMvY29uY2VwdHMuaHRtbCI+WFNMVCBDb25jZXB0czwvYT48L3NwYW4+PHVsPjxsaT48c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iY29uY2VwdHMvY29uY2VwdHMuaHRtbCNSZXN1Y2luZ1hTTFQiPlJlc2N1aW5nIFhTTFQgRnJvbSBOaWNoZSBTdGF0dXM8L2E+PC9zcGFuPjx1bD48bGk+PHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9ImNvbmNlcHRzL2NvbmNlcHRzLmh0bWwjTjEwMDM0Ij5UaGUgUHJvYmxlbTwvYT48L3NwYW4+PC9saT48bGk+PHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9ImNvbmNlcHRzL2NvbmNlcHRzLmh0bWwjTjEwMDVBIj5UaGUgU29sdXRpb248L2E+PC9zcGFuPjwvbGk+PGxpPjxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJjb25jZXB0cy9jb25jZXB0cy5odG1sI04xMDA4MSI+UXVlcmllczwvYT48L3NwYW4+PHVsPjxsaT48c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iY29uY2VwdHMvY29uY2VwdHMuaHRtbCNOMTAwOEYiPnhzbDpmb3ItZWFjaDwvYT48L3NwYW4+PC9saT48bGk+PHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9ImNvbmNlcHRzL2NvbmNlcHRzLmh0bWwjTjEwMDlCIj54c2w6aWY8L2E+PC9zcGFuPjwvbGk+PGxpPjxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJjb25jZXB0cy9jb25jZXB0cy5odG1sI04xMDBBNSI+eHNsOmNob29zZTwvYT48L3NwYW4+PC9saT48L3VsPjwvbGk+PGxpPjxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJjb25jZXB0cy9jb25jZXB0cy5odG1sI04xMDBBRiI+Q29uY2x1c2lvbjwvYT48L3NwYW4+PC9saT48L3VsPjwvbGk+PGxpPjxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJjb25jZXB0cy9yZXNvdXJjZXMuaHRtbCI+UmVzb3VyY2VzPC9hPjwvc3Bhbj48L2xpPjwvdWw+PC9saT48bGk+PHNwYW4gY2xhc3M9ImNoYXB0ZXIiPjxhIGhyZWY9ImVkaXRvci94c2xlZGl0b3IuaHRtbCI+WFNMIEVkaXRpbmc8L2E+PC9zcGFuPjx1bD48bGk+PHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9ImVkaXRvci94c2xlZGl0b3IuaHRtbCNWYWxpZGF0aW9uIj5WYWxpZGF0aW9uPC9hPjwvc3Bhbj48L2xpPjxsaT48c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iZWRpdG9yL3hzbGVkaXRvcl9jb250ZW50YXNzaXN0Lmh0bWwiPkNvbnRlbnQgQXNzaXN0PC9hPjwvc3Bhbj48dWw+PGxpPjxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJlZGl0b3IveHNsZWRpdG9yX2NvbnRlbnRhc3Npc3QuaHRtbCNlZF9YU0xQcm9wb3NhbHMiPlhTTFQgRWxlbWVudCBQcm9wb3NhbHM8L2E+PC9zcGFuPjwvbGk+PGxpPjxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJlZGl0b3IveHNsZWRpdG9yX2NvbnRlbnRhc3Npc3Rfc2VsZWN0dGVzdC5odG1sIj5TZWxlY3QsIFRlc3QsIGFuZCBNYXRjaCBBdHRyaWJ1dGVzPC9hPjwvc3Bhbj48L2xpPjxsaT48c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iZWRpdG9yL3hzbGVkaXRvcl9jb250ZW50YXNzaXN0X2V4Y2x1ZGUuaHRtbCI+RXhjbHVkZS1SZXN1bHQtUHJlZml4ZXM8L2E+PC9zcGFuPjwvbGk+PGxpPjxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJlZGl0b3IveHNsZWRpdG9yX2NvbnRlbnRhc3Npc3RfbW9kZWFzc2lzdC5odG1sIj5Nb2RlIGF0dHJpYnV0ZSBhc3Npc3RhbmNlPC9hPjwvc3Bhbj48L2xpPjxsaT48c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iZWRpdG9yL3hzbGVkaXRvcl9jb250ZW50YXNzaXN0X25hbWVkdGVtcGxhdGUuaHRtbCI+TmFtZWQgVGVtcGxhdGUgQXNzaXN0YW5jZTwvYT48L3NwYW4+PC9saT48bGk+PHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9ImVkaXRvci94c2xlZGl0b3JfY29udGVudGFzc2lzdF9jYWxsdGVtcGxhdGUuaHRtbCI+Q2FsbC1UZW1wbGF0ZSBBc3Npc3RhbmNlPC9hPjwvc3Bhbj48L2xpPjxsaT48c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iZWRpdG9yL3hzbGVkaXRvcl9jb250ZW50YXNzaXN0X2luY2x1ZGUuaHRtbCI+Ci0gICAgICAgICAgICAgICAgSW5jbHVkZSBhbmQgSW1wb3J0Ci0gICAgICAgICAgICAgICAgaHJlZgotICAgICAgICAgICAgICAgIEFzc2lzdGFuY2UKLSAgICAgICAgICAgIDwvYT48L3NwYW4+PC9saT48L3VsPjwvbGk+PGxpPjxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJlZGl0b3IveHNsZWRpdG9yX3RlbXBsYXRlcy5odG1sIj5UZW1wbGF0ZXM8L2E+PC9zcGFuPjx1bD48bGk+PHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9ImVkaXRvci94c2xlZGl0b3JfdGVtcGxhdGVzLmh0bWwjTjEwMUQzIj5YUGF0aCBUZW1wbGF0ZXM8L2E+PC9zcGFuPjwvbGk+PC91bD48L2xpPjxsaT48c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iZWRpdG9yL3hzbGVkaXRvcl9jb2xvcmluZy5odG1sIj5YU0xUIFN5bnRheCBDb2xvcmluZzwvYT48L3NwYW4+PC9saT48bGk+PHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9ImVkaXRvci94c2xlZGl0b3JfbWFya2Vycy5odG1sIj5YU0xUIE1hcmtlcnMgYW5kIEFubm90YXRpb25zPC9hPjwvc3Bhbj48dWw+PGxpPjxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJlZGl0b3IveHNsZWRpdG9yX21hcmtlcnMuaHRtbCN4c2x0T3ZlclJpZGUiPlRlbXBsYXRlIE92ZXJyaWRlPC9hPjwvc3Bhbj48L2xpPjwvdWw+PC9saT48bGk+PHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9ImVkaXRvci94c2xlZGl0b3JfZGVidWdnaW5nLmh0bWwiPlhTTCBEZWJ1Z2dpbmc8L2E+PC9zcGFuPjwvbGk+PGxpPjxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJlZGl0b3IveHNsZWRpdG9yX2RlYnVnZ2luZy5odG1sIj5OYXZpZ2F0aW9uPC9hPjwvc3Bhbj48L2xpPjwvdWw+PC9saT48bGk+PHNwYW4gY2xhc3M9ImNoYXB0ZXIiPjxhIGhyZWY9ImxhdW5jaGluZy9sYXVuY2hpbmcuaHRtbCI+WFNMIExhdW5jaGluZyBhbmQgRGVidWdnaW5nPC9hPjwvc3Bhbj48dWw+PGxpPjxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJsYXVuY2hpbmcvbGF1bmNoaW5nLmh0bWwjWFNMTGF1bmNoIj5YU0wgTGF1bmNoaW5nPC9hPjwvc3Bhbj48L2xpPjxsaT48c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0ibGF1bmNoaW5nL2RlYnVnZ2luZy5odG1sIj5YU0xUIERlYnVnZ2luZzwvYT48L3NwYW4+PHVsPjxsaT48c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0ibGF1bmNoaW5nL2RlYnVnZ2luZy5odG1sI0RlYnVnR2V0dGluZ1N0YXJ0ZWQiPlN0YXJ0aW5nIGEgRGVidWcgU2Vzc2lvbjwvYT48L3NwYW4+PC9saT48bGk+PHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9ImxhdW5jaGluZy9kZWJ1Z2dpbmdfY29tbW9uLmh0bWwiPkNvbW1vbiBEZWJ1Z2dpbmcgT3BlcmF0aW9uczwvYT48L3NwYW4+PHVsPjxsaT48c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0ibGF1bmNoaW5nL2RlYnVnZ2luZ19jb21tb24uaHRtbCNYU0xEZWJ1Z1Jlc3VsdFZpZXciPlJlc3VsdCBWaWV3PC9hPjwvc3Bhbj48L2xpPjxsaT48c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0ibGF1bmNoaW5nL2RlYnVnZ2luZ192YXJpYWJsZXN2aWV3Lmh0bWwiPlZhcmlhYmxlcyBWaWV3PC9hPjwvc3Bhbj48L2xpPjwvdWw+PC9saT48bGk+PHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9ImxhdW5jaGluZy9kZWJ1Z2dpbmdfcHJvY2Vzc29ycy5odG1sIj5YU0xUIFByb2Nlc3NvciBTcGVjaWZpYyBTdXBwb3J0PC9hPjwvc3Bhbj48dWw+PGxpPjxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJsYXVuY2hpbmcvZGVidWdnaW5nX3Byb2Nlc3NvcnMuaHRtbCNYU0xEZWJ1Z1hhbGFuIj5YU0wgRGVidWdnaW5nIHdpdGggWGFsYW48L2E+PC9zcGFuPjwvbGk+PC91bD48L2xpPjwvdWw+PC9saT48L3VsPjwvbGk+PGxpPjxzcGFuIGNsYXNzPSJjaGFwdGVyIj48YSBocmVmPSJwcmVmZXJlbmNlcy94c2xwcmVmZXJlbmNlcy5odG1sIj5YU0wgVG9vbHMgUHJlZmVyZW5jZXM8L2E+PC9zcGFuPjx1bD48bGk+PHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9InByZWZlcmVuY2VzL3hzbHByZWZlcmVuY2VzLmh0bWwjWFNMRmVhdHVyZXMiPkZlYXR1cmVzPC9hPjwvc3Bhbj48L2xpPjxsaT48c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0icHJlZmVyZW5jZXMveHNscHJvY2Vzc29ycy5odG1sIj5JbnN0YWxsZWQgUHJvY2Vzc29yczwvYT48L3NwYW4+PC9saT48bGk+PHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9InByZWZlcmVuY2VzL3hzbG91dHB1dHByb3BlcnRpZXMuaHRtbCI+T3V0cHV0IFByb3BlcnRpZXM8L2E+PC9zcGFuPjwvbGk+PGxpPjxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJwcmVmZXJlbmNlcy94cGF0aHRlbXBsYXRlcy5odG1sIj5YUGF0aCBUZW1wbGF0ZXM8L2E+PC9zcGFuPjx1bD48bGk+PHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9InByZWZlcmVuY2VzL3hwYXRodGVtcGxhdGVzLmh0bWwjWFBhdGhUZW1wbGF0ZU5ldyI+Q3JlYXRpbmcgTmV3IFRlbXBsYXRlczwvYT48L3NwYW4+PC9saT48bGk+PHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9InByZWZlcmVuY2VzL3hwYXRoaW1wb3J0Lmh0bWwiPkltcG9ydCBYUGF0aCBUZW1wbGF0ZXM8L2E+PC9zcGFuPjwvbGk+PGxpPjxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJwcmVmZXJlbmNlcy94cGF0aGV4cG9ydC5odG1sIj5JbXBvcnQgWFBhdGggVGVtcGxhdGVzPC9hPjwvc3Bhbj48L2xpPjwvdWw+PC9saT48bGk+PHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9InByZWZlcmVuY2VzL3ZhbGlkYXRpb24uaHRtbCI+UHJvamVjdCBWYWxpZGF0aW9uIFByZWZlcmVuY2VzPC9hPjwvc3Bhbj48L2xpPjxsaT48c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0icHJlZmVyZW5jZXMvc3ludGF4Q29sb3JpbmcuaHRtbCI+WFNMVCBTeW50YXggQ29sb3Jpbmc8L2E+PC9zcGFuPjwvbGk+PC91bD48L2xpPjxsaT48c3BhbiBjbGFzcz0iY2hhcHRlciI+PGEgaHJlZj0iZ2VuZXJhbC9nZW5lcmFsLmh0bWwiPkdlbmVyYWw8L2E+PC9zcGFuPjx1bD48bGk+PHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9ImdlbmVyYWwvZ2VuZXJhbC5odG1sI1hJbmNsdWRlIj5YSW5jbHVkZTwvYT48L3NwYW4+PC9saT48L3VsPjwvbGk+PGxpPjxzcGFuIGNsYXNzPSJjaGFwdGVyIj48YSBocmVmPSJzYW1wbGVzL3NhbXBsZXMuaHRtbCI+WFNMIFRvb2xpbmcgU2FtcGxlczwvYT48L3NwYW4+PHVsPjxsaT48c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0ic2FtcGxlcy9zYW1wbGVzLmh0bWwjRWNsaXBzZUhlbHAiPkVjbGlwc2UgSGVscDwvYT48L3NwYW4+PHVsPjxsaT48c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0ic2FtcGxlcy9zYW1wbGVzLmh0bWwjRG9jYm9va0VjbGlwc2VIZWxwIj5DcmVhdGluZyBFY2xpcHNlIEhlbHAgd2l0aCBEb2Nib29rIGFuZCBYU0wgVG9vbHM8L2E+PC9zcGFuPjwvbGk+PGxpPjxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJzYW1wbGVzL3NhbXBsZXMuaHRtbCNESVRBRWNsaXBzZUhlbHAiPkNyZWF0aW5nIEVjbGlwc2UgSGVscCB3aXRoIERJVEEgYW5kIFhTTCBUb29sczwvYT48L3NwYW4+PC9saT48L3VsPjwvbGk+PC91bD48L2xpPjxsaT48c3BhbiBjbGFzcz0iY2hhcHRlciI+PGEgaHJlZj0ibGVnYWwuaHRtbCI+Tm90aWNlczwvYT48L3NwYW4+PC9saT48L3VsPjwvZGl2PjwvZGl2PjwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL2ludHJvZHVjdGlvbi9nZXR0aW5nc3RhcnRlZC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL2ludHJvZHVjdGlvbi9nZXR0aW5nc3RhcnRlZC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjgxMDJmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9pbnRyb2R1Y3Rpb24vZ2V0dGluZ3N0YXJ0ZWQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPjx0aXRsZT5HZXR0aW5nIFN0YXJ0ZWQ8L3RpdGxlPjxsaW5rIGhyZWY9ImJvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj48bGluayBocmVmPSIuLi9ib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+PG1ldGEgY29udGVudD0iRG9jQm9vayBYU0wgU3R5bGVzaGVldHMgVjEuNzQuMCIgbmFtZT0iZ2VuZXJhdG9yIj48bGluayByZWw9ImhvbWUiIGhyZWY9Ii4uL2luZGV4Lmh0bWwiIHRpdGxlPSJYU0wgVG9vbHMgVXNlciBEb2N1bWVudGF0aW9uIj48bGluayByZWw9InVwIiBocmVmPSIuLi9pbmRleC5odG1sIiB0aXRsZT0iWFNMIFRvb2xzIFVzZXIgRG9jdW1lbnRhdGlvbiI+PGxpbmsgcmVsPSJwcmV2IiBocmVmPSIuLi9pbmRleC5odG1sIiB0aXRsZT0iWFNMIFRvb2xzIFVzZXIgRG9jdW1lbnRhdGlvbiI+PGxpbmsgcmVsPSJuZXh0IiBocmVmPSIuLi9jb25jZXB0cy9jb25jZXB0cy5odG1sIiB0aXRsZT0iWFNMVCBDb25jZXB0cyI+PC9oZWFkPjxib2R5IGJnY29sb3I9IndoaXRlIiB0ZXh0PSJibGFjayIgbGluaz0iIzAwMDBGRiIgdmxpbms9IiM4NDAwODQiIGFsaW5rPSIjMDAwMEZGIj48ZGl2IGNsYXNzPSJjaGFwdGVyIiBsYW5nPSJlbiI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgyIGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0iTjEwMDEyIj48L2E+R2V0dGluZyBTdGFydGVkPC9oMj48L2Rpdj48L2Rpdj48L2Rpdj48cD4gIAotICAgICAgU3RpbGwgdHJ5aW5nIHRvIHRoaW5rIG9mIG9yaWdpbmFsIGNvbnRlbnQgZm9yIHRoaXMgc2VjdGlvbi4KLSAgIDwvcD48L2Rpdj48L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9sYXVuY2hpbmcvZGVidWdnaW5nLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvbGF1bmNoaW5nL2RlYnVnZ2luZy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTRhNTNmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9sYXVuY2hpbmcvZGVidWdnaW5nLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08aHRtbD48aGVhZD48TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+PHRpdGxlPlhTTFQgRGVidWdnaW5nPC90aXRsZT48bGluayBocmVmPSJib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+PGxpbmsgaHJlZj0iLi4vYm9vay5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPjxtZXRhIGNvbnRlbnQ9IkRvY0Jvb2sgWFNMIFN0eWxlc2hlZXRzIFYxLjc0LjAiIG5hbWU9ImdlbmVyYXRvciI+PGxpbmsgcmVsPSJob21lIiBocmVmPSIuLi9pbmRleC5odG1sIiB0aXRsZT0iWFNMIFRvb2xzIFVzZXIgRG9jdW1lbnRhdGlvbiI+PGxpbmsgcmVsPSJ1cCIgaHJlZj0ibGF1bmNoaW5nLmh0bWwiIHRpdGxlPSJYU0wgTGF1bmNoaW5nIGFuZCBEZWJ1Z2dpbmciPjxsaW5rIHJlbD0icHJldiIgaHJlZj0ibGF1bmNoaW5nLmh0bWwiIHRpdGxlPSJYU0wgTGF1bmNoaW5nIGFuZCBEZWJ1Z2dpbmciPjxsaW5rIHJlbD0ibmV4dCIgaHJlZj0iZGVidWdnaW5nX2NvbW1vbi5odG1sIiB0aXRsZT0iQ29tbW9uIERlYnVnZ2luZyBPcGVyYXRpb25zIj48L2hlYWQ+PGJvZHkgYmdjb2xvcj0id2hpdGUiIHRleHQ9ImJsYWNrIiBsaW5rPSIjMDAwMEZGIiB2bGluaz0iIzg0MDA4NCIgYWxpbms9IiMwMDAwRkYiPjxkaXYgY2xhc3M9InNlY3Rpb24iIGxhbmc9ImVuIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDIgY2xhc3M9InRpdGxlIiBzdHlsZT0iY2xlYXI6IGJvdGgiPjxhIG5hbWU9IlhTTERlYnVnIj48L2E+WFNMVCBEZWJ1Z2dpbmc8L2gyPjwvZGl2PjwvZGl2PjwvZGl2PjxwPiBYU0wgVG9vbHMgcHJvdmlkZXMgYSBmcmFtZXdvcmsgZm9yIFhTTFQgcHJvY2Vzc29ycyB0byBwcm92aWRlIGRlYnVnZ2luZyBzdXBwb3J0LiBUaGUgc3VwcG9ydCBwcm92aWRlZCBpcyBoaWdobHkKLQkJCWRlcGVuZGVudCBvbiB0aGUgcHJvY2Vzc29ycy4gWFNMIFRvb2xzIGNvbWVzIHdpdGggYnVpbHQgaW4gc3VwcG9ydCBmb3IgdGhlIFhhbGFuIDIuNy4xIHByb2Nlc3Nvci4gRGVidWdnaW5nIGlzIG9ubHkKLQkJCWF2YWlsYWJsZSBmb3IgdGhvc2UgcHJvY2Vzc29ycyB0aGF0IHN1cHBvcnQgdGhlIGZlYXR1cmUgYW5kIHBsdWcgaW50byB0aGUgZXh0ZW5zaW9uIHBvaW50LiBUaGUgWFNMIFRvb2xzIGRlYnVnZ2VyCi0JCQlsZXZlcmFnZXMgdGhlIGV4aXN0aW5nIGVjbGlwc2UgcGxhdGZvcm0gRGVidWcgVmlldzwvcD48cD4KLQkJCUhvdyB0aGUgZGVidWdnZXIgYWN0cyB3aWxsIGRlcGVuZCBvbiB0aGUgcHJvY2Vzc29yIGJlaW5nIHVzZWQuIE5vdCBhbGwgWFNMVCBwcm9jZXNzb3JzIHBhc3MgdGhlIHNhbWUgdHlwZSBvZgotCQkJaW5mb3JtYXRpb24gdG8gdGhlIGRlYnVnZ2VyLiBUaGVzZSBkaWZmZXJlbmNlcyB3aWxsIGJlIG5vdGVkIGluIHRoZQotCQkJPGEgY2xhc3M9InhyZWYiIGhyZWY9ImRlYnVnZ2luZ19wcm9jZXNzb3JzLmh0bWwiIHRpdGxlPSJYU0xUIFByb2Nlc3NvciBTcGVjaWZpYyBTdXBwb3J0Ij50aGUgc2VjdGlvbiBjYWxsZWQgJmxkcXVvO1hTTFQgUHJvY2Vzc29yIFNwZWNpZmljIFN1cHBvcnQmcmRxdW87PC9hPgotCQkJc2VjdGlvbi4KLQkJPC9wPjxkaXYgY2xhc3M9InNlY3Rpb24iIGxhbmc9ImVuIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDMgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJEZWJ1Z0dldHRpbmdTdGFydGVkIj48L2E+U3RhcnRpbmcgYSBEZWJ1ZyBTZXNzaW9uPC9oMz48L2Rpdj48L2Rpdj48L2Rpdj48cD4gRGVidWdnaW5nIGlzIHN0YXJ0ZWQgdGhlIHNhbWUgd2F5IGFzIGxhdW5jaGluZyBhbiBYU0wgVHJhbmZvcm1hdGlvbiBpcyBkb25lLiBFeGNlcHQgdGhhdCB0aGUgZGVidWcKLQkJCQljb25maWd1cmF0aW9uIGlzIHVzZWQgaW5zdGVhZCBvZiB0aGUgbm9ybWFsIGxhdW5jaCBjb25maWd1cmF0aW9uLiBJZiBhIGRlYnVnZ2luZyBzZXNzaW9uIGlzIHN0YXJ0ZWQgb24gYSBwcm9jZXNzb3IKLQkJCQl0aGF0IGRvZXMgbm90IHN1cHBvcnQgZGVidWdnaW5nLCBhIGRpYWxvZyB3aWxsIGFzayBpZiB5b3Ugd2FudCB0byBzd2l0Y2ggdG8gb25lIG9mIHRoZSBzdXBwb3J0ZWQgZGVidWdnZXJzLjwvcD48ZGl2IGNsYXNzPSJub3RlIiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDAuNWluOyBtYXJnaW4tcmlnaHQ6IDAuNWluOyI+PGgzIGNsYXNzPSJ0aXRsZSI+RGVmYXVsdCBKUkU8L2gzPjxwPiBUaGUgZGVmYXVsdCBKUkUgZG9lcyBub3QgaGF2ZSBidWlsdCBpbiBzdXBwb3J0IGZvciBkZWJ1Z2dpbmcsIGV2ZW4gdGhvdWdoIGl0IGlzIGJhc2VkIG9uIEFwYWNoZSBYYWxhbi4gSXQgaXMKLQkJCQkJcmVjb21tZW5kZWQgdG8gdXNlIFhhbGFuIG9yIGFub3RoZXIgcHJvY2Vzc29yIHByb3ZpZGVkIGJ5IGFuIGFkb3B0ZXIgdG8gZG8geW91ciB0cmFuc2Zvcm1hdGlvbnMuIFRoZSBkZWZhdWx0Ci0JCQkJCXByb2Nlc3NvciBpcyBrbm93biB0byBoYXZlIHNvbWUgaXNzdWVzIHRoYXQgWGFsYW4gYW5kIG90aGVyIHByb2Nlc3NvcnMgZG8gbm90IGhhdmUuPC9wPjwvZGl2PjwvZGl2PjwvZGl2PjwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL2xhdW5jaGluZy9kZWJ1Z2dpbmdfY29tbW9uLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvbGF1bmNoaW5nL2RlYnVnZ2luZ19jb21tb24uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcyNTViMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvbGF1bmNoaW5nL2RlYnVnZ2luZ19jb21tb24uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTxodG1sPjxoZWFkPjxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij48dGl0bGU+Q29tbW9uIERlYnVnZ2luZyBPcGVyYXRpb25zPC90aXRsZT48bGluayBocmVmPSJib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+PGxpbmsgaHJlZj0iLi4vYm9vay5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPjxtZXRhIGNvbnRlbnQ9IkRvY0Jvb2sgWFNMIFN0eWxlc2hlZXRzIFYxLjc0LjAiIG5hbWU9ImdlbmVyYXRvciI+PGxpbmsgcmVsPSJob21lIiBocmVmPSIuLi9pbmRleC5odG1sIiB0aXRsZT0iWFNMIFRvb2xzIFVzZXIgRG9jdW1lbnRhdGlvbiI+PGxpbmsgcmVsPSJ1cCIgaHJlZj0iZGVidWdnaW5nLmh0bWwiIHRpdGxlPSJYU0xUIERlYnVnZ2luZyI+PGxpbmsgcmVsPSJwcmV2IiBocmVmPSJkZWJ1Z2dpbmcuaHRtbCIgdGl0bGU9IlhTTFQgRGVidWdnaW5nIj48bGluayByZWw9Im5leHQiIGhyZWY9ImRlYnVnZ2luZ192YXJpYWJsZXN2aWV3Lmh0bWwiIHRpdGxlPSJWYXJpYWJsZXMgVmlldyI+PC9oZWFkPjxib2R5IGJnY29sb3I9IndoaXRlIiB0ZXh0PSJibGFjayIgbGluaz0iIzAwMDBGRiIgdmxpbms9IiM4NDAwODQiIGFsaW5rPSIjMDAwMEZGIj48ZGl2IGNsYXNzPSJzZWN0aW9uIiBsYW5nPSJlbiI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgzIGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0iWFNMRGVidWdDb21tb24iPjwvYT5Db21tb24gRGVidWdnaW5nIE9wZXJhdGlvbnM8L2gzPjwvZGl2PjwvZGl2PjwvZGl2PjxwPgotCQkJCVhTTFQgZGVidWdnaW5nIGlzIGhhbmRsZWQgYnkgdGhlIGVjbGlwc2UgcGxhdGZvcm1zIGRlYnVnZ2luZyBmcmFtZXdvcmsgc3VwcG9ydCBhcyBvdXRsaW5lZCBpbiB0aGUKLQkJCQk8YSBjbGFzcz0idWxpbmsiIGhyZWY9Ii9oZWxwL3RvcGljL29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy5pc3YvZ3VpZGUvZGVidWdfZGVidWcuaHRtIiB0YXJnZXQ9Il90b3AiPiJQcm9ncmFtIERlYnVnIGFuZCBMYXVuY2ggU3VwcG9ydCI8L2E+Ci0JCQkJLiBDb21tb24gb3BlcmF0aW9ucyBsaWtlIHN0ZXBwaW5nIGludG8gKEY1KSwgc3RlcHBpbmcgb3ZlciAoRjYpLCBwYXVzaW5nLCBydW5uaW5nIHRvIGEgYnJlYWtwb2ludCwgYW5kIHJlbGF1bmNoaW5nCi0JCQkJYXJlIHN1cHBvcnRlZC4gSW4gYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkIFZhcmlhYmxlIGFuZCBCcmVha3BvaW50IHZpZXdzIHByb3ZpZGVkIGJ5IHRoZSBwbGF0Zm9ybSwgdGhlcmUgYXJlIHNvbWUKLQkJCQlYU0xUIHNwZWNpZmljIHZpZXdzIGFuZCBmdW5jdGlvbmFsaXR5IGFzIHdlbGwuIEFsbCBvZiB0aGVzZSBhcmUgY29tbW9uIHJlZ2FyZGxlc3Mgb2YgdGhlIHBhcnRpY3VsYXIgWFNMVCBkZWJ1Z2dlcgotCQkJCWJlaW5nIHVzZWQuCi0JCQk8L3A+PGRpdiBjbGFzcz0idGlwIiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDAuNWluOyBtYXJnaW4tcmlnaHQ6IDAuNWluOyI+PGgzIGNsYXNzPSJ0aXRsZSI+SW50cm9kdWN0aW9uIHRvIEVjbGlwc2UgRGVidWdnaW5nPC9oMz48cD4KLQkJCQkJPGEgY2xhc3M9InVsaW5rIiBocmVmPSJodHRwOi8vd3d3Lm1jcy52dXcuYWMubnovY291cnNlcy9DT01QMjA1LzIwMDdUMS90b29scy9lY2xpcHNlL2RlYnVnZ2luZy9iYXNpY3Muc2h0bWwiIHRhcmdldD0iX3RvcCI+QmFzaWMgRGVidWdnaW5nIGluIEVjbGlwc2U8L2E+Ci0JCQkJCWNvbnRhaW5zIGEgZ29vZCBnZW5lcmFsIGludHJvZHVjdGlvbiB0byB0aGUgYmFzaWMgZmVhdHVyZXMgcHJvdmlkZWQgYnkgdGhlIEVjbGlwc2UgRGVidWcgdmlldy4gWFNMIFRvb2xzIGxldmVyYWdlcwotCQkJCQltYW55IG9mIHRoZXNlIGZlYXR1cmVzIGFuZCB0aGUgc2FtZSBjb25jZXB0cyBhcHBseSB0byB0aGUgWFNMIFRvb2xzIGRlYnVnZ2VyLgotCQkJCTwvcD48L2Rpdj48cD4gSW4gYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkIGZlYXR1cmVzIGFuZCBmdW5jdGlvbmFsaXR5LCB0aGUgWFNMIFRvb2xzIGRlYnVnZ2luZyBzdXBwb3J0IGFkZHMgdGhlIGZvbGxvd2luZwotCQkJCWFkZGl0aW9uYWwgaXRlbXM6PC9wPjxkaXYgY2xhc3M9Iml0ZW1pemVkbGlzdCI+PHVsIHR5cGU9ImRpc2MiPjxsaT48cD4gUmVzdWx0IFZpZXc8L3A+PC9saT48bGk+PHA+WFNMVCBzcGVjaWZpYyBWYXJpYWJsZXM8L3A+PC9saT48bGk+PHA+WFNMVCBQcm9jZXNzb3IgU3BlY2lmaWMgRnVuY3Rpb25hbGl0eTwvcD48L2xpPjwvdWw+PC9kaXY+PGRpdiBjbGFzcz0ic2VjdGlvbiIgbGFuZz0iZW4iPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoNCBjbGFzcz0idGl0bGUiPjxhIG5hbWU9IlhTTERlYnVnUmVzdWx0VmlldyI+PC9hPlJlc3VsdCBWaWV3PC9oND48L2Rpdj48L2Rpdj48L2Rpdj48cD4gVGhlIFhTTFQgRGVidWdnZXIgaGFzIGEgcmVzdWx0IHZpZXcuIFRoaXMgd2lsbCBzaG93IHRoZSBvdXRwdXQgdGhhdCB0aGUgc3R5bGVzaGVldCBoYXMgZ2VuZXJhdGVkIHRvIHRoZQotCQkJCQljdXJyZW50IGJyZWFrIHBvaW50IG9yIHNpbmNlIHRoZSBsYXN0IHN0ZXAgY29tbWFuZCB3YXMgaXNzdWVkLjwvcD48ZGl2IGNsYXNzPSJtZWRpYW9iamVjdCIgYWxpZ249ImNlbnRlciI+PGltZyBzcmM9Ii4uL2ltYWdlcy9sYXVuY2hpbmcvcmVzdWx0Vmlldy5wbmciIGFsaWduPSJtaWRkbGUiPjwvZGl2PjxwPiBUaGUgcmVzdWx0IHZpZXcgaXMgdXBkYXRlZCB0aHJvdWdob3V0IHRoZSBkZWJ1Z2dpbmcgcHJvY2VzcywgYW5kIGlzIHVzZWZ1bCB0byBoZWxwIHNlZSB3aGF0IG91dHB1dCBpcwotCQkJCQlnZW5lcmF0ZWQgYXQgc3BlY2lmaWMgcG9pbnRzIGR1cmluZyBhIHRyYW5zZm9ybWF0aW9uLjwvcD48L2Rpdj48L2Rpdj48L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9sYXVuY2hpbmcvZGVidWdnaW5nX3Byb2Nlc3NvcnMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9sYXVuY2hpbmcvZGVidWdnaW5nX3Byb2Nlc3NvcnMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThiZjk5Ny4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvbGF1bmNoaW5nL2RlYnVnZ2luZ19wcm9jZXNzb3JzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08aHRtbD48aGVhZD48TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+PHRpdGxlPlhTTFQgUHJvY2Vzc29yIFNwZWNpZmljIFN1cHBvcnQ8L3RpdGxlPjxsaW5rIGhyZWY9ImJvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj48bGluayBocmVmPSIuLi9ib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+PG1ldGEgY29udGVudD0iRG9jQm9vayBYU0wgU3R5bGVzaGVldHMgVjEuNzQuMCIgbmFtZT0iZ2VuZXJhdG9yIj48bGluayByZWw9ImhvbWUiIGhyZWY9Ii4uL2luZGV4Lmh0bWwiIHRpdGxlPSJYU0wgVG9vbHMgVXNlciBEb2N1bWVudGF0aW9uIj48bGluayByZWw9InVwIiBocmVmPSJkZWJ1Z2dpbmcuaHRtbCIgdGl0bGU9IlhTTFQgRGVidWdnaW5nIj48bGluayByZWw9InByZXYiIGhyZWY9ImRlYnVnZ2luZ192YXJpYWJsZXN2aWV3Lmh0bWwiIHRpdGxlPSJWYXJpYWJsZXMgVmlldyI+PGxpbmsgcmVsPSJuZXh0IiBocmVmPSIuLi9wcmVmZXJlbmNlcy94c2xwcmVmZXJlbmNlcy5odG1sIiB0aXRsZT0iWFNMIFRvb2xzIFByZWZlcmVuY2VzIj48L2hlYWQ+PGJvZHkgYmdjb2xvcj0id2hpdGUiIHRleHQ9ImJsYWNrIiBsaW5rPSIjMDAwMEZGIiB2bGluaz0iIzg0MDA4NCIgYWxpbms9IiMwMDAwRkYiPjxkaXYgY2xhc3M9InNlY3Rpb24iIGxhbmc9ImVuIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDMgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJYU0xEZWJ1Z1Byb2Nlc3NvclNwZWNpZmljIj48L2E+WFNMVCBQcm9jZXNzb3IgU3BlY2lmaWMgU3VwcG9ydDwvaDM+PC9kaXY+PC9kaXY+PC9kaXY+PHA+IFZhcmlvdXMgWFNMVCBwcm9jZXNzb3JzIHByb3ZpZGUgdmFyaW91cyBsZXZlbHMgb2YgZGVidWdnaW5nIHN1cHBvcnQuIE1hbnkgZG8gbm90IHByb3ZpZGUgc3VwcG9ydCBmb3IgZGVidWdnaW5nCi0JCQkJb2Ygc3R5bGVzaGVldHMsIGFuZCB0aHVzIGNhbid0IGJlIHVzZWQgZm9yIGRlYnVnZ2luZy4gWFNMIFRvb2xzIHByb3ZpZGVzIGJhc2ljIHN1cHBvcnQgZm9yIFhhbGFuLCBhbmQgY2FuIGJlIHVzZWQgYXMKLQkJCQlhIGd1aWRlIGZvciBhZG9wdGVycyBvbiBob3cgdG8gaW1wbGVtZW50IHRoZWlyIG93biBzcGVjaWZpYyBkZWJ1Z2dpbmcgc3VwcG9ydCBmb3Igb3RoZXIgcHJvY2Vzc29ycy48L3A+PGRpdiBjbGFzcz0ic2VjdGlvbiIgbGFuZz0iZW4iPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoNCBjbGFzcz0idGl0bGUiPjxhIG5hbWU9IlhTTERlYnVnWGFsYW4iPjwvYT5YU0wgRGVidWdnaW5nIHdpdGggWGFsYW48L2g0PjwvZGl2PjwvZGl2PjwvZGl2PjxwPiBYYWxhbiBwcm92aWRlcyBnZW5lcmFsIHN0eWxlc2hlZXQgZXhlY3V0aW9uIGFuZCBldmFsYXRpb24gZnVuY3Rpb25hbGl0eS4gSG93ZXZlciB0aGVyZSBhcmUgYSBmZXcgdGhpbmdzIHRoYXQKLQkJCQkJWGFsYW4gZG9lcyBub3Qgc3VwcG9yIHRoYXQgb3RoZXIgcHJvY2Vzc29ycyBkby48L3A+PGRpdiBjbGFzcz0ib3JkZXJlZGxpc3QiPjxwIGNsYXNzPSJ0aXRsZSI+PGI+WGFsYW4gRGVidWdnaW5nIElzc3VlczwvYj48L3A+PG9sIHR5cGU9IjEiPjxsaT48cD4KLQkJCQkJCQk8c3BhbiBjbGFzcz0iZW1waGFzaXMiPjxlbT5CcmVha3BvaW50czwvZW0+PC9zcGFuPgotCQkJCQkJCS0gWGFsYW4gZG9lcyBub3Qgc3VwcG9ydCBzdG9wcGluZyBhdCBHbG9iYWwgVmFyaWFibGVzIG9yIFBhcmFtZXRlcnMgd2hlbiBhIGRlYnVnZ2luZyBzZXNzaW9uIGlzIHN0YXJ0ZWQuIEl0IHdpbGwKLQkJCQkJCQlhdXRvbWF0aWNhbGx5IHN0YXJ0IGF0IHRoZSBmaXJzdCB0ZW1wbGF0ZS4gQnJlYWsgcG9pbnRzIG11c3QgYmUgcGxhY2VkIGluIHRlbXBsYXRlcyB0byBiZSBob25vcmVkLiBUaGUgcmVhc29uIGZvcgotCQkJCQkJCXRoaXMgaXMgdGhhdCBYYWxhbiBsYXppbHkgaW5pdGlhbGl6ZXMgdGhlIHZhcmlhYmxlcyBvbmx5IHdoZW4gdGhleSBhcmUgZmlyc3QgdXNlZC4KLQkJCQkJCTwvcD48L2xpPjxsaT48cD4KLQkJCQkJCQk8c3BhbiBjbGFzcz0iZW1waGFzaXMiPjxlbT5YU0xUIFRleHQgZWxlbWVudHM8L2VtPjwvc3Bhbj4KLQkJCQkJCQktIFhhbGFuIGRvZXMgbm90IHNlbmQgbm90aWZpY2F0aW9ucyBvZiB4c2w6dGV4dCBlbGVtZW50cy4gVGhlc2UgYXJlIHNraXBwZWQgb3ZlciB3aGVuIGRlYnVnZ2luZy4KLQkJCQkJCTwvcD48L2xpPjxsaT48cD4KLQkJCQkJCQk8c3BhbiBjbGFzcz0iZW1waGFzaXMiPjxlbT5CdWlsdCBJbiBUZW1wbGF0ZXM8L2VtPjwvc3Bhbj4KLQkJCQkJCQktIFhhbGFuIGRvZXMgcHJvdmlkZSBub3RpZmljYXRpb24gd2hlbiB0aGUgYnVpbHQgaW4gdGVtcGxhdGVzIGFyZSBjYWxsZWQsIGJ1dCBjdXJyZW50bHkgdGhlIGRlYnVnZ2VyIGRvZXMgbm90Ci0JCQkJCQkJc3VwcG9ydCBvciBkaXNwbGF5IHN0ZXBwaW5nIGludG8gdGhlc2UgdGVtcGxhdGVzLgotCQkJCQkJPC9wPjwvbGk+PC9vbD48L2Rpdj48L2Rpdj48L2Rpdj48L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9sYXVuY2hpbmcvZGVidWdnaW5nX3ZhcmlhYmxlc3ZpZXcuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9sYXVuY2hpbmcvZGVidWdnaW5nX3ZhcmlhYmxlc3ZpZXcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVkZjRlOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvbGF1bmNoaW5nL2RlYnVnZ2luZ192YXJpYWJsZXN2aWV3Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08aHRtbD48aGVhZD48TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+PHRpdGxlPlZhcmlhYmxlcyBWaWV3PC90aXRsZT48bGluayBocmVmPSJib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+PGxpbmsgaHJlZj0iLi4vYm9vay5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPjxtZXRhIGNvbnRlbnQ9IkRvY0Jvb2sgWFNMIFN0eWxlc2hlZXRzIFYxLjc0LjAiIG5hbWU9ImdlbmVyYXRvciI+PGxpbmsgcmVsPSJob21lIiBocmVmPSIuLi9pbmRleC5odG1sIiB0aXRsZT0iWFNMIFRvb2xzIFVzZXIgRG9jdW1lbnRhdGlvbiI+PGxpbmsgcmVsPSJ1cCIgaHJlZj0iZGVidWdnaW5nX2NvbW1vbi5odG1sIiB0aXRsZT0iQ29tbW9uIERlYnVnZ2luZyBPcGVyYXRpb25zIj48bGluayByZWw9InByZXYiIGhyZWY9ImRlYnVnZ2luZ19jb21tb24uaHRtbCIgdGl0bGU9IkNvbW1vbiBEZWJ1Z2dpbmcgT3BlcmF0aW9ucyI+PGxpbmsgcmVsPSJuZXh0IiBocmVmPSJkZWJ1Z2dpbmdfcHJvY2Vzc29ycy5odG1sIiB0aXRsZT0iWFNMVCBQcm9jZXNzb3IgU3BlY2lmaWMgU3VwcG9ydCI+PC9oZWFkPjxib2R5IGJnY29sb3I9IndoaXRlIiB0ZXh0PSJibGFjayIgbGluaz0iIzAwMDBGRiIgdmxpbms9IiM4NDAwODQiIGFsaW5rPSIjMDAwMEZGIj48ZGl2IGNsYXNzPSJzZWN0aW9uIiBsYW5nPSJlbiI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGg0IGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0iWFNMRGVidWdWYXJpYWJsZXMiPjwvYT5WYXJpYWJsZXMgVmlldzwvaDQ+PC9kaXY+PC9kaXY+PC9kaXY+PHA+IFRoZSB2YXJpYWJsZXMgdmlldyB3aWxsIHNob3cgYWxsIHRoZSBsb2NhbCBhbmQgZ2xvYmFsIHZhcmlhYmxlcyBhbmQgcGFyYW1zIHRoYXQgYXJlIGN1cnJlbnRseSBpbiBzY29wZS4gVGhlcmUKLQkJCQkJYXJlIHR3byB0eXBlcyBvZiB2YXJpYWJsZXMgdGhhdCBjYW4gYmUgdmlld3MuPC9wPjxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0IiBhbGlnbj0iY2VudGVyIj48aW1nIHNyYz0iLi4vaW1hZ2VzL2xhdW5jaGluZy9ub2Rlc2V0VmFyaWFibGUucG5nIiBhbGlnbj0ibWlkZGxlIj48L2Rpdj48ZGl2IGNsYXNzPSJpdGVtaXplZGxpc3QiPjxwIGNsYXNzPSJ0aXRsZSI+PGI+VmFyaWFibGUgVHlwZXM8L2I+PC9wPjx1bCB0eXBlPSJkaXNjIj48bGk+PHA+Ci0JCQkJCQkJPHNwYW4gY2xhc3M9ImVtcGhhc2lzIj48ZW0+U3RyaW5nPC9lbT48L3NwYW4+Ci0JCQkJCQkJLSBUaGVzZSBjb250YWluIHRleHQgdmFsdWVzLiBUaGlzIGNvdWxkIGJlIHN0cmluZ3Mgb2YgdGV4dCwgbnVtYmVycywgb3Igb3RoZXIgY2hhcmFjdGVycy4KLQkJCQkJCTwvcD48L2xpPjxsaT48cD4KLQkJCQkJCQk8c3BhbiBjbGFzcz0iZW1waGFzaXMiPjxlbT5Ob2Rlc2V0czwvZW0+PC9zcGFuPgotCQkJCQkJCS0gTm9kZXNldHMgYXJlIHJlcHJlc2VudGVkIGluIHRoZSB2YXJpYWJsZXMgdmlldyBhcyBleHBhbmRhYmxlIHZhcmlhYmxlcy4gVGhleSBjb250YWluIHNlcXVlbmNlcyBvZiBub2Rlcy4gVGhlCi0JCQkJCQkJdHlwZSBvZiBub2RlcyBhcmUgcmVwcmVzZW50ZWQgYnkgaWNvbnMgZm9yIGVsZW1lbnRzLCBhdHRyaWJ1dGVzLCB0ZXh0LCBjb21tZW50cyBvciBwcm9jZXNzaW5nIGluc3RydWN0aW9ucy4KLQkJCQkJCTwvcD48L2xpPjwvdWw+PC9kaXY+PGRpdiBjbGFzcz0ibm90ZSIgc3R5bGU9Im1hcmdpbi1sZWZ0OiAwLjVpbjsgbWFyZ2luLXJpZ2h0OiAwLjVpbjsiPjxoMyBjbGFzcz0idGl0bGUiPkNhbiBJIGNoYW5nZSB0aGUgdmFsdWUgb2YgdmFyaWFibGVzPzwvaDM+PHA+IEN1cnJlbnRseSB0aGUgWFNMVCBEZWJ1Z2dlciBkb2VzIG5vdCBzdXBwb3J0IGNoYW5naW5nIHRoZSB2YWx1ZXMgb3IgY29udGVudHMgb2YgYSB2YXJpYWJsZS4gQWxsIFhTTFQKLQkJCQkJCXZhcmlhYmxlcyBhcmUgcmVhZCBvbmx5LjwvcD48L2Rpdj48L2Rpdj48L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9sYXVuY2hpbmcvZGVidWdsYXVuY2hpbmcuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9sYXVuY2hpbmcvZGVidWdsYXVuY2hpbmcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk4OGQ5Ny4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvbGF1bmNoaW5nL2RlYnVnbGF1bmNoaW5nLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLTxodG1sPjxoZWFkPjxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij48dGl0bGU+TGF1bmNoIERlYnVnZ2luZzwvdGl0bGU+PG1ldGEgY29udGVudD0iRG9jQm9vayBYU0wgU3R5bGVzaGVldHMgVjEuNzQuMCIgbmFtZT0iZ2VuZXJhdG9yIj48bGluayByZWw9ImhvbWUiIGhyZWY9Ii4uL2luZGV4Lmh0bWwiIHRpdGxlPSJYU0wgVG9vbHMgVXNlciBEb2N1bWVudGF0aW9uIj48bGluayByZWw9InVwIiBocmVmPSJsYXVuY2hpbmcuaHRtbCIgdGl0bGU9IkNoYXB0ZXImbmJzcDszLiZuYnNwO1hTTCBMYXVuY2hpbmcgYW5kIERlYnVnZ2luZyI+PGxpbmsgcmVsPSJwcmV2IiBocmVmPSJsYXVuY2hpbmcuaHRtbCIgdGl0bGU9IkNoYXB0ZXImbmJzcDszLiZuYnNwO1hTTCBMYXVuY2hpbmcgYW5kIERlYnVnZ2luZyI+PGxpbmsgcmVsPSJuZXh0IiBocmVmPSIuLi9wcmVmZXJlbmNlcy94c2xwcmVmZXJlbmNlcy5odG1sIiB0aXRsZT0iQ2hhcHRlciZuYnNwOzQuJm5ic3A7WFNMIFRvb2xzIFByZWZlcmVuY2VzIj48L2hlYWQ+PGJvZHkgYmdjb2xvcj0id2hpdGUiIHRleHQ9ImJsYWNrIiBsaW5rPSIjMDAwMEZGIiB2bGluaz0iIzg0MDA4NCIgYWxpbms9IiMwMDAwRkYiPjxkaXYgY2xhc3M9InNlY3Rpb24iIGxhbmc9ImVuIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDIgY2xhc3M9InRpdGxlIiBzdHlsZT0iY2xlYXI6IGJvdGgiPjxhIG5hbWU9IlhTTERlYnVnIj48L2E+TGF1bmNoIERlYnVnZ2luZzwvaDI+PC9kaXY+PC9kaXY+PC9kaXY+PHA+Ci0JICAgCQlUaGlzIGlzIGEgcGxhY2UgaG9sZGVyIHVudGlsIHNvbWUgYWN0dWFsIGRvY3VtZW50YXRpb24gY2FuIGJlIHdyaXR0ZW4uCi0JICAgPC9wPjwvZGl2PjwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL2xhdW5jaGluZy9sYXVuY2hpbmcuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9sYXVuY2hpbmcvbGF1bmNoaW5nLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZTAyMTcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL2xhdW5jaGluZy9sYXVuY2hpbmcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPjx0aXRsZT5YU0wgTGF1bmNoaW5nIGFuZCBEZWJ1Z2dpbmc8L3RpdGxlPjxsaW5rIGhyZWY9ImJvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj48bGluayBocmVmPSIuLi9ib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+PG1ldGEgY29udGVudD0iRG9jQm9vayBYU0wgU3R5bGVzaGVldHMgVjEuNzQuMCIgbmFtZT0iZ2VuZXJhdG9yIj48bGluayByZWw9ImhvbWUiIGhyZWY9Ii4uL2luZGV4Lmh0bWwiIHRpdGxlPSJYU0wgVG9vbHMgVXNlciBEb2N1bWVudGF0aW9uIj48bGluayByZWw9InVwIiBocmVmPSIuLi9pbmRleC5odG1sIiB0aXRsZT0iWFNMIFRvb2xzIFVzZXIgRG9jdW1lbnRhdGlvbiI+PGxpbmsgcmVsPSJwcmV2IiBocmVmPSIuLi9lZGl0b3IveHNsZWRpdG9yX2RlYnVnZ2luZy5odG1sIiB0aXRsZT0iTmF2aWdhdGlvbiI+PGxpbmsgcmVsPSJuZXh0IiBocmVmPSJkZWJ1Z2dpbmcuaHRtbCIgdGl0bGU9IlhTTFQgRGVidWdnaW5nIj48L2hlYWQ+PGJvZHkgYmdjb2xvcj0id2hpdGUiIHRleHQ9ImJsYWNrIiBsaW5rPSIjMDAwMEZGIiB2bGluaz0iIzg0MDA4NCIgYWxpbms9IiMwMDAwRkYiPjxkaXYgY2xhc3M9ImNoYXB0ZXIiIGxhbmc9ImVuIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDIgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJOMTAyM0IiPjwvYT5YU0wgTGF1bmNoaW5nIGFuZCBEZWJ1Z2dpbmc8L2gyPjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9InRvYyI+PHA+PGI+VGFibGUgb2YgQ29udGVudHM8L2I+PC9wPjx1bD48bGk+PHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9ImxhdW5jaGluZy5odG1sI1hTTExhdW5jaCI+WFNMIExhdW5jaGluZzwvYT48L3NwYW4+PC9saT48bGk+PHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9ImRlYnVnZ2luZy5odG1sIj5YU0xUIERlYnVnZ2luZzwvYT48L3NwYW4+PHVsPjxsaT48c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iZGVidWdnaW5nLmh0bWwjRGVidWdHZXR0aW5nU3RhcnRlZCI+U3RhcnRpbmcgYSBEZWJ1ZyBTZXNzaW9uPC9hPjwvc3Bhbj48L2xpPjxsaT48c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iZGVidWdnaW5nX2NvbW1vbi5odG1sIj5Db21tb24gRGVidWdnaW5nIE9wZXJhdGlvbnM8L2E+PC9zcGFuPjx1bD48bGk+PHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9ImRlYnVnZ2luZ19jb21tb24uaHRtbCNYU0xEZWJ1Z1Jlc3VsdFZpZXciPlJlc3VsdCBWaWV3PC9hPjwvc3Bhbj48L2xpPjxsaT48c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iZGVidWdnaW5nX3ZhcmlhYmxlc3ZpZXcuaHRtbCI+VmFyaWFibGVzIFZpZXc8L2E+PC9zcGFuPjwvbGk+PC91bD48L2xpPjxsaT48c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iZGVidWdnaW5nX3Byb2Nlc3NvcnMuaHRtbCI+WFNMVCBQcm9jZXNzb3IgU3BlY2lmaWMgU3VwcG9ydDwvYT48L3NwYW4+PHVsPjxsaT48c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iZGVidWdnaW5nX3Byb2Nlc3NvcnMuaHRtbCNYU0xEZWJ1Z1hhbGFuIj5YU0wgRGVidWdnaW5nIHdpdGggWGFsYW48L2E+PC9zcGFuPjwvbGk+PC91bD48L2xpPjwvdWw+PC9saT48L3VsPjwvZGl2PjxwPiBYU0wgVG9vbHMgYWRkcyBzdXBwb3J0IGZvciBYU0wgTGF1bmNoIGFuZCBEZWJ1Z2dpbmcgY29uZmlndXJhdGlvbnMuIFRoZXNlIGFsbG93IHlvdSB0byBzZXR1cCBYU0wgY29uZmlndXJhdGlvbnMKLQkJZm9yIHZhcmlvdXMgam9icywgYW5kIHRvIGFsc28gZGVidWcgeHNsIHN0eWxzaGVldCB0cmFuc2Zvcm1hdGlvbnMuPC9wPjxkaXYgY2xhc3M9InNlY3Rpb24iIGxhbmc9ImVuIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDIgY2xhc3M9InRpdGxlIiBzdHlsZT0iY2xlYXI6IGJvdGgiPjxhIG5hbWU9IlhTTExhdW5jaCI+PC9hPlhTTCBMYXVuY2hpbmc8L2gyPjwvZGl2PjwvZGl2PjwvZGl2PjxwPgotCQkJSW4gdGhlIFByb2plY3QgRXhwbG9yZXIsIHNpbXBseSBzZWxlY3QgdGhlIGlucHV0IFhNTCBmaWxlIGFuZCB0aGUgc3R5bGVzaGVldChzKSB0byB0cmFuc2Zvcm0gaXQsIGFuZCB0aGVuIHJpZ2h0LWNsaWNrCi0JCQlhbmQgc2VsZWN0Ci0JCQk8c3BhbiBjbGFzcz0iZW1waGFzaXMiPjxlbT5SdW4gQXMgJmd0OyBYU0wgVHJhbnNmb3JtYXRpb248L2VtPjwvc3Bhbj4KLQkJCS4KLQkJPC9wPjxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0IiBhbGlnbj0iY2VudGVyIj48aW1nIHNyYz0iLi4vaW1hZ2VzL2xhdW5jaGluZy9sYXVuY2hTaG9ydGN0LnBuZyIgYWxpZ249Im1pZGRsZSI+PC9kaXY+PC9kaXY+PC9kaXY+PC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvbGVnYWwuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9sZWdhbC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmI2ZTY0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9sZWdhbC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPjx0aXRsZT5Ob3RpY2VzPC90aXRsZT48bGluayBocmVmPSJib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+PGxpbmsgaHJlZj0iLi4vYm9vay5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPjxtZXRhIGNvbnRlbnQ9IkRvY0Jvb2sgWFNMIFN0eWxlc2hlZXRzIFYxLjc0LjAiIG5hbWU9ImdlbmVyYXRvciI+PGxpbmsgcmVsPSJob21lIiBocmVmPSJpbmRleC5odG1sIiB0aXRsZT0iWFNMIFRvb2xzIFVzZXIgRG9jdW1lbnRhdGlvbiI+PGxpbmsgcmVsPSJ1cCIgaHJlZj0iaW5kZXguaHRtbCIgdGl0bGU9IlhTTCBUb29scyBVc2VyIERvY3VtZW50YXRpb24iPjxsaW5rIHJlbD0icHJldiIgaHJlZj0ic2FtcGxlcy9zYW1wbGVzLmh0bWwiIHRpdGxlPSJYU0wgVG9vbGluZyBTYW1wbGVzIj48L2hlYWQ+PGJvZHkgYmdjb2xvcj0id2hpdGUiIHRleHQ9ImJsYWNrIiBsaW5rPSIjMDAwMEZGIiB2bGluaz0iIzg0MDA4NCIgYWxpbms9IiMwMDAwRkYiPjxkaXYgY2xhc3M9ImNoYXB0ZXIiIGxhbmc9ImVuIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDIgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJOMTAzRjgiPjwvYT5Ob3RpY2VzPC9oMj48L2Rpdj48L2Rpdj48L2Rpdj48cD4KLSAgICAgIFRoZSBtYXRlcmlhbCBpbiB0aGlzIGd1aWRlIGlzIENvcHlyaWdodCAoYykgRG91ZyBTYXRjaHdlbGwgKDxhIGNsYXNzPSJ1bGluayIgaHJlZj0iaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsiIHRhcmdldD0iX3RvcCI+Q2hhc2UgVGVjaG5vbG9neSBMdGQ8L2E+KSwgCi0gICAgICBEYXZpZCBDYXJ2ZXIgKDxhIGNsYXNzPSJ1bGluayIgaHJlZj0iaHR0cDovL3d3dy5zdGFyc3RhbmRhcmQub3JnIiB0YXJnZXQ9Il90b3AiPlN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbDwvYT4pCi0gICAgICBhbmQgb3RoZXJzIDIwMDguCi0gICAgPC9wPjxwPgotCQlUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLQkJdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0JCTxhIGNsYXNzPSJ1bGluayIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiIHRhcmdldD0iX3RvcCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgIDwvcD48cD4KLQkJPGEgY2xhc3M9InVsaW5rIiBocmVmPSJhYm91dC5odG1sIiB0YXJnZXQ9Il90b3AiPlRlcm1zIGFuZCBjb25kaXRpb25zIHJlZ2FyZGluZyB0aGUgdXNlIG9mIHRoaXMgZ3VpZGUuPC9hPi4KLQk8L3A+PC9kaXY+PC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvcHJlZmVyZW5jZXMvc3ludGF4Q29sb3JpbmcuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9wcmVmZXJlbmNlcy9zeW50YXhDb2xvcmluZy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWNmM2MzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9wcmVmZXJlbmNlcy9zeW50YXhDb2xvcmluZy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08aHRtbD48aGVhZD48TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+PHRpdGxlPlhTTFQgU3ludGF4IENvbG9yaW5nPC90aXRsZT48bGluayBocmVmPSJib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+PGxpbmsgaHJlZj0iLi4vYm9vay5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPjxtZXRhIGNvbnRlbnQ9IkRvY0Jvb2sgWFNMIFN0eWxlc2hlZXRzIFYxLjc0LjAiIG5hbWU9ImdlbmVyYXRvciI+PGxpbmsgcmVsPSJob21lIiBocmVmPSIuLi9pbmRleC5odG1sIiB0aXRsZT0iWFNMIFRvb2xzIFVzZXIgRG9jdW1lbnRhdGlvbiI+PGxpbmsgcmVsPSJ1cCIgaHJlZj0ieHNscHJlZmVyZW5jZXMuaHRtbCIgdGl0bGU9IlhTTCBUb29scyBQcmVmZXJlbmNlcyI+PGxpbmsgcmVsPSJwcmV2IiBocmVmPSJ2YWxpZGF0aW9uLmh0bWwiIHRpdGxlPSJQcm9qZWN0IFZhbGlkYXRpb24gUHJlZmVyZW5jZXMiPjxsaW5rIHJlbD0ibmV4dCIgaHJlZj0iLi4vZ2VuZXJhbC9nZW5lcmFsLmh0bWwiIHRpdGxlPSJHZW5lcmFsIj48L2hlYWQ+PGJvZHkgYmdjb2xvcj0id2hpdGUiIHRleHQ9ImJsYWNrIiBsaW5rPSIjMDAwMEZGIiB2bGluaz0iIzg0MDA4NCIgYWxpbms9IiMwMDAwRkYiPjxkaXYgY2xhc3M9InNlY3Rpb24iIGxhbmc9ImVuIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDIgY2xhc3M9InRpdGxlIiBzdHlsZT0iY2xlYXI6IGJvdGgiPjxhIG5hbWU9InByZWZfU3ludGF4Q29sb3JpbmciPjwvYT5YU0xUIFN5bnRheCBDb2xvcmluZzwvaDI+PC9kaXY+PC9kaXY+PC9kaXY+PHA+Ci0gICAgICAgICAgICBYU0wgVG9vbHMgYWxzbyBoYXMgdGhlIGFiaWxpdHkgdG8gc3ludGF4IGNvbG9yIHRoZSBYU0xUIG5hbWVzcGFjZSBpdGVtcyBhIGRpZmZlcmVudAotICAgICAgICAgICAgY29sb3IgdGhhbiB0aGUgcmVzdCBvZiB0aGUgWE1MIHN5bnRheCBpbmNsdWRlZC4gICBUaGUgZGVmYXVsdCBpcyBmb3IgYWxsIFhTTCBzeW50YXggdG8gYmUKLSAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJib2xkIj48c3Ryb25nPmJvbGQ8L3N0cm9uZz48L3NwYW4+LgotICAgICAgICA8L3A+PGRpdiBjbGFzcz0iZmlndXJlIj48YSBuYW1lPSJmaWdfWFNMU3ludGF4Q29sb3JpbmdQcmVmZXJlbmNlIj48L2E+PHAgY2xhc3M9InRpdGxlIj48Yj5GaWd1cmUmbmJzcDsxMy4mbmJzcDtYU0wgVG9vbHMgU3ludGF4IENvbG9yaW5nIFByZWZlcmVuY2U8L2I+PC9wPjxkaXYgY2xhc3M9ImZpZ3VyZS1jb250ZW50cyI+PGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiIGFsaWduPSJjZW50ZXIiPjxpbWcgc3JjPSIuLi9pbWFnZXMvcHJlZmVyZW5jZXMveHNsU3ludGF4Q29sb3JpbmcucG5nIiBhbGlnbj0ibWlkZGxlIiBhbHQ9IlhTTCBUb29scyBTeW50YXggQ29sb3JpbmcgUHJlZmVyZW5jZSI+PC9kaXY+PC9kaXY+PC9kaXY+PGJyIGNsYXNzPSJmaWd1cmUtYnJlYWsiPjxkaXYgY2xhc3M9Im5vdGUiIHN0eWxlPSJtYXJnaW4tbGVmdDogMC41aW47IG1hcmdpbi1yaWdodDogMC41aW47Ij48aDMgY2xhc3M9InRpdGxlIj5YTUwgQ29sb3JzPC9oMz48cD4KLSAgICAgICAgICAgICAgICBUaGUgY29sb3IgZm9yIHN0YW5kYXJkIFhNTCBpcyBzdGlsbCBoYW5kbGVkIGJ5IHRoZSBYTUwgRmlsZXMgc3ludGF4IGNvbG9yaW5nCi0gICAgICAgICAgICAgICAgcHJlZmVyZW5jZSBwYWdlLiAgIENoYW5nZXMgbWFkZSB0aGVyZSBhcmUgcmVmbGVjdGVkIGluIHRoZSBYU0wgZWRpdG9yIGFzIHdlbGwuCi0gICAgICAgICAgICA8L3A+PC9kaXY+PC9kaXY+PC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvcHJlZmVyZW5jZXMvdmFsaWRhdGlvbi5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL3ByZWZlcmVuY2VzL3ZhbGlkYXRpb24uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhlYjhlOS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvcHJlZmVyZW5jZXMvdmFsaWRhdGlvbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08aHRtbD48aGVhZD48TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+PHRpdGxlPlByb2plY3QgVmFsaWRhdGlvbiBQcmVmZXJlbmNlczwvdGl0bGU+PGxpbmsgaHJlZj0iYm9vay5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPjxsaW5rIGhyZWY9Ii4uL2Jvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj48bWV0YSBjb250ZW50PSJEb2NCb29rIFhTTCBTdHlsZXNoZWV0cyBWMS43NC4wIiBuYW1lPSJnZW5lcmF0b3IiPjxsaW5rIHJlbD0iaG9tZSIgaHJlZj0iLi4vaW5kZXguaHRtbCIgdGl0bGU9IlhTTCBUb29scyBVc2VyIERvY3VtZW50YXRpb24iPjxsaW5rIHJlbD0idXAiIGhyZWY9InhzbHByZWZlcmVuY2VzLmh0bWwiIHRpdGxlPSJYU0wgVG9vbHMgUHJlZmVyZW5jZXMiPjxsaW5rIHJlbD0icHJldiIgaHJlZj0ieHBhdGhleHBvcnQuaHRtbCIgdGl0bGU9IkltcG9ydCBYUGF0aCBUZW1wbGF0ZXMiPjxsaW5rIHJlbD0ibmV4dCIgaHJlZj0ic3ludGF4Q29sb3JpbmcuaHRtbCIgdGl0bGU9IlhTTFQgU3ludGF4IENvbG9yaW5nIj48L2hlYWQ+PGJvZHkgYmdjb2xvcj0id2hpdGUiIHRleHQ9ImJsYWNrIiBsaW5rPSIjMDAwMEZGIiB2bGluaz0iIzg0MDA4NCIgYWxpbms9IiMwMDAwRkYiPjxkaXYgY2xhc3M9InNlY3Rpb24iIGxhbmc9ImVuIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDIgY2xhc3M9InRpdGxlIiBzdHlsZT0iY2xlYXI6IGJvdGgiPjxhIG5hbWU9InByZWZfUHJvamVjdFZhbGlkYXRpb25QcmVmZXJlbmNlcyI+PC9hPlByb2plY3QgVmFsaWRhdGlvbiBQcmVmZXJlbmNlczwvaDI+PC9kaXY+PC9kaXY+PC9kaXY+PHA+Ci0gICAgICAgICAgICBYU0wgVG9vbHMgaGFzIHRoZSBhYmlsaXR5IHRvIHNldCBib3RoIHdvcmtzcGFjZSB3aWRlIHByZWZlcmVuY2VzIGZvcgotICAgICAgICAgICAgdmFsaWRhdGlvbiBhcyB3ZWxsIGFzIHByb2plY3QgbGV2ZWwgcHJlZmVyZW5jZXMuIFRoZXNlIHByZWZlcmVuY2VzLCBhcyBzaG93bgotICAgICAgICAgICAgaW4KLSAgICAgICAgICAgIDxhIGNsYXNzPSJ4cmVmIiBocmVmPSJ2YWxpZGF0aW9uLmh0bWwjZmlnX1Byb2plY3RMZXZlbFByZWZlcmVuY2VzIiB0aXRsZT0iRmlndXJlJm5ic3A7MTIuJm5ic3A7UHJvamVjdCBMZXZlbCBWYWxpZGF0aW9uIFByZWZlcmVuY2VzIj5GaWd1cmUmbmJzcDsxMiwgJmxkcXVvO1Byb2plY3QgTGV2ZWwgVmFsaWRhdGlvbiBQcmVmZXJlbmNlcyZyZHF1bzs8L2E+Ci0gICAgICAgICAgICBhbGxvdyBmb3IgdGhlIGZpbmUgZ3JhaW4gY29udHJvbCBvZiB3aGF0IHRoZSB2YWxpZGF0b3Igd2lsbCBjb25zaWRlciB0byBiZSBhbgotICAgICAgICAgICAgc3ludGF4IGVycm9yLgotICAgICAgICA8L3A+PGRpdiBjbGFzcz0iZmlndXJlIj48YSBuYW1lPSJmaWdfUHJvamVjdExldmVsUHJlZmVyZW5jZXMiPjwvYT48cCBjbGFzcz0idGl0bGUiPjxiPkZpZ3VyZSZuYnNwOzEyLiZuYnNwO1Byb2plY3QgTGV2ZWwgVmFsaWRhdGlvbiBQcmVmZXJlbmNlczwvYj48L3A+PGRpdiBjbGFzcz0iZmlndXJlLWNvbnRlbnRzIj48ZGl2IGNsYXNzPSJtZWRpYW9iamVjdCIgYWxpZ249ImNlbnRlciI+PGltZyBzcmM9Ii4uL2ltYWdlcy9wcmVmZXJlbmNlcy9wcm9qZWN0TGV2ZWxWYWxpZGF0aW9uLnBuZyIgYWxpZ249Im1pZGRsZSIgYWx0PSJQcm9qZWN0IExldmVsIFZhbGlkYXRpb24gUHJlZmVyZW5jZXMiPjwvZGl2PjwvZGl2PjwvZGl2PjxiciBjbGFzcz0iZmlndXJlLWJyZWFrIj48cD4gVGhlc2UgcHJlZmVyZW5jZXMgYXJlIGFjY2Vzc2VkIHZpYSB0aGUgUHJvamVjdHMgcHJvcGVydGllcyBkaWFsb2cuPC9wPjwvZGl2PjwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL3ByZWZlcmVuY2VzL3hwYXRoZXhwb3J0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvcHJlZmVyZW5jZXMveHBhdGhleHBvcnQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAyN2UwMC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvcHJlZmVyZW5jZXMveHBhdGhleHBvcnQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLTxodG1sPjxoZWFkPjxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij48dGl0bGU+SW1wb3J0IFhQYXRoIFRlbXBsYXRlczwvdGl0bGU+PGxpbmsgaHJlZj0iYm9vay5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPjxsaW5rIGhyZWY9Ii4uL2Jvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj48bWV0YSBjb250ZW50PSJEb2NCb29rIFhTTCBTdHlsZXNoZWV0cyBWMS43NC4wIiBuYW1lPSJnZW5lcmF0b3IiPjxsaW5rIHJlbD0iaG9tZSIgaHJlZj0iLi4vaW5kZXguaHRtbCIgdGl0bGU9IlhTTCBUb29scyBVc2VyIERvY3VtZW50YXRpb24iPjxsaW5rIHJlbD0idXAiIGhyZWY9InhwYXRodGVtcGxhdGVzLmh0bWwiIHRpdGxlPSJYUGF0aCBUZW1wbGF0ZXMiPjxsaW5rIHJlbD0icHJldiIgaHJlZj0ieHBhdGhpbXBvcnQuaHRtbCIgdGl0bGU9IkltcG9ydCBYUGF0aCBUZW1wbGF0ZXMiPjxsaW5rIHJlbD0ibmV4dCIgaHJlZj0idmFsaWRhdGlvbi5odG1sIiB0aXRsZT0iUHJvamVjdCBWYWxpZGF0aW9uIFByZWZlcmVuY2VzIj48L2hlYWQ+PGJvZHkgYmdjb2xvcj0id2hpdGUiIHRleHQ9ImJsYWNrIiBsaW5rPSIjMDAwMEZGIiB2bGluaz0iIzg0MDA4NCIgYWxpbms9IiMwMDAwRkYiPjxkaXYgY2xhc3M9InNlY3Rpb24iIGxhbmc9ImVuIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDMgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJYUGF0aEV4cG9ydCI+PC9hPkltcG9ydCBYUGF0aCBUZW1wbGF0ZXM8L2gzPjwvZGl2PjwvZGl2PjwvZGl2PjxwPiBBZGQgZG9jdW1lbnRhdGlvbiBhYm91dCBpbXBvcnRpbmcgbmV3IHRlbXBsYXRlcy48L3A+PC9kaXY+PC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvcHJlZmVyZW5jZXMveHBhdGhpbXBvcnQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9wcmVmZXJlbmNlcy94cGF0aGltcG9ydC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmVjYjY2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9wcmVmZXJlbmNlcy94cGF0aGltcG9ydC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPjx0aXRsZT5JbXBvcnQgWFBhdGggVGVtcGxhdGVzPC90aXRsZT48bGluayBocmVmPSJib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+PGxpbmsgaHJlZj0iLi4vYm9vay5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPjxtZXRhIGNvbnRlbnQ9IkRvY0Jvb2sgWFNMIFN0eWxlc2hlZXRzIFYxLjc0LjAiIG5hbWU9ImdlbmVyYXRvciI+PGxpbmsgcmVsPSJob21lIiBocmVmPSIuLi9pbmRleC5odG1sIiB0aXRsZT0iWFNMIFRvb2xzIFVzZXIgRG9jdW1lbnRhdGlvbiI+PGxpbmsgcmVsPSJ1cCIgaHJlZj0ieHBhdGh0ZW1wbGF0ZXMuaHRtbCIgdGl0bGU9IlhQYXRoIFRlbXBsYXRlcyI+PGxpbmsgcmVsPSJwcmV2IiBocmVmPSJ4cGF0aHRlbXBsYXRlcy5odG1sIiB0aXRsZT0iWFBhdGggVGVtcGxhdGVzIj48bGluayByZWw9Im5leHQiIGhyZWY9InhwYXRoZXhwb3J0Lmh0bWwiIHRpdGxlPSJJbXBvcnQgWFBhdGggVGVtcGxhdGVzIj48L2hlYWQ+PGJvZHkgYmdjb2xvcj0id2hpdGUiIHRleHQ9ImJsYWNrIiBsaW5rPSIjMDAwMEZGIiB2bGluaz0iIzg0MDA4NCIgYWxpbms9IiMwMDAwRkYiPjxkaXYgY2xhc3M9InNlY3Rpb24iIGxhbmc9ImVuIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDMgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJYUGF0aEltcG9ydCI+PC9hPkltcG9ydCBYUGF0aCBUZW1wbGF0ZXM8L2gzPjwvZGl2PjwvZGl2PjwvZGl2PjxwPiBBZGQgZG9jdW1lbnRhdGlvbiBhYm91dCBpbXBvcnRpbmcgbmV3IHRlbXBsYXRlcy48L3A+PC9kaXY+PC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvcHJlZmVyZW5jZXMveHBhdGh0ZW1wbGF0ZXMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9wcmVmZXJlbmNlcy94cGF0aHRlbXBsYXRlcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWEyZTY5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9wcmVmZXJlbmNlcy94cGF0aHRlbXBsYXRlcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPjx0aXRsZT5YUGF0aCBUZW1wbGF0ZXM8L3RpdGxlPjxsaW5rIGhyZWY9ImJvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj48bGluayBocmVmPSIuLi9ib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+PG1ldGEgY29udGVudD0iRG9jQm9vayBYU0wgU3R5bGVzaGVldHMgVjEuNzQuMCIgbmFtZT0iZ2VuZXJhdG9yIj48bGluayByZWw9ImhvbWUiIGhyZWY9Ii4uL2luZGV4Lmh0bWwiIHRpdGxlPSJYU0wgVG9vbHMgVXNlciBEb2N1bWVudGF0aW9uIj48bGluayByZWw9InVwIiBocmVmPSJ4c2xwcmVmZXJlbmNlcy5odG1sIiB0aXRsZT0iWFNMIFRvb2xzIFByZWZlcmVuY2VzIj48bGluayByZWw9InByZXYiIGhyZWY9InhzbG91dHB1dHByb3BlcnRpZXMuaHRtbCIgdGl0bGU9Ik91dHB1dCBQcm9wZXJ0aWVzIj48bGluayByZWw9Im5leHQiIGhyZWY9InhwYXRoaW1wb3J0Lmh0bWwiIHRpdGxlPSJJbXBvcnQgWFBhdGggVGVtcGxhdGVzIj48L2hlYWQ+PGJvZHkgYmdjb2xvcj0id2hpdGUiIHRleHQ9ImJsYWNrIiBsaW5rPSIjMDAwMEZGIiB2bGluaz0iIzg0MDA4NCIgYWxpbms9IiMwMDAwRkYiPjxkaXYgY2xhc3M9InNlY3Rpb24iIGxhbmc9ImVuIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDIgY2xhc3M9InRpdGxlIiBzdHlsZT0iY2xlYXI6IGJvdGgiPjxhIG5hbWU9IlhQYXRoVGVtcGxhdGVzIj48L2E+WFBhdGggVGVtcGxhdGVzPC9oMj48L2Rpdj48L2Rpdj48L2Rpdj48cD4gWFBhdGggdGVtcGxhdGUgcHJvcG9zYWwgaXMgc3VwcG9ydGVkIGJ5IHRoZSBYU0wgVG9vbGluZyBwcm9qZWN0IHRocm91Z2ggdGhlCi0gICAgICAgICAgICBidWlsdCBpbiB0ZW1wbGF0ZSBmdW5jdGlvbmFsaXR5IG9mIGVjbGlwc2UuIFVzZXJzIGFuZCBBZG9wdGVycyBjYW4gYWRkIHRoZWlyCi0gICAgICAgICAgICBvd24gc3BlY2lmaWMgeHBhdGggZXh0ZW5zaW9ucyBmb3IgcHJvY2Vzc29yIHNwZWNpZmljIGV4dGVuc2lvbnMuIEFuIGV4YW1wbGUKLSAgICAgICAgICAgIHdvdWxkIGJlIHRvIGFkZCB0aGUgRVhTTFQgZXh0ZW5zaW9ucyBmb3IgcHJvcG9zYWwgc3VwcG9ydC48L3A+PGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiIGFsaWduPSJjZW50ZXIiPjxpbWcgc3JjPSIuLi9pbWFnZXMvcHJlZmVyZW5jZXMvWFBhdGhUZW1wbGF0ZXMucG5nIiBhbGlnbj0ibWlkZGxlIj48L2Rpdj48cD4gVGhlIGZvbGxvd2luZyBjb250ZW50IHR5cGVzIGFyZSBhdmFpbGFibGU6PC9wPjxkaXYgY2xhc3M9Iml0ZW1pemVkbGlzdCI+PHVsIHR5cGU9ImRpc2MiPjxsaT48cD4KLSAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImJvbGQiPjxzdHJvbmc+YXhpczwvc3Ryb25nPjwvc3Bhbj4KLSAgICAgICAgICAgICAgICAgICAgLSBhbiBYUGF0aCBuYXZpZ2F0aW9uIGF4aXMgc3RhdGVtZW50LgotICAgICAgICAgICAgICAgIDwvcD48L2xpPjxsaT48cD4KLSAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImJvbGQiPjxzdHJvbmc+ZXhzbHQ8L3N0cm9uZz48L3NwYW4+Ci0gICAgICAgICAgICAgICAgICAgIC0gQW4gWFBhdGggc3RhdGVtZW50IHRoYXQgaXMgZGVmaW5lZCBieSB0aGUKLSAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9InVsaW5rIiBocmVmPSJodHRwOi8vd3d3LmV4c2x0Lm9yZy8iIHRhcmdldD0iX3RvcCI+RVhTTFQ8L2E+Ci0gICAgICAgICAgICAgICAgICAgIGxpYnJhcnkuIFhhbGFuIGFuZCBtb3N0IG90aGVyIHByb2Nlc3NvcnMgaGF2ZSBidWlsdCBpbiBzdXBwb3J0IGZvciB0aGUKLSAgICAgICAgICAgICAgICAgICAgRVhTTFQgbGlicmFyeS4KLSAgICAgICAgICAgICAgICA8L3A+PC9saT48bGk+PHA+Ci0gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJib2xkIj48c3Ryb25nPnhwYXRoPC9zdHJvbmc+PC9zcGFuPgotICAgICAgICAgICAgICAgICAgICAtIFJlcHJlc2VudHMgYW4gWFBBVEggMS4wIGZ1bmN0aW9uLiBUaGVzZSBhcmUgZnVuY3Rpb25zIGFzIGRlZmluZWQgYnkKLSAgICAgICAgICAgICAgICAgICAgdGhlIFhQYXRoIDEuMCBzcGVjaWZpY2F0aW9uLgotICAgICAgICAgICAgICAgIDwvcD48L2xpPjxsaT48cD4KLSAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImJvbGQiPjxzdHJvbmc+eHBhdGggMi4wPC9zdHJvbmc+PC9zcGFuPgotICAgICAgICAgICAgICAgICAgICAtIFJlcHJlc2VudHMgYW4gWFBhdGggMi4wIGZ1bmN0aW9uLgotICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW1waGFzaXMiPjxlbT5Ob3RlOiBUaGF0IGN1cnJlbnRseSBYU0wgVG9vbHMgb25seSBzaGlwcyB3aXRoCi0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZXMgZGVmaW5lZCBmb3IgWFBhdGggMS4wIC48L2VtPjwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L3A+PC9saT48bGk+PHA+Ci0gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJib2xkIj48c3Ryb25nPm9wZXJhdG9yPC9zdHJvbmc+PC9zcGFuPgotICAgICAgICAgICAgICAgICAgICAtIEFuIHhwYXRoIGxvZ2ljYWwgb3BlcmF0b3IgbGlrZSBBTkQsIE9SLCBldGMuCi0gICAgICAgICAgICAgICAgPC9wPjwvbGk+PC91bD48L2Rpdj48ZGl2IGNsYXNzPSJzZWN0aW9uIiBsYW5nPSJlbiI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgzIGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0iWFBhdGhUZW1wbGF0ZU5ldyI+PC9hPkNyZWF0aW5nIE5ldyBUZW1wbGF0ZXM8L2gzPjwvZGl2PjwvZGl2PjwvZGl2PjxwPiBBZGQgZG9jdW1lbnRhdGlvbiBhYm91dCBjcmVhdGluZyBuZXcgdGVtcGxhdGVzLjwvcD48L2Rpdj48L2Rpdj48L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9wcmVmZXJlbmNlcy94c2xvdXRwdXRwcm9wZXJ0aWVzLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvcHJlZmVyZW5jZXMveHNsb3V0cHV0cHJvcGVydGllcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjFiNjZjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9wcmVmZXJlbmNlcy94c2xvdXRwdXRwcm9wZXJ0aWVzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTxodG1sPjxoZWFkPjxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij48dGl0bGU+T3V0cHV0IFByb3BlcnRpZXM8L3RpdGxlPjxsaW5rIGhyZWY9ImJvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj48bGluayBocmVmPSIuLi9ib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+PG1ldGEgY29udGVudD0iRG9jQm9vayBYU0wgU3R5bGVzaGVldHMgVjEuNzQuMCIgbmFtZT0iZ2VuZXJhdG9yIj48bGluayByZWw9ImhvbWUiIGhyZWY9Ii4uL2luZGV4Lmh0bWwiIHRpdGxlPSJYU0wgVG9vbHMgVXNlciBEb2N1bWVudGF0aW9uIj48bGluayByZWw9InVwIiBocmVmPSJ4c2xwcmVmZXJlbmNlcy5odG1sIiB0aXRsZT0iWFNMIFRvb2xzIFByZWZlcmVuY2VzIj48bGluayByZWw9InByZXYiIGhyZWY9InhzbHByb2Nlc3NvcnMuaHRtbCIgdGl0bGU9Ikluc3RhbGxlZCBQcm9jZXNzb3JzIj48bGluayByZWw9Im5leHQiIGhyZWY9InhwYXRodGVtcGxhdGVzLmh0bWwiIHRpdGxlPSJYUGF0aCBUZW1wbGF0ZXMiPjwvaGVhZD48Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgdGV4dD0iYmxhY2siIGxpbms9IiMwMDAwRkYiIHZsaW5rPSIjODQwMDg0IiBhbGluaz0iIzAwMDBGRiI+PGRpdiBjbGFzcz0ic2VjdGlvbiIgbGFuZz0iZW4iPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoMiBjbGFzcz0idGl0bGUiIHN0eWxlPSJjbGVhcjogYm90aCI+PGEgbmFtZT0iWFNMT3V0cHV0UHJvcGVydGllcyI+PC9hPk91dHB1dCBQcm9wZXJ0aWVzPC9oMj48L2Rpdj48L2Rpdj48L2Rpdj48cD4gVGhlIHZhcmlvdXMgeHNsIHByb2Nlc3NvcnMgc3VwcG9ydCBhIHdpZGUgdmFyaWV0eSBvZiBwcm9jZXNzb3Igc3BlY2lmaWMKLSAgICAgICAgICAgIHR3ZWFrcy4gSG93ZXZlciB0aGVyZSBhcmUgc2V2ZXJhbCBTdGFuZGFyZCBwcm9jZXNzb3IgZmVhdHVyZXMgdGhhdCBhbGwgWFNMVAotICAgICAgICAgICAgcHJvY2Vzc29ycyBzdXBwb3J0LiBUaGVzZSBvcHRpb25zIGNhbiBiZSBzZXQgYW5kIHdpbGwgYWN0IGFzIHRoZSBkZWZhdWx0cyBmb3IKLSAgICAgICAgICAgIGFsbCB0cmFuc2Zvcm1hdGlvbnMgdW5sZXNzIHRoZXkgYXJlIHNwZWNpZmljYWxseSBvdmVycmlkZW4gYnkgdGhlIHN0eWxlc2hlZXQKLSAgICAgICAgICAgIG9yIHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbi48L3A+PGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiIGFsaWduPSJjZW50ZXIiPjxpbWcgc3JjPSIuLi9pbWFnZXMvcHJlZmVyZW5jZXMveHNsX291dHB1dHByb3BlcnRpZXMucG5nIiBhbGlnbj0ibWlkZGxlIj48L2Rpdj48cD4gSW4gYWRkaXRpb24gdG8gdGhlIFN0YW5kYXJkIE91dHB1dCBQcm9wZXJ0aWVzLCBlYWNoIFhTTFQgcHJvY2Vzc29yIGNhbiBoYXZlCi0gICAgICAgICAgICBwcm9jZXNzb3JzIHNwZWNpZmljIGZlYXR1cmVzLjwvcD48L2Rpdj48L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9wcmVmZXJlbmNlcy94c2xwcmVmZXJlbmNlcy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL3ByZWZlcmVuY2VzL3hzbHByZWZlcmVuY2VzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhOTAyMzUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL3ByZWZlcmVuY2VzL3hzbHByZWZlcmVuY2VzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08aHRtbD48aGVhZD48TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+PHRpdGxlPlhTTCBUb29scyBQcmVmZXJlbmNlczwvdGl0bGU+PGxpbmsgaHJlZj0iYm9vay5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPjxsaW5rIGhyZWY9Ii4uL2Jvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj48bWV0YSBjb250ZW50PSJEb2NCb29rIFhTTCBTdHlsZXNoZWV0cyBWMS43NC4wIiBuYW1lPSJnZW5lcmF0b3IiPjxsaW5rIHJlbD0iaG9tZSIgaHJlZj0iLi4vaW5kZXguaHRtbCIgdGl0bGU9IlhTTCBUb29scyBVc2VyIERvY3VtZW50YXRpb24iPjxsaW5rIHJlbD0idXAiIGhyZWY9Ii4uL2luZGV4Lmh0bWwiIHRpdGxlPSJYU0wgVG9vbHMgVXNlciBEb2N1bWVudGF0aW9uIj48bGluayByZWw9InByZXYiIGhyZWY9Ii4uL2xhdW5jaGluZy9kZWJ1Z2dpbmdfcHJvY2Vzc29ycy5odG1sIiB0aXRsZT0iWFNMVCBQcm9jZXNzb3IgU3BlY2lmaWMgU3VwcG9ydCI+PGxpbmsgcmVsPSJuZXh0IiBocmVmPSJ4c2xwcm9jZXNzb3JzLmh0bWwiIHRpdGxlPSJJbnN0YWxsZWQgUHJvY2Vzc29ycyI+PC9oZWFkPjxib2R5IGJnY29sb3I9IndoaXRlIiB0ZXh0PSJibGFjayIgbGluaz0iIzAwMDBGRiIgdmxpbms9IiM4NDAwODQiIGFsaW5rPSIjMDAwMEZGIj48ZGl2IGNsYXNzPSJjaGFwdGVyIiBsYW5nPSJlbiI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgyIGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0iWFNMUHJlZmVyZW5jZXMiPjwvYT5YU0wgVG9vbHMgUHJlZmVyZW5jZXM8L2gyPjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9InRvYyI+PHA+PGI+VGFibGUgb2YgQ29udGVudHM8L2I+PC9wPjx1bD48bGk+PHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9InhzbHByZWZlcmVuY2VzLmh0bWwjWFNMRmVhdHVyZXMiPkZlYXR1cmVzPC9hPjwvc3Bhbj48L2xpPjxsaT48c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0ieHNscHJvY2Vzc29ycy5odG1sIj5JbnN0YWxsZWQgUHJvY2Vzc29yczwvYT48L3NwYW4+PC9saT48bGk+PHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9InhzbG91dHB1dHByb3BlcnRpZXMuaHRtbCI+T3V0cHV0IFByb3BlcnRpZXM8L2E+PC9zcGFuPjwvbGk+PGxpPjxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJ4cGF0aHRlbXBsYXRlcy5odG1sIj5YUGF0aCBUZW1wbGF0ZXM8L2E+PC9zcGFuPjx1bD48bGk+PHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9InhwYXRodGVtcGxhdGVzLmh0bWwjWFBhdGhUZW1wbGF0ZU5ldyI+Q3JlYXRpbmcgTmV3IFRlbXBsYXRlczwvYT48L3NwYW4+PC9saT48bGk+PHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9InhwYXRoaW1wb3J0Lmh0bWwiPkltcG9ydCBYUGF0aCBUZW1wbGF0ZXM8L2E+PC9zcGFuPjwvbGk+PGxpPjxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJ4cGF0aGV4cG9ydC5odG1sIj5JbXBvcnQgWFBhdGggVGVtcGxhdGVzPC9hPjwvc3Bhbj48L2xpPjwvdWw+PC9saT48bGk+PHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9InZhbGlkYXRpb24uaHRtbCI+UHJvamVjdCBWYWxpZGF0aW9uIFByZWZlcmVuY2VzPC9hPjwvc3Bhbj48L2xpPjxsaT48c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0ic3ludGF4Q29sb3JpbmcuaHRtbCI+WFNMVCBTeW50YXggQ29sb3Jpbmc8L2E+PC9zcGFuPjwvbGk+PC91bD48L2Rpdj48cD4gVGhlIFhTTCBQcmVmZXJlbmNlIHBhZ2VzIGhhcyBzZXZlcmFsIHN1YiBzZWN0aW9ucy4gRWFjaCBvZiB0aGVzZSBhbGxvdyBmb3IKLSAgICAgICAgY29uZmlndXJhdGlvbiBvZiB2YXJpb3VzIGFzcGVjdHMgb2YgdGhlIHByZWZlcmVuY2VzLiBGcm9tIHRoZSBjb250cm9sbGluZyBvZiB0aGUKLSAgICAgICAgZGVmYXVsdCBYU0wgcHJvY2Vzc29yIHRvIGJlIHVzZWQgZHVyaW5nIHRyYW5zZm9ybWF0aW9ucy4gVG8gZXh0ZW5kaW5nIHRoZSBjb250ZW50Ci0gICAgICAgIGFzc2lzdCBzdXBwb3J0IG9mIHRoZSBYUGF0aCBmdW5jdGlvbnMgYXZhaWxhYmxlIGluIHRoZSBYTUwgZWRpdG9yLjwvcD48ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIG5hbWU9ImZpZ19YU0xQcmVmZXJlbmNlcyI+PC9hPjxwIGNsYXNzPSJ0aXRsZSI+PGI+RmlndXJlJm5ic3A7MTEuJm5ic3A7WFNMIFRvb2xzIFByZWZlcmVuY2VzPC9iPjwvcD48ZGl2IGNsYXNzPSJmaWd1cmUtY29udGVudHMiPjxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0IiBhbGlnbj0iY2VudGVyIj48aW1nIHNyYz0iLi4vaW1hZ2VzL3ByZWZlcmVuY2VzL3hzbHByZWZlcmVuY2VzLnBuZyIgYWxpZ249Im1pZGRsZSIgYWx0PSJYU0wgVG9vbHMgUHJlZmVyZW5jZXMiPjwvZGl2PjwvZGl2PjwvZGl2PjxiciBjbGFzcz0iZmlndXJlLWJyZWFrIj48ZGl2IGNsYXNzPSJzZWN0aW9uIiBsYW5nPSJlbiI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgyIGNsYXNzPSJ0aXRsZSIgc3R5bGU9ImNsZWFyOiBib3RoIj48YSBuYW1lPSJYU0xGZWF0dXJlcyI+PC9hPkZlYXR1cmVzPC9oMj48L2Rpdj48L2Rpdj48L2Rpdj48cD4gVGhlIFhTTCBGZWF0dXJlcyBwcmVmZXJlbmNlIHBhZ2UgYWxsb3dzIGZvciB0aGUgY29uZmlndXJhdGlvbiBvZiBmZWF0dXJlcwotICAgICAgICAgICAgZm9yIGEgcGFydGljdWxhciBwcm9jZXNzb3IuIFhTTCBUb29scyBjb21lcyB3aXRoIFhhbGFuIDIuNy4wIGJ5IGRlZmF1bHQuCi0gICAgICAgICAgICBBZG9wdGVycyBjYW4gZXh0ZW5kIGFuZCBpbmNsdWRlIHRoZWlyIG93biBzcGVjaWZpYyBmZWF0dXJlcyBmb3IgdGhlaXIgb3duCi0gICAgICAgICAgICBwcm9jZXNvb3JzLiBBbiBhZG9wdGVyIGNvdWxkIGV4dGVuZCB0aGUgdG9vbGluZyB0byBzdXBwb3J0IFhTTFQgMi4wCi0gICAgICAgICAgICB0cmFuc2Zvcm1hdGlvbnMsIGFuZCBmZWF0dXJlcyBwYXJ0aWN1bGFyIHRvIHRoYXQgcGFyc2VyLjwvcD48ZGl2IGNsYXNzPSJtZWRpYW9iamVjdCIgYWxpZ249ImNlbnRlciI+PGltZyBzcmM9Ii4uL2ltYWdlcy9wcmVmZXJlbmNlcy94c2xmZWF0dXJlcy5wbmciIGFsaWduPSJtaWRkbGUiPjwvZGl2PjxwPgotICAgICAgICAgICAgVGhlCi0gICAgICAgICAgICA8c3BhbiBjbGFzcz0iYm9sZCI+PHN0cm9uZz5Qcm9jZXNzb3IgVHlwZTwvc3Ryb25nPjwvc3Bhbj4KLSAgICAgICAgICAgIGFsbG93cyB5b3UgdG8gc2V0IGZlYXR1cmVzIGZvciBhIHNwZWNpZmljIHByb2Nlc3Nvci4gSW4gdGhpcyBjYXNlIHRoaXMgaXMgZm9yCi0gICAgICAgICAgICB0aGUgcHJvY2Vzc29yIHRoYXQgaXMgYmVpbmcgaW5zdGFsbGVkLiBYU0wgVG9vbHMgY29tZXMgd2l0aCBYYWxhbiAyLjcuMCwgYW5kCi0gICAgICAgICAgICBpdCBpcyB0aGUgb25seSBhdmFpbGFibGUgcHJvY2Vzc29yIHR5cGUgYnkgZGVmYXVsdC4KLSAgICAgICAgPC9wPjxwPiBUaGUgZmVhdHVyZSB0YWJsZSBsaXN0cyB0aGUgZmVhdHVyZXMgdGhhdCBhcmUgc3BlY2lmaWMgdG8gdGhlIHByb2Nlc3NvcgotICAgICAgICAgICAgdGhhdCB3YXMgc2VsZWN0ZWQuIEFzIHlvdSBzZWxlY3QgZWFjaCBvZiB0aGUgZmVhdHVyZXMsIGluZm9ybWF0aW9uIHJlZ2FyZGluZwotICAgICAgICAgICAgdGhhdCBmZWF0dXJlIGFuZCBpdCdzIGFiaWxpdGllcyBpcyBkaXNwbGF5ZWQgaW4gdGhlIGRlc2NyaXB0aW9uIGJveC4gQnkKLSAgICAgICAgICAgIGNsaWNraW5nIGluIHRoZSB2YWx1ZSBjb2x1bW4sIG5leHQgdG8gdGhlIGZlYXR1cmUgeW91IHdhbnQgdG8gc2V0IHRoZSB2YWx1ZQotICAgICAgICAgICAgZm9yLCB0aGUgdXNlciBjYW4gc2V0IHRoZSBmZWF0dXJlLjwvcD48L2Rpdj48L2Rpdj48L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9wcmVmZXJlbmNlcy94c2xwcm9jZXNzb3JzLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvcHJlZmVyZW5jZXMveHNscHJvY2Vzc29ycy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjc5OWZjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9wcmVmZXJlbmNlcy94c2xwcm9jZXNzb3JzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTxodG1sPjxoZWFkPjxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij48dGl0bGU+SW5zdGFsbGVkIFByb2Nlc3NvcnM8L3RpdGxlPjxsaW5rIGhyZWY9ImJvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj48bGluayBocmVmPSIuLi9ib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+PG1ldGEgY29udGVudD0iRG9jQm9vayBYU0wgU3R5bGVzaGVldHMgVjEuNzQuMCIgbmFtZT0iZ2VuZXJhdG9yIj48bGluayByZWw9ImhvbWUiIGhyZWY9Ii4uL2luZGV4Lmh0bWwiIHRpdGxlPSJYU0wgVG9vbHMgVXNlciBEb2N1bWVudGF0aW9uIj48bGluayByZWw9InVwIiBocmVmPSJ4c2xwcmVmZXJlbmNlcy5odG1sIiB0aXRsZT0iWFNMIFRvb2xzIFByZWZlcmVuY2VzIj48bGluayByZWw9InByZXYiIGhyZWY9InhzbHByZWZlcmVuY2VzLmh0bWwiIHRpdGxlPSJYU0wgVG9vbHMgUHJlZmVyZW5jZXMiPjxsaW5rIHJlbD0ibmV4dCIgaHJlZj0ieHNsb3V0cHV0cHJvcGVydGllcy5odG1sIiB0aXRsZT0iT3V0cHV0IFByb3BlcnRpZXMiPjwvaGVhZD48Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgdGV4dD0iYmxhY2siIGxpbms9IiMwMDAwRkYiIHZsaW5rPSIjODQwMDg0IiBhbGluaz0iIzAwMDBGRiI+PGRpdiBjbGFzcz0ic2VjdGlvbiIgbGFuZz0iZW4iPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoMiBjbGFzcz0idGl0bGUiIHN0eWxlPSJjbGVhcjogYm90aCI+PGEgbmFtZT0iWFNMUHJvY2Vzc29ycyI+PC9hPkluc3RhbGxlZCBQcm9jZXNzb3JzPC9oMj48L2Rpdj48L2Rpdj48L2Rpdj48cD4gVGhlIGluc3RhbGxlZCBwcm9jZXNzb3JzIHBhZ2UgbGV0cyB5b3UgcGljayB3aGljaCBvZiB0aGUgaW5zdGFsbGVkIFhTTFQKLSAgICAgICAgICAgIHByb2Nlc3NvcnMgd2lsbCBiZSB1c2VkIGJ5IGRlZmF1bHQuIFRoZSBkZWZhdWx0IGlzIHRoZSBTeXN0ZW0gRGVmYXVsdAotICAgICAgICAgICAgUHJvY2Vzb29yLCBidXQgeW91IGNhbiBzZWxlY3QgYW55IG9mIHRoZSBhdmFpbGFibGUgcHJvY2Vzc29ycyB0byBiZSB1c2VkIGFzCi0gICAgICAgICAgICB0aGUgZGVmYXVsdCBwcm9jZXNzb3IuPC9wPjxkaXYgY2xhc3M9Im1lZGlhb2JqZWN0IiBhbGlnbj0iY2VudGVyIj48aW1nIHNyYz0iLi4vaW1hZ2VzL3ByZWZlcmVuY2VzL3hzbF9JbnN0YWxsZWRQcm9jZXNzb3JzLnBuZyIgYWxpZ249Im1pZGRsZSI+PC9kaXY+PC9kaXY+PC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvcmVmZXJlbmNlL21haW50b3BpYy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL3JlZmVyZW5jZS9tYWludG9waWMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ3NjA3OC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvcmVmZXJlbmNlL21haW50b3BpYy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLQotPGh0bWw+Ci08aGVhZD4KLQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLQk8dGl0bGU+TWFpbiBUb3BpYzwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgxPk1haW4gVG9waWM8L2gxPgotUGxlYXNlIGVudGVyIHlvdXIgdGV4dCBoZXJlLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9yZWZlcmVuY2Uvc3VidG9waWMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9yZWZlcmVuY2Uvc3VidG9waWMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE2MWM1MC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvcmVmZXJlbmNlL3N1YnRvcGljLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotCTx0aXRsZT5TdWIgVG9waWM8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMT5TdWIgVG9waWM8L2gxPgotUGxlYXNlIGVudGVyIHlvdXIgdGV4dCBoZXJlLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9yZWZlcmVuY2Uvc3VidG9waWMyLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvcmVmZXJlbmNlL3N1YnRvcGljMi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmJjYmY5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvaHRtbC9yZWZlcmVuY2Uvc3VidG9waWMyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotCTx0aXRsZT5TdWIgVG9waWMgMjwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgxPlN1YiBUb3BpYyAyPC9oMT4KLVBsZWFzZSBlbnRlciB5b3VyIHRleHQgaGVyZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvc2FtcGxlcy9zYW1wbGVzLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2h0bWwvc2FtcGxlcy9zYW1wbGVzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0YzZlMzIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9odG1sL3NhbXBsZXMvc2FtcGxlcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPGh0bWw+PGhlYWQ+PE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPjx0aXRsZT5YU0wgVG9vbGluZyBTYW1wbGVzPC90aXRsZT48bGluayBocmVmPSJib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+PGxpbmsgaHJlZj0iLi4vYm9vay5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPjxtZXRhIGNvbnRlbnQ9IkRvY0Jvb2sgWFNMIFN0eWxlc2hlZXRzIFYxLjc0LjAiIG5hbWU9ImdlbmVyYXRvciI+PGxpbmsgcmVsPSJob21lIiBocmVmPSIuLi9pbmRleC5odG1sIiB0aXRsZT0iWFNMIFRvb2xzIFVzZXIgRG9jdW1lbnRhdGlvbiI+PGxpbmsgcmVsPSJ1cCIgaHJlZj0iLi4vaW5kZXguaHRtbCIgdGl0bGU9IlhTTCBUb29scyBVc2VyIERvY3VtZW50YXRpb24iPjxsaW5rIHJlbD0icHJldiIgaHJlZj0iLi4vZ2VuZXJhbC9nZW5lcmFsLmh0bWwiIHRpdGxlPSJHZW5lcmFsIj48bGluayByZWw9Im5leHQiIGhyZWY9Ii4uL2xlZ2FsLmh0bWwiIHRpdGxlPSJOb3RpY2VzIj48L2hlYWQ+PGJvZHkgYmdjb2xvcj0id2hpdGUiIHRleHQ9ImJsYWNrIiBsaW5rPSIjMDAwMEZGIiB2bGluaz0iIzg0MDA4NCIgYWxpbms9IiMwMDAwRkYiPjxkaXYgY2xhc3M9ImNoYXB0ZXIiIGxhbmc9ImVuIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDIgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJOMTAzRDkiPjwvYT5YU0wgVG9vbGluZyBTYW1wbGVzPC9oMj48L2Rpdj48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJ0b2MiPjxwPjxiPlRhYmxlIG9mIENvbnRlbnRzPC9iPjwvcD48dWw+PGxpPjxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSJzYW1wbGVzLmh0bWwjRWNsaXBzZUhlbHAiPkVjbGlwc2UgSGVscDwvYT48L3NwYW4+PHVsPjxsaT48c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0ic2FtcGxlcy5odG1sI0RvY2Jvb2tFY2xpcHNlSGVscCI+Q3JlYXRpbmcgRWNsaXBzZSBIZWxwIHdpdGggRG9jYm9vayBhbmQgWFNMIFRvb2xzPC9hPjwvc3Bhbj48L2xpPjxsaT48c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0ic2FtcGxlcy5odG1sI0RJVEFFY2xpcHNlSGVscCI+Q3JlYXRpbmcgRWNsaXBzZSBIZWxwIHdpdGggRElUQSBhbmQgWFNMIFRvb2xzPC9hPjwvc3Bhbj48L2xpPjwvdWw+PC9saT48L3VsPjwvZGl2PjxwPlRoaXMgc2VjdGlvbiBjb250YWlucyBzZXZlcmFsIHNhbXBsZXMgYW5kIHJlZmVyZW5jZXMgdG8gc2FtcGxlIHByb2plY3RzLjwvcD48ZGl2IGNsYXNzPSJzZWN0aW9uIiBsYW5nPSJlbiI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgyIGNsYXNzPSJ0aXRsZSIgc3R5bGU9ImNsZWFyOiBib3RoIj48YSBuYW1lPSJFY2xpcHNlSGVscCI+PC9hPkVjbGlwc2UgSGVscDwvaDI+PC9kaXY+PC9kaXY+PC9kaXY+PHA+PC9wPjxkaXYgY2xhc3M9InNlY3Rpb24iIGxhbmc9ImVuIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDMgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJEb2Nib29rRWNsaXBzZUhlbHAiPjwvYT5DcmVhdGluZyBFY2xpcHNlIEhlbHAgd2l0aCBEb2Nib29rIGFuZCBYU0wgVG9vbHM8L2gzPjwvZGl2PjwvZGl2PjwvZGl2PjxwPgotCQkJCVRoaXMgdHV0b3JpYWwgYXNzdW1lcyB0aGF0IHlvdSBoYXZlIGtub3dsZWRnZSBvZiBEb2Nib29rLCBBTlQsIGFuZCB0aGUKLQkJCQlhYmlsaXR5IHRvIHNldHVwIEFOVCBidWlsZCBzY3JpcHRzLgotCQkJPC9wPjxwPgotCQkJCVRvIERvIHdyaXRlIHVwIHRoZSByZXN0IG9mIHRoZSB0dXRvcmlhbC4KLQkJCTwvcD48L2Rpdj48ZGl2IGNsYXNzPSJzZWN0aW9uIiBsYW5nPSJlbiI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgzIGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0iRElUQUVjbGlwc2VIZWxwIj48L2E+Q3JlYXRpbmcgRWNsaXBzZSBIZWxwIHdpdGggRElUQSBhbmQgWFNMIFRvb2xzPC9oMz48L2Rpdj48L2Rpdj48L2Rpdj48cD4KLQkJCQlUaGlzIHR1dG9yaWFsIGFzc3VtZXMgdGhhdCB5b3UgaGF2ZSBrbm93bGVkZ2Ugb2YgRElUQSwgQU5ULCBhbmQgdGhlCi0JCQkJYWJpbGl0eSB0byBzZXR1cCBBTlQgYnVpbGQgc2NyaXB0cy4KLQkJCTwvcD48cD4KLQkJCQlUbyBEbyB3cml0ZSB1cCB0aGUgcmVzdCBvZiB0aGUgdHV0b3JpYWwuCi0JCQk8L3A+PC9kaXY+PC9kaXY+PC9kaXY+PC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ExNWY4Mi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jUHJvcGVydGllcyBmaWxlIGZvciBvcmcuZWNsaXBzZS53c3QueHNsLmRvYwotdmVuZG9yTmFtZSA9IEVjbGlwc2Uub3JnCi1wbHVnaW5OYW1lID0gWFNMIFVzZXIgRG9jdW1lbnRhdGlvbiAoSW5jdWJhdGluZykKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL3BsdWdpbi54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNWE2MWUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08cGx1Z2luPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj4KLQkJPHRvYyBwcmltYXJ5PSJ0cnVlIiBmaWxlPSJ0b2MueG1sIj48L3RvYz4KLQk8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvdG9jLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5kb2MvdG9jLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI0YjIzMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL3RvYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi08dG9jIHRvcGljPSJodG1sL2luZGV4Lmh0bWwiIGxhYmVsPSJYU0wgVG9vbHMgVXNlciBEb2N1bWVudGF0aW9uIj48dG9waWMgaHJlZj0iaHRtbC9pbnRyb2R1Y3Rpb24vZ2V0dGluZ3N0YXJ0ZWQuaHRtbCIgbGFiZWw9IkdldHRpbmcgU3RhcnRlZCI+PC90b3BpYz48dG9waWMgaHJlZj0iaHRtbC9jb25jZXB0cy9jb25jZXB0cy5odG1sIiBsYWJlbD0iWFNMVCBDb25jZXB0cyI+PHRvcGljIGhyZWY9Imh0bWwvY29uY2VwdHMvY29uY2VwdHMuaHRtbCNSZXN1Y2luZ1hTTFQiIGxhYmVsPSJSZXNjdWluZyBYU0xUIEZyb20gTmljaGUgU3RhdHVzIj48dG9waWMgaHJlZj0iaHRtbC9jb25jZXB0cy9jb25jZXB0cy5odG1sI04xMDAzNCIgbGFiZWw9IlRoZSBQcm9ibGVtIj48L3RvcGljPjx0b3BpYyBocmVmPSJodG1sL2NvbmNlcHRzL2NvbmNlcHRzLmh0bWwjTjEwMDVBIiBsYWJlbD0iVGhlIFNvbHV0aW9uIj48L3RvcGljPjx0b3BpYyBocmVmPSJodG1sL2NvbmNlcHRzL2NvbmNlcHRzLmh0bWwjTjEwMDgxIiBsYWJlbD0iUXVlcmllcyI+PHRvcGljIGhyZWY9Imh0bWwvY29uY2VwdHMvY29uY2VwdHMuaHRtbCNOMTAwOEYiIGxhYmVsPSJ4c2w6Zm9yLWVhY2giPjwvdG9waWM+PHRvcGljIGhyZWY9Imh0bWwvY29uY2VwdHMvY29uY2VwdHMuaHRtbCNOMTAwOUIiIGxhYmVsPSJ4c2w6aWYiPjwvdG9waWM+PHRvcGljIGhyZWY9Imh0bWwvY29uY2VwdHMvY29uY2VwdHMuaHRtbCNOMTAwQTUiIGxhYmVsPSJ4c2w6Y2hvb3NlIj48L3RvcGljPjwvdG9waWM+PHRvcGljIGhyZWY9Imh0bWwvY29uY2VwdHMvY29uY2VwdHMuaHRtbCNOMTAwQUYiIGxhYmVsPSJDb25jbHVzaW9uIj48L3RvcGljPjwvdG9waWM+PHRvcGljIGhyZWY9Imh0bWwvY29uY2VwdHMvcmVzb3VyY2VzLmh0bWwiIGxhYmVsPSJSZXNvdXJjZXMiPjwvdG9waWM+PC90b3BpYz48dG9waWMgaHJlZj0iaHRtbC9lZGl0b3IveHNsZWRpdG9yLmh0bWwiIGxhYmVsPSJYU0wgRWRpdGluZyI+PHRvcGljIGhyZWY9Imh0bWwvZWRpdG9yL3hzbGVkaXRvci5odG1sI1ZhbGlkYXRpb24iIGxhYmVsPSJWYWxpZGF0aW9uIj48L3RvcGljPjx0b3BpYyBocmVmPSJodG1sL2VkaXRvci94c2xlZGl0b3JfY29udGVudGFzc2lzdC5odG1sIiBsYWJlbD0iQ29udGVudCBBc3Npc3QiPjx0b3BpYyBocmVmPSJodG1sL2VkaXRvci94c2xlZGl0b3JfY29udGVudGFzc2lzdC5odG1sI2VkX1hTTFByb3Bvc2FscyIgbGFiZWw9IlhTTFQgRWxlbWVudCBQcm9wb3NhbHMiPjwvdG9waWM+PHRvcGljIGhyZWY9Imh0bWwvZWRpdG9yL3hzbGVkaXRvcl9jb250ZW50YXNzaXN0X3NlbGVjdHRlc3QuaHRtbCIgbGFiZWw9IlNlbGVjdCwgVGVzdCwgYW5kIE1hdGNoIEF0dHJpYnV0ZXMiPjwvdG9waWM+PHRvcGljIGhyZWY9Imh0bWwvZWRpdG9yL3hzbGVkaXRvcl9jb250ZW50YXNzaXN0X2V4Y2x1ZGUuaHRtbCIgbGFiZWw9IkV4Y2x1ZGUtUmVzdWx0LVByZWZpeGVzIj48L3RvcGljPjx0b3BpYyBocmVmPSJodG1sL2VkaXRvci94c2xlZGl0b3JfY29udGVudGFzc2lzdF9tb2RlYXNzaXN0Lmh0bWwiIGxhYmVsPSJNb2RlIGF0dHJpYnV0ZSBhc3Npc3RhbmNlIj48L3RvcGljPjx0b3BpYyBocmVmPSJodG1sL2VkaXRvci94c2xlZGl0b3JfY29udGVudGFzc2lzdF9uYW1lZHRlbXBsYXRlLmh0bWwiIGxhYmVsPSJOYW1lZCBUZW1wbGF0ZSBBc3Npc3RhbmNlIj48L3RvcGljPjx0b3BpYyBocmVmPSJodG1sL2VkaXRvci94c2xlZGl0b3JfY29udGVudGFzc2lzdF9jYWxsdGVtcGxhdGUuaHRtbCIgbGFiZWw9IkNhbGwtVGVtcGxhdGUgQXNzaXN0YW5jZSI+PC90b3BpYz48dG9waWMgaHJlZj0iaHRtbC9lZGl0b3IveHNsZWRpdG9yX2NvbnRlbnRhc3Npc3RfaW5jbHVkZS5odG1sIiBsYWJlbD0iSW5jbHVkZSBhbmQgSW1wb3J0IGhyZWYgQXNzaXN0YW5jZSI+PC90b3BpYz48L3RvcGljPjx0b3BpYyBocmVmPSJodG1sL2VkaXRvci94c2xlZGl0b3JfdGVtcGxhdGVzLmh0bWwiIGxhYmVsPSJUZW1wbGF0ZXMiPjx0b3BpYyBocmVmPSJodG1sL2VkaXRvci94c2xlZGl0b3JfdGVtcGxhdGVzLmh0bWwjTjEwMUQzIiBsYWJlbD0iWFBhdGggVGVtcGxhdGVzIj48L3RvcGljPjwvdG9waWM+PHRvcGljIGhyZWY9Imh0bWwvZWRpdG9yL3hzbGVkaXRvcl9jb2xvcmluZy5odG1sIiBsYWJlbD0iWFNMVCBTeW50YXggQ29sb3JpbmciPjwvdG9waWM+PHRvcGljIGhyZWY9Imh0bWwvZWRpdG9yL3hzbGVkaXRvcl9tYXJrZXJzLmh0bWwiIGxhYmVsPSJYU0xUIE1hcmtlcnMgYW5kIEFubm90YXRpb25zIj48dG9waWMgaHJlZj0iaHRtbC9lZGl0b3IveHNsZWRpdG9yX21hcmtlcnMuaHRtbCN4c2x0T3ZlclJpZGUiIGxhYmVsPSJUZW1wbGF0ZSBPdmVycmlkZSI+PC90b3BpYz48L3RvcGljPjx0b3BpYyBocmVmPSJodG1sL2VkaXRvci94c2xlZGl0b3JfZGVidWdnaW5nLmh0bWwiIGxhYmVsPSJYU0wgRGVidWdnaW5nIj48L3RvcGljPjx0b3BpYyBocmVmPSJodG1sL2VkaXRvci94c2xlZGl0b3JfZGVidWdnaW5nLmh0bWwiIGxhYmVsPSJOYXZpZ2F0aW9uIj48L3RvcGljPjwvdG9waWM+PHRvcGljIGhyZWY9Imh0bWwvbGF1bmNoaW5nL2xhdW5jaGluZy5odG1sIiBsYWJlbD0iWFNMIExhdW5jaGluZyBhbmQgRGVidWdnaW5nIj48dG9waWMgaHJlZj0iaHRtbC9sYXVuY2hpbmcvbGF1bmNoaW5nLmh0bWwjWFNMTGF1bmNoIiBsYWJlbD0iWFNMIExhdW5jaGluZyI+PC90b3BpYz48dG9waWMgaHJlZj0iaHRtbC9sYXVuY2hpbmcvZGVidWdnaW5nLmh0bWwiIGxhYmVsPSJYU0xUIERlYnVnZ2luZyI+PHRvcGljIGhyZWY9Imh0bWwvbGF1bmNoaW5nL2RlYnVnZ2luZy5odG1sI0RlYnVnR2V0dGluZ1N0YXJ0ZWQiIGxhYmVsPSJTdGFydGluZyBhIERlYnVnIFNlc3Npb24iPjwvdG9waWM+PHRvcGljIGhyZWY9Imh0bWwvbGF1bmNoaW5nL2RlYnVnZ2luZ19jb21tb24uaHRtbCIgbGFiZWw9IkNvbW1vbiBEZWJ1Z2dpbmcgT3BlcmF0aW9ucyI+PHRvcGljIGhyZWY9Imh0bWwvbGF1bmNoaW5nL2RlYnVnZ2luZ19jb21tb24uaHRtbCNYU0xEZWJ1Z1Jlc3VsdFZpZXciIGxhYmVsPSJSZXN1bHQgVmlldyI+PC90b3BpYz48dG9waWMgaHJlZj0iaHRtbC9sYXVuY2hpbmcvZGVidWdnaW5nX3ZhcmlhYmxlc3ZpZXcuaHRtbCIgbGFiZWw9IlZhcmlhYmxlcyBWaWV3Ij48L3RvcGljPjwvdG9waWM+PHRvcGljIGhyZWY9Imh0bWwvbGF1bmNoaW5nL2RlYnVnZ2luZ19wcm9jZXNzb3JzLmh0bWwiIGxhYmVsPSJYU0xUIFByb2Nlc3NvciBTcGVjaWZpYyBTdXBwb3J0Ij48dG9waWMgaHJlZj0iaHRtbC9sYXVuY2hpbmcvZGVidWdnaW5nX3Byb2Nlc3NvcnMuaHRtbCNYU0xEZWJ1Z1hhbGFuIiBsYWJlbD0iWFNMIERlYnVnZ2luZyB3aXRoIFhhbGFuIj48L3RvcGljPjwvdG9waWM+PC90b3BpYz48L3RvcGljPjx0b3BpYyBocmVmPSJodG1sL3ByZWZlcmVuY2VzL3hzbHByZWZlcmVuY2VzLmh0bWwiIGxhYmVsPSJYU0wgVG9vbHMgUHJlZmVyZW5jZXMiPjx0b3BpYyBocmVmPSJodG1sL3ByZWZlcmVuY2VzL3hzbHByZWZlcmVuY2VzLmh0bWwjWFNMRmVhdHVyZXMiIGxhYmVsPSJGZWF0dXJlcyI+PC90b3BpYz48dG9waWMgaHJlZj0iaHRtbC9wcmVmZXJlbmNlcy94c2xwcm9jZXNzb3JzLmh0bWwiIGxhYmVsPSJJbnN0YWxsZWQgUHJvY2Vzc29ycyI+PC90b3BpYz48dG9waWMgaHJlZj0iaHRtbC9wcmVmZXJlbmNlcy94c2xvdXRwdXRwcm9wZXJ0aWVzLmh0bWwiIGxhYmVsPSJPdXRwdXQgUHJvcGVydGllcyI+PC90b3BpYz48dG9waWMgaHJlZj0iaHRtbC9wcmVmZXJlbmNlcy94cGF0aHRlbXBsYXRlcy5odG1sIiBsYWJlbD0iWFBhdGggVGVtcGxhdGVzIj48dG9waWMgaHJlZj0iaHRtbC9wcmVmZXJlbmNlcy94cGF0aHRlbXBsYXRlcy5odG1sI1hQYXRoVGVtcGxhdGVOZXciIGxhYmVsPSJDcmVhdGluZyBOZXcgVGVtcGxhdGVzIj48L3RvcGljPjx0b3BpYyBocmVmPSJodG1sL3ByZWZlcmVuY2VzL3hwYXRoaW1wb3J0Lmh0bWwiIGxhYmVsPSJJbXBvcnQgWFBhdGggVGVtcGxhdGVzIj48L3RvcGljPjx0b3BpYyBocmVmPSJodG1sL3ByZWZlcmVuY2VzL3hwYXRoZXhwb3J0Lmh0bWwiIGxhYmVsPSJJbXBvcnQgWFBhdGggVGVtcGxhdGVzIj48L3RvcGljPjwvdG9waWM+PHRvcGljIGhyZWY9Imh0bWwvcHJlZmVyZW5jZXMvdmFsaWRhdGlvbi5odG1sIiBsYWJlbD0iUHJvamVjdCBWYWxpZGF0aW9uIFByZWZlcmVuY2VzIj48L3RvcGljPjx0b3BpYyBocmVmPSJodG1sL3ByZWZlcmVuY2VzL3N5bnRheENvbG9yaW5nLmh0bWwiIGxhYmVsPSJYU0xUIFN5bnRheCBDb2xvcmluZyI+PC90b3BpYz48L3RvcGljPjx0b3BpYyBocmVmPSJodG1sL2dlbmVyYWwvZ2VuZXJhbC5odG1sIiBsYWJlbD0iR2VuZXJhbCI+PHRvcGljIGhyZWY9Imh0bWwvZ2VuZXJhbC9nZW5lcmFsLmh0bWwjWEluY2x1ZGUiIGxhYmVsPSJYSW5jbHVkZSI+PC90b3BpYz48L3RvcGljPjx0b3BpYyBocmVmPSJodG1sL3NhbXBsZXMvc2FtcGxlcy5odG1sIiBsYWJlbD0iWFNMIFRvb2xpbmcgU2FtcGxlcyI+PHRvcGljIGhyZWY9Imh0bWwvc2FtcGxlcy9zYW1wbGVzLmh0bWwjRWNsaXBzZUhlbHAiIGxhYmVsPSJFY2xpcHNlIEhlbHAiPjx0b3BpYyBocmVmPSJodG1sL3NhbXBsZXMvc2FtcGxlcy5odG1sI0RvY2Jvb2tFY2xpcHNlSGVscCIgbGFiZWw9IkNyZWF0aW5nIEVjbGlwc2UgSGVscCB3aXRoIERvY2Jvb2sgYW5kIFhTTCBUb29scyI+PC90b3BpYz48dG9waWMgaHJlZj0iaHRtbC9zYW1wbGVzL3NhbXBsZXMuaHRtbCNESVRBRWNsaXBzZUhlbHAiIGxhYmVsPSJDcmVhdGluZyBFY2xpcHNlIEhlbHAgd2l0aCBESVRBIGFuZCBYU0wgVG9vbHMiPjwvdG9waWM+PC90b3BpYz48L3RvcGljPjx0b3BpYyBocmVmPSJodG1sL2xlZ2FsLmh0bWwiIGxhYmVsPSJOb3RpY2VzIj48L3RvcGljPjwvdG9jPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi8uY2xhc3NwYXRoIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0YzVlMzEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uLy5wcm9qZWN0IGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmRmMjlkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC54c2wuc2RrLmRvY3VtZW50YXRpb248L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRpb25idWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMzZlZDMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1NhdCBKdW4gMjEgMTg6MjI6MzAgR01ULTA1OjAwIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24ucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3OTE1M2IuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSNTYXQgQXVnIDAyIDA4OjQ1OjM5IEdNVC0wNTowMCAyMDA4Ci1ERUxFR0FURVNfUFJFRkVSRU5DRT1kZWxlZ2F0ZVZhbGlkYXRvckxpc3QKLVVTRVJfQlVJTERfUFJFRkVSRU5DRT1lbmFibGVkQnVpbGRWYWxpZGF0b3JMaXN0Ci1VU0VSX01BTlVBTF9QUkVGRVJFTkNFPWVuYWJsZWRNYW51YWxWYWxpZGF0b3JMaXN0Ci1VU0VSX1BSRUZFUkVOQ0U9b3ZlcnJpZGVHbG9iYWxQcmVmZXJlbmNlc3RydWVkaXNhYmxlQWxsVmFsaWRhdGlvbmZhbHNldmVyc2lvbjEuMi4wLnYyMDA4MDYwNTE0MDIKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vdmVycmlkZT10cnVlCi1zdXNwZW5kPWZhbHNlCi12YWxzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5KU1BCYXRjaFZhbGlkYXRvci9nbG9iYWw9RkYwMQotdmFscy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuSlNQQ29udGVudFZhbGlkYXRvci9nbG9iYWw9RkYwMQotdmFscy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZHRkRFREVmFsaWRhdG9yL2dsb2JhbD1GRjAxCi12YWxzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLkhUTUxWYWxpZGF0b3IvZ2xvYmFsPUZGMDEKLXZhbHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi53c2RsL2dsb2JhbD1GRjAyMTU4b3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5lY2xpcHNlLlZhbGlkYXRvcgotdmFscy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueG1sL2dsb2JhbD1UVDAzCi12YWxzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS54c2QvZ2xvYmFsPUZGMDIxNjJvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lY2xpcHNlLlZhbGlkYXRvcgotdmFscy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUueHNsL2dsb2JhbD1UVDAyCi12Zi52ZXJzaW9uPTMKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMxYTI2OC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuc2RrLmRvY3VtZW50YXRpb24vTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbjsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uLkFjdGl2YXRvcgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5oZWxwCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uL2Fib3V0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuc2RrLmRvY3VtZW50YXRpb24vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuc2RrLmRvY3VtZW50YXRpb24vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uL2J1aWxkLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuc2RrLmRvY3VtZW50YXRpb24vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNjZmM5Ni4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuc2RrLmRvY3VtZW50YXRpb24vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGJ1aWxkLnhtbCxcCi0gICAgICAgICAgICAgICB0b2MueG1sLFwKLSAgICAgICAgICAgICAgIGRvYy9odG1sLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGJpbi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgdG9jRXh0ZW5zaW9uLnhtbApkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uL2J1aWxkLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNTNiYWMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCi0gICAgIEp1bCAyMSwgMjAwOCA2OjQ2OjAyIFBNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICBTREsgRG9jdW1lbnRhdGlvbiAgICAKLSAgICAgQnVpbGRzIFNESyBUT0MgRG9jdW1lbnRhdGlvbiB1c2luZyBKRUxEb2NsZXQuCi0gICAgICAgICAgICAgICAgICAgCi0gICAgIGRjYXJ2ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08cHJvamVjdCBuYW1lPSJTREsgRG9jdW1lbnRhdGlvbiIgZGVmYXVsdD0iZGVmYXVsdCI+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgQnVpbGRzIFNESyBUT0MgRG9jdW1lbnRhdGlvbiB1c2luZyBKRUxEb2NsZXQuCi0gICAgPC9kZXNjcmlwdGlvbj4KLQkKLQk8cHJvcGVydHkgbmFtZT0id29ya3NwYWNlIiBsb2NhdGlvbj0iLiIvPgotCTxwcm9wZXJ0eSBuYW1lPSJ3b3Jrc3BhY2Vsb2MiIGxvY2F0aW9uPSIuLiIvPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCi0gICAgICAgICAgdGFyZ2V0OiBkZWZhdWx0ICAgICAgICAgICAgICAKLSAgICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8dGFyZ2V0IG5hbWU9ImRlZmF1bHQiIGRlc2NyaXB0aW9uPSJCdWlsZHMgU0RLIFRPQyBEb2N1bWVudGF0aW9uIHVzaW5nIEpFTERvY2xldC4iPgotCi0gIAkgIDxqYXZhZG9jIGRlc3RkaXI9ImRvYyIgcGFja2FnZT0idHJ1ZSIgZG9jbGV0cGF0aD0iJHt3b3Jrc3BhY2V9L2xpYi9qZWxkb2NsZXQuamFyIj4KLSAgCSAgCSA8ZmlsZXNldCBkaXI9IiR7d29ya3NwYWNlbG9jfSI+Ci0JICAJIAk8aW5jbHVkZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS8qLmphdmEiLz4KLQkgIAkgCTxpbmNsdWRlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL3Jlc29sdmVyLyouamF2YSIvPgotICAJICAJIAk8aW5jbHVkZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcvc3JjLWRlYnVnZ2VyL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9kZWJ1Zy9kZWJ1Z2dlci8qLmphdmEiLz4KLSAgCSAgCSAJPGluY2x1ZGUgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmRlYnVnL3NyYy1pbnZva2VyL29yZy9lY2xpcHNlL3dzdC94c2wvamF4cC9kZWJ1Zy9pbnZva2VyLyouamF2YSIvPgotICAJICAJIAk8aW5jbHVkZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuL3NyYy1kZWJ1Z2dlci9vcmcvZWNsaXBzZS93c3QveHNsL3hhbGFuL2RlYnVnZ2VyLyouamF2YSIvPgotICAJICAJIAk8aW5jbHVkZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwveHBhdGgvY29yZS8qLmphdmEiLz4KLSAgCSAgCSAJPGluY2x1ZGUgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3hwYXRoL2NvcmUvdXRpbC8qLmphdmEiLz4KLSAgCSAgCSAJPGluY2x1ZGUgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aS9zcmMteHBhdGgvb3JnL2VjbGlwc2Uvd3N0L3htbC94cGF0aC91aS8qLmphdmEiLz4KLSAgCSAgCSAJPGluY2x1ZGUgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aS9zcmMteHBhdGgvb3JnL2VjbGlwc2Uvd3N0L3htbC94cGF0aC91aS92aWV3cy8qLmphdmEiLz4KLSAgCSAgCSA8L2ZpbGVzZXQ+Ci0gIAkgICAgIDxkb2NsZXQgbmFtZT0iY29tLmplbGRvY2xldC5KRUxEb2NsZXQiLz4KLSAgCSAgPC9qYXZhZG9jPgotICAgIAkKLSAgICAgPHhzbHQgYmFzZWRpcj0iLiIgc3R5bGU9ImRvYy9qZWx0b2h0bWwueHNsIiBpbj0iZG9jL2plbC54bWwiIG91dD0iZG9jL2h0bWwvZGVsZXRlbWUuaHRtbCI+Ci0gIAkJPGZhY3RvcnkgbmFtZT0ib3JnLmFwYWNoZS54YWxhbi5wcm9jZXNzb3IuVHJhbnNmb3JtZXJGYWN0b3J5SW1wbCI+Ci0gIAkJCTxhdHRyaWJ1dGUgbmFtZT0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hhbGFuL2ZlYXR1cmVzL29wdGltaXplIiB2YWx1ZT0idHJ1ZSIvPgotICAJCQkKLSAgCQk8L2ZhY3Rvcnk+Ci0gICAgIDwveHNsdD4KLSAgICAJCi0gICAgCQotICAgICA8eHNsdCBzdHlsZT0iZG9jL2plbHRvdG9jLnhzbCIgaW49ImRvYy9qZWwueG1sIiBvdXQ9InRvYy54bWwiIGRlc3RkaXI9Ii4iPgotICAJCTxmYWN0b3J5IG5hbWU9Im9yZy5hcGFjaGUueGFsYW4ucHJvY2Vzc29yLlRyYW5zZm9ybWVyRmFjdG9yeUltcGwiPgotICAJCQk8YXR0cmlidXRlIG5hbWU9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94YWxhbi9mZWF0dXJlcy9vcHRpbWl6ZSIgdmFsdWU9InRydWUiLz4KLSAgCQk8L2ZhY3Rvcnk+Ci0gICAgIAk8cGFyYW0gbmFtZT0ic2RrbmFtZSIgZXhwcmVzc2lvbj0iWFNMIFRvb2xzIFNESyBEb2N1bWVudGF0aW9uIi8+Ci0gICAgIDwveHNsdD4KLSAgICAJCi0gICAgPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJEb2NDaGVjayI+Ci0JICAJICA8amF2YWRvYyBkZXN0ZGlyPSJkb2MvZG9jY2hlY2siIHBhY2thZ2U9InRydWUiIGRvY2xldHBhdGg9IiR7d29ya3NwYWNlfS9saWIvZG9jY2hlY2suamFyIj4KLQkgIAkgIAkgPGZpbGVzZXQgZGlyPSIke3dvcmtzcGFjZWxvY30iPgotCSAgCSAgCSAJPGluY2x1ZGUgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLyoqLyouamF2YSIvPgotCSAgCSAgCSAJPGluY2x1ZGUgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy8qKi8qLmphdmEiLz4KLQkgIAkgIAkgCTxpbmNsdWRlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvKiovKi5qYXZhIi8+Ci0JICAJICAJIAk8aW5jbHVkZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy8qKi8qLmphdmEiLz4KLQkgIAkgIAkgCTxpbmNsdWRlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC54c2wuc2F4b24vKiovKi5qYXZhIi8+Ci0JICAJICAJIAk8aW5jbHVkZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QueHNsLnVpLyoqLyouamF2YSIvPgotCSAgCSAgCSAJPGluY2x1ZGUgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi9zcmMtZGVidWdnZXIvKiovKi5qYXZhIi8+Ci0JICAJICAJIAk8aW5jbHVkZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLmNvcmUvc3JjLyoqLyouamF2YSIvPgotCSAgCSAgCSAJPGluY2x1ZGUgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aS8qKi8qLmphdmEiLz4KLQkgIAkgIAkgPC9maWxlc2V0PgotCSAgCSAgICAgPGRvY2xldCBuYW1lPSJjb20uc3VuLnRvb2xzLmRvY2xldHMuZG9jY2hlY2suRG9jQ2hlY2siPgotCSAgCSAgICAgCTxwYXJhbSBuYW1lPSItZXhlY0RlcHRoIiB2YWx1ZT0iMiIvPgotCSAgCSAgCSA8L2RvY2xldD4KLQkgIAkgIDwvamF2YWRvYz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9IkV4dGVuc2lvblBvaW50RG9jIj4KLQkJPHBkZS5jb252ZXJ0U2NoZW1hVG9IVE1MIG1hbmlmZXN0PSIuLi9vcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nL3BsdWdpbi54bWwiCi0JCQkgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbj0iJHt3b3Jrc3BhY2V9L2RvYy9odG1sL2V4dGVuc2lvbl9wb2ludCIKLQkJLz4KLQk8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uL2RvYy8uY3ZzaWdub3JlIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uL2RvYy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjg3MjJlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi9kb2MvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDI5OSArMCwwIEBACi1kb2NjaGVjawotb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLnBhcnNlci5YU0xTb3VyY2VQYXJzZXIueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnByZWZlcmVuY2VzLk91dHB1dFByZWZlcmVuY2VQYWdlLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aS52aWV3cy5ET01WaWV3ZXJGaWx0ZXIueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwueHBhdGgucGFyc2VyLnhwYXRoUGFyc2VyLmFyZ3VtZW50X3JldHVybi54bWwKLW9yZy5lY2xpcHNlLndzdC54bWwueHBhdGgudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5YUGF0aFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3Nvci54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuTW9kZWxIYW5kbGVyRm9yWFNMLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLlhTTENvcmVQbHVnaW4ueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLlhTTFVJUGx1Z2luLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5wcmVmZXJlbmNlcy5JbnN0YWxsZWRQcm9jZXNzb3JzQmxvY2sueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZy5YU0xUU291cmNlTG9va3VwUGFydGljaXBhbnQueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZy5yZWdpc3RyeS5EZWJ1Z2dlclJlZ2lzdHJ5LnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLm1vZGVsLlhTTEF0dHJpYnV0ZS54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5vdXRwdXQuTWVzc2FnZXMueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMubWFpbi5QYXJhbWV0ZXJWaWV3ZXIueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMucHJvY2Vzc29yLkluc3RhbGxTdGFuZGluLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLnhwYXRoLnBhcnNlci54cGF0aFBhcnNlci52YXJpYWJsZV9yZWZlcmVuY2VfcmV0dXJuLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5YU0xNb2RlbExvYWRlci54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwuYWN0aW9ucy5OZXdXaXphcmRBY3Rpb24ueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLm1vZGVsLlhTTE1vZGVsUHJlc2VudGF0aW9uLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLnJlc29sdmVyLlhTTFZlcnNpb25IYW5kbGVyLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmcuRGVidWdnZXJEZXNjcmlwdG9yLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmcuWFNMVFNvdXJjZUxvb2t1cERpcmVjdG9yLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLmVuY29kaW5nLlhTTERvY3VtZW50TG9hZGVyLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLnRleHQuSVhTTFBhcnRpdGlvbnMueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLmFjdGlvbnMuQWRkUGFyYW1ldGVyQWN0aW9uLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5hY3Rpb25zLlJlbW92ZUFjdGlvbi54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC51dGlsLlN0cnVjdHVyZWREb2N1bWVudFV0aWwueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMuZm9ybWF0dGVyLk1lc3NhZ2VzLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLmZvcm1hdHRlci5GT0Zvcm1hdHRlclRhYi54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5YU0xDb250ZW50QXNzaXN0UHJvY2Vzc29yLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC53aXphcmRzLk5ld1hTTEZpbGVXaXphcmRQYWdlLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC53aXphcmRzLk5ld1hTTEZpbGVUZW1wbGF0ZXNXaXphcmRQYWdlLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLnhwYXRoLnBhcnNlci54cGF0aFBhcnNlci5yZWxhdGl2ZV9sb2NhdGlvbl9wYXRoX3JldHVybi54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5mb3JtYXR0ZXIuWFNMRk9Db21ib0Jsb2NrLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5zdHlsZS5MaW5lU3R5bGVQcm92aWRlckZvclhTTC54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLklQcm9jZXNzb3JUeXBlLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLm1haW4uWFNMTWFpblRhYi54bWwKLW9yZy5lY2xpcHNlLndzdC54bWwueHBhdGgudWkudmlld3MuWFBhdGhOYXZpZ2F0b3IuRWRpdG9yUmVmZXJlbmNlTGFiZWxQcm92aWRlci54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9ucy5YUGF0aFNlcGFyYXRvclJlZ2lvbi54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLlhTTFZhbGlkYXRvci54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5tYWluLk1lc3NhZ2VzLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmcucmVnaXN0cnkuSW52b2tlclJlZ2lzdHJ5UmVhZGVyLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnZva2VyLmNvbmZpZy5UeXBlZFZhbHVlLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLlhTTENvcmUueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLmRlYnVnZ2VyLlhhbGFuUm9vdFN0eWxlRnJhbWUueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5NZXNzYWdlcy54bWwKLW9yZy5lY2xpcHNlLndzdC54bWwueHBhdGgudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuWFBhdGhUZW1wbGF0ZVByZWZlcmVuY2VQYWdlLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5lZGl0b3IuWFNMSHlwZXJsaW5rRGV0ZWN0b3IueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5tb2RlbC5NZXNzYWdlcy54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwudXRpbC5YU0xQbHVnaW5JbWFnZXMueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwueHBhdGgucGFyc2VyLnhwYXRoUGFyc2VyLnBhdGhfZXhwcl9yZXR1cm4ueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLmFjdGlvbnMuTmV3WE1MRmlsZVdpemFyZERlbGVnYXRlLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aS52aWV3cy5YUGF0aE5hdmlnYXRvci5SZWZyZXNoQWN0aW9uLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnZva2VyLk1lc3NhZ2VzLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmcuT3V0cHV0UHJvcGVydHlQcmVmZXJlbmNlcy54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuQWJzdHJhY3RYU0xQcmVmZXJlbmNlUGFnZS54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuaW52b2tlci5jb25maWcuTWVzc2FnZXMueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5YU0xQYXJzZXJSZWdpb25GYWN0b3J5LnhtbAotb3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC5pbnRlcm5hbC51aS52aWV3cy5KRmFjZU5vZGVMYWJlbFByb3ZpZGVyWFBhdGgueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLnByZWZlcmVuY2VzLlhTTFRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5tb2RlbC5YU0xEZWJ1Z0VsZW1lbnQueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZy5YU0xUTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5wcmVmZXJlbmNlcy5NZXNzYWdlcy54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC54cGF0aC5wYXJzZXIueHBhdGhQYXJzZXIudW5pb25fZXhwcl9yZXR1cm4ueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwueHBhdGgucGFyc2VyLnhwYXRoUGFyc2VyLmV4cHJfcmV0dXJuLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5hY3Rpb25zLk5ld1hTREZpbGVXaXphcmREZWxlZ2F0ZS54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nLnJlZ2lzdHJ5LlByb2Nlc3NvclR5cGVSZWdpc3RyeVJlYWRlci54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC54cGF0aC5wYXJzZXIueHBhdGhQYXJzZXIuZXF1YWxpdHlfZXhwcl9yZXR1cm4ueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwuYW50LlhJbmNsdWRlVGFzay54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkubW9kZWwuWFNMQnJlYWtwb2ludEFkYXB0ZXJGYWN0b3J5LnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLnByb2Nlc3Nvci5Qcm9jZXNzb3JEZXRhaWxzRGlhbG9nLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLnhwYXRoLnBhcnNlci54cGF0aFBhcnNlci5maWx0ZXJfZXhwcl9yZXR1cm4ueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLlhTTFVJQ29uc3RhbnRzLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy5pbnRlcm5hbC51dGlsLlhTTERlYnVnUGx1Z2luSW1hZ2VzLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkN1c3RvbVRlbXBsYXRlUHJvcG9zYWwueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZy5yZWdpc3RyeS5Qcm9jZXNzb3JSZWdpc3RyeVJlYWRlci54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuWFNMVFRhYkdyb3VwLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmcucmVnaXN0cnkuUHJvY2Vzc29yUmVnaXN0cnkueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLmFjdGlvbnMuQWRkV29ya3NwYWNlRmlsZUFjdGlvbi54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkucHJlZmVyZW5jZXMuRmVhdHVyZXNCbG9jay54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC5tb2RlbC5YU0xFbGVtZW50LnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLm1vZGVsLlN0eWxlc2hlZXRNb2RlbC54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC5tb2RlbC5JbXBvcnQueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLnByZWZlcmVuY2VzLk1haW5QcmVmZXJlbmNlUGFnZS54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC54cGF0aC5wYXJzZXIueHBhdGhQYXJzZXIuc3BlY2lhbF9zdGVwX3JldHVybi54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC54cGF0aC5wYXJzZXIueHBhdGhQYXJzZXIuYWJicl9heGlzX3NwZWNpZmllcl9yZXR1cm4ueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmludm9rZXIuVHJhbnNmb3JtYXRpb25FeGNlcHRpb24ueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLlhTTExhdW5jaFNob3J0Y3V0LnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5wcmVmZXJlbmNlcy5BZGRQcm9jZXNzb3JEaWFsb2cueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwueHBhdGgucGFyc2VyLlhQYXRoUGFyc2VyTGV4ZXIueG1sCi1vcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLmludGVybmFsLnVpLnZpZXdzLlhQYXRoQ29tcHV0ZXIueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwueHBhdGgucGFyc2VyLnhwYXRoUGFyc2VyLmZ1bmN0aW9uX2NhbGxfcmV0dXJuLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aS5pbnRlcm5hbC5YUGF0aFVJTWVzc2FnZXMueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLmRlYnVnZ2VyLlhhbGFuUHJpbnRUcmFjZUxpc3RlbmVyLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmcuVXRpbHMueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwubW9kZWwuSW5jbHVkZS54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC54cGF0aC5wYXJzZXIueHBhdGhQYXJzZXIuYWJzb2x1dGVfbG9jYXRpb25fcGF0aF9yZXR1cm4ueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5NYXhFcnJvcnNFeGNlZWRlZEV4Y2VwdGlvbi54bWwKLW9yZy5lY2xpcHNlLndzdC54bWwueHBhdGguaW50ZXJuYWwudWkudmlld3MuWFBhdGhWaWV3LnhtbAotb3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aS5YUGF0aFVJTWVzc2FnZXMueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMub3V0cHV0Lk91dHB1dEZpbGVCbG9jay54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nLlByb2Nlc3Nvckludm9rZXJEZXNjcmlwdG9yLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aS5pbnRlcm5hbC51dGlsLlhQYXRoUGx1Z2luSW1hZ2VIZWxwZXIueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5tb2RlbC5YU0xEZWJ1Z1RhcmdldC54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuaW52b2tlci5JUHJvY2Vzc29ySW52b2tlci54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC5tb2RlbC5WYXJpYWJsZS54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuQWJzdHJhY3RUYWJsZUJsb2NrLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLm1vZGVsLlN0eWxlc2hlZXQueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMucHJvY2Vzc29yLlByb2Nlc3Nvck1lc3NhZ2VzLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnZva2VyLmNvbmZpZy5QaXBlbGluZURlZmluaXRpb24ueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMubWFpbi5JUGFyYW1ldGVyc0NoYW5nZWRMaXN0ZW5lci54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5vdXRwdXQuT3V0cHV0VGFiLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnZva2VyLmNvbmZpZy5DcmVhdGlvbkV4Y2VwdGlvbi54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5wcm9jZXNzb3IuUHJvY2Vzc29yRGVzY3JpcHRvci54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuYWN0aW9ucy5NdWx0aXBsZUlucHV0RGlhbG9nLkZpZWxkU3VtbWFyeS54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nLnJlZ2lzdHJ5LkRlYnVnZ2VyUmVnaXN0cnlSZWFkZXIueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnByZWZlcmVuY2VzLlByb2Nlc3NvcnNQcmVmZXJlbmNlUGFnZS54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuWFNMRGVidWdVSVBsdWdpbi54bWwKLW9yZy5lY2xpcHNlLndzdC54bWwueHBhdGguaW50ZXJuYWwudWkudmlld3MuSkZhY2VOb2RlQ29udGVudFByb3ZpZGVyWFBhdGgueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLnZhbGlkYXRpb24uRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvckZvclhTTC54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwuYWN0aW9ucy5OZXdXU0RMRmlsZVdpemFyZERlbGVnYXRlLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aS5pbnRlcm5hbC51dGlsLlhQYXRoUGx1Z2luSW1hZ2VzLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLnhwYXRoLnBhcnNlci54cGF0aFBhcnNlci5saXRlcmFsX3JldHVybi54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5WYWxpZGF0aW9uUHJlZmVyZW5jZXMueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLmRlYnVnZ2VyLlhhbGFuVHJhY2VMaXN0ZW5lci54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwuYWN0aW9ucy5OZXdYU0xGaWxlV2l6YXJkRGVsZWdhdGUueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLmFjdGlvbnMuQWJzdHJhY3RTdHlsZXNoZWV0QWN0aW9uLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aS52aWV3cy5YUGF0aE5hdmlnYXRvci5YUGF0aEFjdGlvbi54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwuYWN0aW9ucy5OZXdEVERGaWxlV2l6YXJkRGVsZWdhdGUueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLmRvdWJsZWNsaWNrLlhTTERvdWJsZUNsaWNrU3RyYXRlZ3kueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwueHBhdGgucGFyc2VyLnhwYXRoUGFyc2VyLnJlbGF0aW9uYWxfZXhwcl9yZXR1cm4ueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5YU0xWYWxpZGF0aW9uTWVzc2FnZS54bWwKLW9yZy5lY2xpcHNlLndzdC54bWwueHBhdGgudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuWFBhdGhQcmVmZW5jZVBhZ2UueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lY2xpcHNlLlZhbGlkYXRvcjIueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5JUHJvY2Vzc29ySW5zdGFsbC54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5tYWluLk1haW5UYWJNZXNzYWdlcy54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC5tb2RlbC5YU0xOb2RlLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLm1haW4uU3R5bGVzaGVldExhYmVsUHJvdmlkZXIueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuTWVzc2FnZXMueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5jb25maWcuTGF1bmNoUHJvcGVydGllcy54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aS52aWV3cy5FZGl0TmFtZXNwYWNlUHJlZml4RGlhbG9nLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLnByb2Nlc3Nvci5KYXJMYWJlbFByb3ZpZGVyLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLm1haW4uUGFyYW1ldGVyc0NvbnRlbnRQcm92aWRlci54bWwKLWplbC54bWwKLW9yZy5lY2xpcHNlLndzdC54bWwueHBhdGguY29yZS5YUGF0aENvcmVQbHVnaW4ueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZy5QbHVnaW5Qcm9jZXNzb3JKYXIueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwueHBhdGgucGFyc2VyLnhwYXRoUGFyc2VyLnByaW1hcnlfZXhwcl9yZXR1cm4ueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZy5YU0xQcm9wZXJ0eVRlc3Rlci54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuUmVzb3VyY2VTZWxlY3Rpb25CbG9jay5XaWRnZXRMaXN0ZW5lci54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wueGFsYW4uZGVidWdnZXIuWGFsYW5WYXJpYWJsZS54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC54cGF0aC5wYXJzZXIueHBhdGhQYXJzZXIubnVtYmVyX3JldHVybi54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwudmFsaWRhdGlvbi5YU0xNYXJrdXBWYWxpZGF0b3IueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwueHBhdGgucGFyc2VyLnhwYXRoUGFyc2VyLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5icmVha3BvaW50Lk1lc3NhZ2VzLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3JGb3JYYWxhblhTTC54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5mb3JtYXR0ZXIuUmVuZGVyZXJUYWJNZXNzYWdlcy54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuWFNMQ29uc29sZUxpbmVUcmFja2VyLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuSVByb2Nlc3Nvckludm9rZXIueG1sCi1vcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLnVpLnZpZXdzLlhQYXRoTmF2aWdhdG9yLlNob3dJblNvdXJjZUFjdGlvbi54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuWFNMTGF1bmNoQ29uZmlndXJhdGlvblRhYi54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5mb3JtYXR0ZXIuUmVuZGVyZXJDb25maWd1cmF0aW9uQmxvY2sueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZy5yZWdpc3RyeS5NZXNzYWdlcy54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuZGVidWdnZXIuU3R5bGVGcmFtZS54bWwKLW9yZy5lY2xpcHNlLndzdC54bWwueHBhdGgudWkudmlld3MuWFBhdGhOYXZpZ2F0b3IueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMubWFpbi5JbnB1dEZpbGVCbG9jay54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuZGVidWdnZXIuSVhTTERlYnVnZ2VyLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuSUZlYXR1cmUueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLm1vZGVsLlhTTExpbmVCcmVha3BvaW50QWRhcHRlci54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuTWVzc2FnZXMueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZy5Qcm9jZXNzb3JQcmVmZXJlbmNlcy54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nLlByZWZlcmVuY2VJbml0aWFsaXplci54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuZGVidWdnZXIuRGVidWdSdW5uZXIueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwueHBhdGgucGFyc2VyLnhwYXRoUGFyc2VyLmlfcmVsYXRpdmVfbG9jYXRpb25fcGF0aF9yZXR1cm4ueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5jb25maWcuTWVzc2FnZXMueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwudXRpbC5GaWxlVXRpbC54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5wcm9jZXNzb3IuWFNMUHJvY2Vzc29yVGFiLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC5jb3JlLmludGVybmFsLnBhcnNlci5YUGF0aFBhcnNlci54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkucHJlZmVyZW5jZXMuUHJvY2Vzc29yTGlicmFyeUJsb2NrLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLm1vZGVsLlBhcmFtZXRlci54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5yZXNvbHZlci5VUklSZXNvbHZlckJsb2NrMi54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlSW5pdGlhbGl6ZXIueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLmRlYnVnZ2VyLlhhbGFuU3R5bGVGcmFtZS54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLm1vZGVsLlhTTExpbmVCcmVha3BvaW50LnhtbAotb3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZUlkc1hQYXRoLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLnJlc29sdmVyLk1lc3NhZ2VzLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmcucmVnaXN0cnkuQWJzdHJhY3RSZWdpc3RyeVJlYWRlci54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nLkxhdW5jaGluZ1BsdWdpbi54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwudGVtcGxhdGVzLlZlcnNpb25UZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXJYU0wueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwueHBhdGgucGFyc2VyLnhwYXRoUGFyc2VyLnhwYXRoX3JldHVybi54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5wcm9jZXNzb3IuRmVhdHVyZXNCbG9jay54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuaW52b2tlci5Db25maWd1cmF0aW9uRXhjZXB0aW9uLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5hY3Rpb25zLlJlbW92ZVBhcmFtZXRlckFjdGlvbi54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuYWN0aW9ucy5NdWx0aXBsZUlucHV0RGlhbG9nLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuTWVzc2FnZXMueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLndpemFyZHMuTmV3WFNMRmlsZVdpemFyZC54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLm1vZGVsLklYU0xEZWJ1Z1RhcmdldC54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC5NZXNzYWdlcy54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5tYWluLlRyYW5zZm9ybXNCbG9jay54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuaW52b2tlci5KQVhQU0FYUHJvY2Vzc29ySW52b2tlci54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nLk91dHB1dFByb3BlcnR5LnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuWFBhdGhSZWdpb25Db250ZXh0LnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5hY3Rpb25zLkNvbnRyb2xBY2Nlc3NpYmxlTGlzdGVuZXIueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLnV0aWwuWFNMUGx1Z2luSW1hZ2VIZWxwZXIueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5YU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmcuTWVzc2FnZXMueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnByZWZlcmVuY2VzLk91dHB1dEJsb2NrLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuY29uZmlnLkxhdW5jaFRyYW5zZm9ybS54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuZGVidWdnZXIuRGVidWdDb25zdGFudHMueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lY2xpcHNlLlZhbGlkYXRvci54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC54cGF0aC5wYXJzZXIueHBhdGhQYXJzZXIuYWJicl9zdGVwX3JldHVybi54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmNvbmZpZy5MYXVuY2hBdHRyaWJ1dGUueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwueHBhdGgucGFyc2VyLnhwYXRoUGFyc2VyLmxvY2F0aW9uX3BhdGhfcmV0dXJuLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aS52aWV3cy5YUGF0aE5hdmlnYXRvci5YTUxFZGl0b3JzQ29udGVudFByb3ZpZGVyLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLm1haW4uU3R5bGVzaGVldFZpZXdlci54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuZGVidWdnZXIuVmFyaWFibGUueG1sCi1vcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLmNvcmUudXRpbC5YU0xUWFBhdGhIZWxwZXIueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMucmVzb2x2ZXIuV29ya2luZ0RpcmVjdG9yeUJsb2NrLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLm1vZGVsLkNhbGxUZW1wbGF0ZS54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5yZXNvbHZlci5SZXNvbHZlckV4dGVuc2lvbi54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uWFNMLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLm1haW4uUGFyYW1ldGVyc0Jsb2NrLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aS5YUGF0aFZpZXdQbHVnaW4ueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZy5QcmVmZXJlbmNlVXRpbC54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLm1vZGVsLklYU0xDb25zdGFudHMueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5JRGVidWdnZXIueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMubWFpbi5QYXJhbWV0ZXJzTGFiZWxQcm92aWRlci54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC54cGF0aC5wYXJzZXIueHBhdGhQYXJzZXIubXVsdF9leHByX3JldHVybi54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nLkZlYXR1cmVQcmVmZXJlbmNlcy54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLklPdXRwdXRQcm9wZXJ0eS54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLm1vZGVsLlhTTFRocmVhZC54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wueGFsYW4uZGVidWdnZXIuWGFsYW5EZWJ1Z2dlci54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLlhTTFZhbGlkYXRpb25SZXBvcnQueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5jb25maWcuTGF1bmNoRmVhdHVyZXMueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnByZWZlcmVuY2VzLkZlYXR1cmVzUHJlZmVyZW5jZVBhZ2UueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMubWFpbi5JU3R5bGVzaGVldEVudHJpZXNDaGFuZ2VkTGlzdGVuZXIueG1sCi1vcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLnVpLnZpZXdzLkRPTU5vZGVMYWJlbFByb3ZpZGVyLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmcuUHJvY2Vzc29yVHlwZS54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwudmFsaWRhdGlvbi5YU0xFcnJvckxpc3RlbmVyLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLmFudC5NZXNzYWdlcy54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5yZXNvbHZlci5VUklSZXNvbHZlckJsb2NrLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5hY3Rpb25zLkFic3RyYWN0UGFyYW1ldGVyQWN0aW9uLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuY29uZmlnLkxhdW5jaEhlbHBlci54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwuZWRpdG9yLlNvdXJjZUZpbGVIeXBlcmxpbmsueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5tb2RlbC5YU0xWYXJpYWJsZS54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLm1vZGVsLlhTTFZhbHVlLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcubW9kZWwuWFNMU3RhY2tGcmFtZS54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC5tb2RlbC5UZW1wbGF0ZS54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkucHJlZmVyZW5jZXMuQmFzZVByZWZlcmVuY2VQYWdlLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLnhwYXRoLnBhcnNlci54cGF0aFBhcnNlci5wcmVkaWNhdGVfZXhwcl9yZXR1cm4ueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZy5yZWdpc3RyeS5Qcm9jZXNzb3JUeXBlUmVnaXN0cnkueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwueGluY2x1ZGUuWEluY2x1ZGVyLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aS52aWV3cy5ET01UcmVlQ29udGVudFByb3ZpZGVyLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLm91dHB1dC5PdXRwdXRQcm9wZXJ0aWVzQmxvY2sueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwueHBhdGgucGFyc2VyLnhwYXRoUGFyc2VyLnVuYXJ5X2V4cHJfcmV0dXJuLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmcucmVnaXN0cnkuSW52b2tlclJlZ2lzdHJ5LnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5hY3Rpb25zLk1vdmVVcEFjdGlvbi54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuaW52b2tlci5jb25maWcuVHJhbnNmb3JtRGVmaW5pdGlvbi54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVYU0wueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLmFjdGlvbnMuT3BlbkRpYWxvZ0FjdGlvbi54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC54cGF0aC5wYXJzZXIueHBhdGhQYXJzZXIuYWRkaXRpdmVfZXhwcl9yZXR1cm4ueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwueHBhdGgucGFyc2VyLnhwYXRoUGFyc2VyLnN0ZXBfcmV0dXJuLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLnhwYXRoLnBhcnNlci54cGF0aFBhcnNlci5hcmdfbGlzdF9yZXR1cm4ueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLmludGVybmFsLnV0aWwuWFNMUGx1Z2luSW1hZ2VIZWxwZXIueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLk1lc3NhZ2VzLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5wZXJzcGVjdGl2ZS5YTUxQZXJzcGVjdGl2ZUZhY3RvcnkueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLmhhbmRsZXJzLk9wZW5EZWNsYXJhdGlvbkhhbmRsZXIueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5jb25maWcuTGF1bmNoUGlwZWxpbmUueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLmFjdGlvbnMuQWRkRXh0ZXJuYWxGaWxlQWN0aW9uLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmcuUHJvY2Vzc29ySmFyLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuWFNMVFJ1bnRpbWUueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMubWFpbi5TdHlsZXNoZWV0Q29udGVudFByb3ZpZGVyLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLnRleHQucnVsZXMuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhTTC54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC54cGF0aC5wYXJzZXIueHBhdGhMZXhlci54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC5tb2RlbC5TdHlsZXNoZWV0QnVpbGRlci54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuUmVzb3VyY2VTZWxlY3Rpb25CbG9jay54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5wcm9jZXNzb3IuSmFyQ29udGVudFByb3ZpZGVyLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Z2dlci5BYnN0cmFjdERlYnVnZ2VyLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5hY3Rpb25zLkFjdGlvbk1lc3NhZ2VzLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmcuWFNMVFNvdXJjZVBhdGhDb21wdXRlckRlbGVnYXRlLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5icmVha3BvaW50LlhTTEJyZWFrcG9pbnRQcm92aWRlci54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuYWN0aW9ucy5Nb3ZlRG93bkFjdGlvbi54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5wcm9jZXNzb3IuUHJvY2Vzc29yQmxvY2sueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMucHJvY2Vzc29yLk1lc3NhZ2VzLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC5pbnRlcm5hbC51aS52aWV3cy5NZXNzYWdlcy54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC54cGF0aC5wYXJzZXIueHBhdGhQYXJzZXIucHJlZGljYXRlX3JldHVybi54bWwKLW9yZy5lY2xpcHNlLndzdC54bWwueHBhdGguaW50ZXJuYWwudWkudmlld3MuWFBhdGhWaWV3QWN0aW9ucy54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuSVByb2Nlc3Nvckphci54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC54cGF0aC5wYXJzZXIueHBhdGhQYXJzZXIub3JfZXhwcl9yZXR1cm4ueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLmFjdGlvbnMuTXVsdGlwbGVJbnB1dERpYWxvZy5WYWxpZGF0b3IueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwueHBhdGgucGFyc2VyLnhwYXRoUGFyc2VyLmF4aXNfcmV0dXJuLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5YU0xEZWJ1Z1VJQ29uc3RhbnRzLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmcuRmVhdHVyZS54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuZGVidWdnZXIuQnJlYWtQb2ludC54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLlByb2Nlc3Nvckluc3RhbGwueG1sCi1vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwueHBhdGgucGFyc2VyLnhwYXRoUGFyc2VyLmFuZF9leHByX3JldHVybi54bWwKLW9yZy5lY2xpcHNlLndzdC54c2wuaW52b2tlci5NYWluLnhtbApkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uL2RvYy9odG1sLy5jdnNpZ25vcmUgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuc2RrLmRvY3VtZW50YXRpb24vZG9jL2h0bWwvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc1YTJhNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuc2RrLmRvY3VtZW50YXRpb24vZG9jL2h0bWwvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWRlbGV0ZW1lLmh0bWwKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi9kb2MvaHRtbC9leHRlbnNpb25fcG9pbnQvb3JnX2VjbGlwc2Vfd3N0X3hzbF9qYXhwX2xhdW5jaGluZ19kZWJ1Z2dlci5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uL2RvYy9odG1sL2V4dGVuc2lvbl9wb2ludC9vcmdfZWNsaXBzZV93c3RfeHNsX2pheHBfbGF1bmNoaW5nX2RlYnVnZ2VyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NWM4YzIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uL2RvYy9odG1sL2V4dGVuc2lvbl9wb2ludC9vcmdfZWNsaXBzZV93c3RfeHNsX2pheHBfbGF1bmNoaW5nX2RlYnVnZ2VyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPEhUTUw+Ci08SEVBRD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5YU0xUIERlYnVnZ2VyPC90aXRsZT4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+QGltcG9ydCB1cmwoIi4uLy4uL2Jvb2suY3NzIik7PC9zdHlsZT4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+QGltcG9ydCB1cmwoIi4uLy4uL3NjaGVtYS5jc3MiKTs8L3N0eWxlPgotPC9IRUFEPgotPEJPRFk+Ci08SDEgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyIj5YU0xUIERlYnVnZ2VyPC9IMT4KLTxwPjwvcD4KLTxoNiBjbGFzcz0iQ2FwdGlvbkZpZ0NvbHVtbiBTY2hlbWFIZWFkZXIiPklkZW50aWZpZXI6IDwvaDY+b3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuamF4cC5kZWJ1Z2dlcjxwPjwvcD4KLTxoNiBjbGFzcz0iQ2FwdGlvbkZpZ0NvbHVtbiBTY2hlbWFIZWFkZXIiPkRlc2NyaXB0aW9uOiA8L2g2PkNvbnRyaWJ1dGUgYSBkZWJ1Z2dlciBmb3IgYSBwYXJ0aWN1bGFyIEpBWFAgcHJvY2Vzc29yIHR5cGUgKGUuZy4gU2F4b24pLiBUaGUgZXh0ZW5zaW9uIHBvaW50IHByaW1hcmlseSBkZWZpbmVzIHRoZSBjbGFzc3BhdGggYW5kIHRyYW5zZm9ybWVyIGZhY3RvcnkgdG8gYmUgdXNlZCB3aGVuIGRlYnVnZ2luZy48cD48L3A+Ci08aDYgY2xhc3M9IkNhcHRpb25GaWdDb2x1bW4gU2NoZW1hSGVhZGVyIj5Db25maWd1cmF0aW9uIE1hcmt1cDo8L2g2PgotPHA+PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUVMRU1FTlQgPGEgbmFtZT0iZS5leHRlbnNpb24iPmV4dGVuc2lvbjwvYT4gKDxhIGhyZWY9IiNlLmRlYnVnZ2VyIj5kZWJ1Z2dlcjwvYT4rKSZndDs8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshQVRUTElTVCBleHRlbnNpb248L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5wb2ludCZuYnNwO0NEQVRBICNSRVFVSVJFRDxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmlkJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q0RBVEEgI0lNUExJRUQ8cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5uYW1lJm5ic3A7Jm5ic3A7Q0RBVEEgI0lNUExJRUQmZ3Q7PC9wPgotPHA+PC9wPgotPHVsIGNsYXNzPSJDb25maWdNYXJrdXBBdHRsaXN0RGVzYyI+Ci08L3VsPgotPGJyPjxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUuZGVidWdnZXIiPmRlYnVnZ2VyPC9hPiBFTVBUWSZndDs8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshQVRUTElTVCBkZWJ1Z2dlcjwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmlkJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q0RBVEEgI1JFUVVJUkVEPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+bmFtZSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNSRVFVSVJFRDxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmNsYXNzcGF0aCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNSRVFVSVJFRDxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPnByb2Nlc3NvclR5cGVJZCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNSRVFVSVJFRDxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmNsYXNzTmFtZSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNSRVFVSVJFRDxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPnRyYW5zZm9ybWVyRmFjdG9yeUNsYXNzJm5ic3A7Q0RBVEEgI1JFUVVJUkVEJmd0OzwvcD4KLTxwPjwvcD4KLTxwIGNsYXNzPSJDb25maWdNYXJrdXBFbGVtZW50RGVzYyI+Ci1BIGRlYnVnZ2VyIGZvciBhIHByb2Nlc3NvciB0eXBlPC9wPgotPGJyPgotPHVsIGNsYXNzPSJDb25maWdNYXJrdXBBdHRsaXN0RGVzYyI+Ci08bGk+PGI+aWQ8L2I+IC0gQSB1bmlxdWUgaWQgZm9yIHRoaXMgZGVidWdnZXI8L2xpPgotPGxpPjxiPm5hbWU8L2I+IC0gQSBuYW1lIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgVUk8L2xpPgotPGxpPjxiPmNsYXNzcGF0aDwvYj4gLSBBICc7Jy1zZXBhcmF0ZWQgY2xhc3NwYXRoIHJlcXVpcmVkIHRvIHJ1biB0aGUgZGVidWdnZXIgKGluIGFkZGl0aW9uIHRvIHRoYXQgYWxyZWFkeSBhZGRlZCBieSB0aGUgcHJvY2Vzc29yIGl0c2VsZikuPC9saT4KLTxsaT48Yj5wcm9jZXNzb3JUeXBlSWQ8L2I+IC0gVGhlIHByb2Nlc3NvciB0eXBlIHRoYXQgdGhpcyBkZWJ1Z2dlciB3b3JrcyB3aXRoPC9saT4KLTxsaT48Yj5jbGFzc05hbWU8L2I+IC0gQSBmdWxseS1xdWFsaWZpZWQgY2xhc3MgdGhhdCBpbXBsZW1lbnQgdGhlIElYU0xEZWJ1Z2dlciBpbnRlcmZhY2UuIEl0IGlzIGVhc2llciB0byBleHRlbmQgQWJzdHJhY3RYU0xEZWJ1Z2dlci48L2xpPgotPGxpPjxiPnRyYW5zZm9ybWVyRmFjdG9yeUNsYXNzPC9iPiAtIFRoZSBmdWxseS1xdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgdHJhbnNmb3JtZXIgZmFjdG9yeSB0byB1c2UgZm9yIGRlYnVnZ2luZy4gVGhpcyBtdXN0IGJlIG9uZSBvZiB0aGUgdHJhbnNmb3JtZXIgZmFjdG9yaWVzIGJlbG9uZ2luZyB0byB0aGUgcHJvY2Vzc29yIHR5cGUuPC9saT4KLTwvdWw+Ci08YnI+PGg2IGNsYXNzPSJDYXB0aW9uRmlnQ29sdW1uIFNjaGVtYUhlYWRlciI+RXhhbXBsZXM6IDwvaDY+PHByZSBjbGFzcz0iRXhhbXBsZSI+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hVGFnIj4KLSAgICZsdDtleHRlbnNpb24KLSAgICAgICAgIHBvaW50PTwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFDc3RyaW5nIj4mcXVvdDtvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLmRlYnVnZ2VyJnF1b3Q7PC9zcGFuPjxzcGFuIGNsYXNzPSJjb2RlIFNjaGVtYVRhZyI+Jmd0OwotICAgICAgJmx0O2RlYnVnZ2VyCi0gICAgICAgICAgICBjbGFzc05hbWU9PC9zcGFuPjxzcGFuIGNsYXNzPSJjb2RlIFNjaGVtYUNzdHJpbmciPiZxdW90O29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4uZGVidWdnZXIuWGFsYW5EZWJ1Z2dlciZxdW90Ozwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFUYWciPgotICAgICAgICAgICAgY2xhc3NwYXRoPTwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFDc3RyaW5nIj4mcXVvdDske2VjbGlwc2Vfb3JiaXQ6b3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbn0mcXVvdDs8L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hVGFnIj4KLSAgICAgICAgICAgIGlkPTwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFDc3RyaW5nIj4mcXVvdDtvcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLmRlYnVnZ2VyJnF1b3Q7PC9zcGFuPjxzcGFuIGNsYXNzPSJjb2RlIFNjaGVtYVRhZyI+Ci0gICAgICAgICAgICBuYW1lPTwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFDc3RyaW5nIj4mcXVvdDtYYWxhbiAyLjUuMSBvciBncmVhdGVyJnF1b3Q7PC9zcGFuPjxzcGFuIGNsYXNzPSJjb2RlIFNjaGVtYVRhZyI+Ci0gICAgICAgICAgICBwcm9jZXNzb3JUeXBlSWQ9PC9zcGFuPjxzcGFuIGNsYXNzPSJjb2RlIFNjaGVtYUNzdHJpbmciPiZxdW90O29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4ucHJvY2Vzc29yVHlwZSZxdW90Ozwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFUYWciPgotICAgICAgICAgICAgdHJhbnNmb3JtZXJGYWN0b3J5Q2xhc3M9PC9zcGFuPjxzcGFuIGNsYXNzPSJjb2RlIFNjaGVtYUNzdHJpbmciPiZxdW90O29yZy5hcGFjaGUueGFsYW4ucHJvY2Vzc29yLlRyYW5zZm9ybWVyRmFjdG9yeUltcGwmcXVvdDs8L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hVGFnIj4mZ3Q7Ci0gICAgICAmbHQ7L2RlYnVnZ2VyJmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci08L3NwYW4+PC9wcmU+Ci08cD48L3A+Ci0KLTxicj4KLTxwIGNsYXNzPSJub3RlIFNjaGVtYUNvcHlyaWdodCI+Ci1Db3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSA8YSBocmVmPSJodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51ayI+aHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWs8L2E+Ljxicj4KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCA8YQotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPgotCi08L3A+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuc2RrLmRvY3VtZW50YXRpb24vZG9jL2h0bWwvZXh0ZW5zaW9uX3BvaW50L29yZ19lY2xpcHNlX3dzdF94c2xfamF4cF9sYXVuY2hpbmdfaW52b2tlLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuc2RrLmRvY3VtZW50YXRpb24vZG9jL2h0bWwvZXh0ZW5zaW9uX3BvaW50L29yZ19lY2xpcHNlX3dzdF94c2xfamF4cF9sYXVuY2hpbmdfaW52b2tlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkZWI0ZDEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uL2RvYy9odG1sL2V4dGVuc2lvbl9wb2ludC9vcmdfZWNsaXBzZV93c3RfeHNsX2pheHBfbGF1bmNoaW5nX2ludm9rZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+WFNMVCBQcm9jZXNzb3IgSW52b2tlcjwvdGl0bGU+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPkBpbXBvcnQgdXJsKCIuLi8uLi9ib29rLmNzcyIpOzwvc3R5bGU+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPkBpbXBvcnQgdXJsKCIuLi8uLi9zY2hlbWEuY3NzIik7PC9zdHlsZT4KLTwvSEVBRD4KLTxCT0RZPgotPEgxIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlciI+WFNMVCBQcm9jZXNzb3IgSW52b2tlcjwvSDE+Ci08ZGl2IHN0eWxlPSJib3JkZXI6IDFweCBzb2xpZCAjOTkwMDAwOyBwYWRkaW5nOiA1cHg7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6IHJlZDsiPlRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsPC9kaXY+Ci08cD48L3A+Ci08aDYgY2xhc3M9IkNhcHRpb25GaWdDb2x1bW4gU2NoZW1hSGVhZGVyIj5JZGVudGlmaWVyOiA8L2g2Pm9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmpheHAuaW52b2tlPHA+PC9wPgotPGg2IGNsYXNzPSJDYXB0aW9uRmlnQ29sdW1uIFNjaGVtYUhlYWRlciI+RGVzY3JpcHRpb246IDwvaDY+PGI+VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIgcGx1Z2lucy48L2I+PHA+PC9wPgotPGg2IGNsYXNzPSJDYXB0aW9uRmlnQ29sdW1uIFNjaGVtYUhlYWRlciI+Q29uZmlndXJhdGlvbiBNYXJrdXA6PC9oNj4KLTxwPjwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUuZXh0ZW5zaW9uIj5leHRlbnNpb248L2E+ICg8YSBocmVmPSIjZS5pbnZva2VyIj5pbnZva2VyPC9hPikmZ3Q7PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUFUVExJU1QgZXh0ZW5zaW9uPC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+cG9pbnQmbmJzcDtDREFUQSAjUkVRVUlSRUQ8cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5pZCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNJTVBMSUVEPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+bmFtZSZuYnNwOyZuYnNwO0NEQVRBICNJTVBMSUVEJmd0OzwvcD4KLTxwPjwvcD4KLTx1bCBjbGFzcz0iQ29uZmlnTWFya3VwQXR0bGlzdERlc2MiPgotPC91bD4KLTxicj48cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLmludm9rZXIiPmludm9rZXI8L2E+IEVNUFRZJmd0OzwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFBVFRMSVNUIGludm9rZXI8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5pZCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNSRVFVSVJFRDxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmNsYXNzJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q0RBVEEgI1JFUVVJUkVEPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+Y2xhc3NwYXRoJm5ic3A7Q0RBVEEgI1JFUVVJUkVEJmd0OzwvcD4KLTxwPjwvcD4KLTx1bCBjbGFzcz0iQ29uZmlnTWFya3VwQXR0bGlzdERlc2MiPgotPGxpPjxiPmlkPC9iPiAtIFVuaXF1ZSBpZCBmb3IgdGhpcyBpbnZva2VyPC9saT4KLTxsaT48Yj5jbGFzczwvYj4gLSBBIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgSVByb2Nlc3Nvckludm9rZXIgaW50ZXJmYWNlPC9saT4KLTxsaT48Yj5jbGFzc3BhdGg8L2I+IC0gQSBzZW1pLWNvbG9uIHNlcGFyYXRlZCBsaXN0IG9mIGphcnMgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIGNvbnRyaWJ1dGluZyBwbHVnaW4uIE9uZSBvZiB0aGUgamFycyBtdXN0IGNvbnRhaW4gdGhlIEludm9rZXIgY2xhc3MgbmFtZWQgaW4gdGhlIGNsYXNzIGF0dHJpYnV0ZS48L2xpPgotPC91bD4KLTxicj48YnI+Ci08cCBjbGFzcz0ibm90ZSBTY2hlbWFDb3B5cmlnaHQiPgotQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gPGEgaHJlZj0iaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsiPmh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrPC9hPi48YnI+Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgPGEKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4KLQotPC9wPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uL2RvYy9odG1sL2V4dGVuc2lvbl9wb2ludC9vcmdfZWNsaXBzZV93c3RfeHNsX2pheHBfbGF1bmNoaW5nX3Byb2Nlc3Nvci5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uL2RvYy9odG1sL2V4dGVuc2lvbl9wb2ludC9vcmdfZWNsaXBzZV93c3RfeHNsX2pheHBfbGF1bmNoaW5nX3Byb2Nlc3Nvci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGVlMWE0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi9kb2MvaHRtbC9leHRlbnNpb25fcG9pbnQvb3JnX2VjbGlwc2Vfd3N0X3hzbF9qYXhwX2xhdW5jaGluZ19wcm9jZXNzb3IuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08SFRNTD4KLTxIRUFEPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPlhTTFQgUHJvY2Vzc29yPC90aXRsZT4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+QGltcG9ydCB1cmwoIi4uLy4uL2Jvb2suY3NzIik7PC9zdHlsZT4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+QGltcG9ydCB1cmwoIi4uLy4uL3NjaGVtYS5jc3MiKTs8L3N0eWxlPgotPC9IRUFEPgotPEJPRFk+Ci08SDEgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyIj5YU0xUIFByb2Nlc3NvcjwvSDE+Ci08cD48L3A+Ci08aDYgY2xhc3M9IkNhcHRpb25GaWdDb2x1bW4gU2NoZW1hSGVhZGVyIj5JZGVudGlmaWVyOiA8L2g2Pm9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmpheHAucHJvY2Vzc29yPHA+PC9wPgotPGg2IGNsYXNzPSJDYXB0aW9uRmlnQ29sdW1uIFNjaGVtYUhlYWRlciI+RGVzY3JpcHRpb246IDwvaDY+Q29udHJpYnV0ZSBhIEphdmEgWFNMVCBwcm9jZXNzb3IgaW5zdGFuY2UgKGUuZy4gWGFsYW4gMi43LjApLiBUaGUgZXh0ZW5zaW9uIHBvaW50IHByaW1hcmlseSBkZWZpbmVzIHRoZSBjbGFzc3BhdGggdG8gYmUgdXNlZCB3aGVuIGxhdW5jaGluZyBhbiBYU0xUIHRyYW5zZm9ybWF0aW9uLjxwPjwvcD4KLTxoNiBjbGFzcz0iQ2FwdGlvbkZpZ0NvbHVtbiBTY2hlbWFIZWFkZXIiPkNvbmZpZ3VyYXRpb24gTWFya3VwOjwvaDY+Ci08cD48L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLmV4dGVuc2lvbiI+ZXh0ZW5zaW9uPC9hPiAoPGEgaHJlZj0iI2UucHJvY2Vzc29yIj5wcm9jZXNzb3I8L2E+KykmZ3Q7PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUFUVExJU1QgZXh0ZW5zaW9uPC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+cG9pbnQmbmJzcDtDREFUQSAjUkVRVUlSRUQ8cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5pZCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNJTVBMSUVEPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+bmFtZSZuYnNwOyZuYnNwO0NEQVRBICNJTVBMSUVEJmd0OzwvcD4KLTxwPjwvcD4KLTx1bCBjbGFzcz0iQ29uZmlnTWFya3VwQXR0bGlzdERlc2MiPgotPC91bD4KLTxicj48cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLnByb2Nlc3NvciI+cHJvY2Vzc29yPC9hPiBFTVBUWSZndDs8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshQVRUTElTVCBwcm9jZXNzb3I8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5pZCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNSRVFVSVJFRDxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmxhYmVsJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q0RBVEEgI1JFUVVJUkVEPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+cHJvY2Vzc29yVHlwZUlkJm5ic3A7Q0RBVEEgI1JFUVVJUkVEPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+Y2xhc3NwYXRoJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q0RBVEEgI1JFUVVJUkVEPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+ZGVidWdnZXJJZCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNJTVBMSUVEPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+c3VwcG9ydHMmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjUkVRVUlSRUQmZ3Q7PC9wPgotPHA+PC9wPgotPHAgY2xhc3M9IkNvbmZpZ01hcmt1cEVsZW1lbnREZXNjIj4KLUFuIGluc3RhbmNlIG9mIGEgSkFYUC1jb21wbGlhbnQgWFNMVCBwcm9jZXNzb3I8L3A+Ci08YnI+Ci08dWwgY2xhc3M9IkNvbmZpZ01hcmt1cEF0dGxpc3REZXNjIj4KLTxsaT48Yj5pZDwvYj4gLSBBIHVuaXF1ZSBpZCBmb3IgdGhpcyBwcm9jZXNzb3IgaW5zdGFuY2U8L2xpPgotPGxpPjxiPmxhYmVsPC9iPiAtIEEgbGFiZWwgZm9yIHRoaXMgaW5zdGFuY2UgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBVSTwvbGk+Ci08bGk+PGI+cHJvY2Vzc29yVHlwZUlkPC9iPiAtIFRoZSBpZCBmb3IgdGhlIHByb2Nlc3NvciB0eXBlPC9saT4KLTxsaT48Yj5jbGFzc3BhdGg8L2I+IC0gVGhlIGNsYXNzcGF0aCB0byB1c2Ugd2hlbiB0aGlzIHByb2Nlc3NvciBpcyBsYXVuY2hlZDwvbGk+Ci08bGk+PGI+ZGVidWdnZXJJZDwvYj4gLSBUaGUgaWQgb2YgYSBkZWJ1Z2dlciB0byBhc3NvY2lhdGUgd2l0aCB0aGUgcHJvY2Vzc29yPC9saT4KLTxsaT48Yj5zdXBwb3J0czwvYj4gLSBBIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHN1cHBvcnRlZCBYU0xUIHZlcnNpb25zIGUuZy4gMS4wLDIuMDwvbGk+Ci08L3VsPgotPGJyPjxoNiBjbGFzcz0iQ2FwdGlvbkZpZ0NvbHVtbiBTY2hlbWFIZWFkZXIiPkV4YW1wbGVzOiA8L2g2PjxwcmUgY2xhc3M9IkV4YW1wbGUiPjxzcGFuIGNsYXNzPSJjb2RlIFNjaGVtYVRhZyI+Ci0gICAmbHQ7ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD08L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hQ3N0cmluZyI+JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5wcm9jZXNzb3ImcXVvdDs8L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hVGFnIj4mZ3Q7Ci0gICAgICAmbHQ7IS0tIEFuIGFkb3B0ZXIgY2FuIHNwZWNpZnkgdGhlICR7ZWNsaXBzZV9vcmJpdDogfSB2YXJpYWJsZSB0byBpbmRpY2F0ZSB3aGljaCBlY2xpcHNlCi0gICAgICAgICAgIGJ1bmRsZSBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIGNsYXNzIHBhdGguIC0tJmd0OwotICAgICAgJmx0O3Byb2Nlc3NvcgotICAgICAgY2xhc3NwYXRoPTwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFDc3RyaW5nIj4mcXVvdDske2VjbGlwc2Vfb3JiaXQ6b3JnLmFwYWNoZS54YWxhbn07JHtlY2xpcHNlX29yYml0Om9yZy5hcGFjaGUueG1sLnNlcmlhbGl6ZXJ9OyR7ZWNsaXBzZV9vcmJpdDpvcmcuYXBhY2hlLmJjZWx9OyR7ZWNsaXBzZV9vcmJpdDpqYXZhX2N1cC5ydW50aW1lfSZxdW90Ozwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFUYWciPgotICAgICAgICAgICAgaWQ9PC9zcGFuPjxzcGFuIGNsYXNzPSJjb2RlIFNjaGVtYUNzdHJpbmciPiZxdW90O29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLnhhbGFuLnByb2Nlc3NvciZxdW90Ozwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFUYWciPgotICAgICAgICAgICAgbGFiZWw9PC9zcGFuPjxzcGFuIGNsYXNzPSJjb2RlIFNjaGVtYUNzdHJpbmciPiZxdW90OyVwcm9jZXNzb3IubGFiZWwuMSZxdW90Ozwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFUYWciPgotICAgICAgICAgICAgcHJvY2Vzc29yVHlwZUlkPTwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFDc3RyaW5nIj4mcXVvdDtvcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLnByb2Nlc3NvclR5cGUmcXVvdDs8L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hVGFnIj4KLSAgICAgICAgICAgIGRlYnVnZ2VySWQ9PC9zcGFuPjxzcGFuIGNsYXNzPSJjb2RlIFNjaGVtYUNzdHJpbmciPiZxdW90O29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4uZGVidWdnZXImcXVvdDs8L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hVGFnIj4KLSAgICAgICAgICAgIHN1cHBvcnRzPTwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFDc3RyaW5nIj4mcXVvdDsxLjAmcXVvdDs8L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hVGFnIj4mZ3Q7Ci0gICAgICAmbHQ7L3Byb2Nlc3NvciZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotPC9zcGFuPjwvcHJlPgotPHA+PC9wPgotCi08YnI+Ci08cCBjbGFzcz0ibm90ZSBTY2hlbWFDb3B5cmlnaHQiPgotQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gPGEgaHJlZj0iaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsiPmh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrPC9hPi48YnI+Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgPGEKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4KLQotPC9wPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uL2RvYy9odG1sL2V4dGVuc2lvbl9wb2ludC9vcmdfZWNsaXBzZV93c3RfeHNsX2pheHBfbGF1bmNoaW5nX3Byb2Nlc3NvclR5cGUuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi9kb2MvaHRtbC9leHRlbnNpb25fcG9pbnQvb3JnX2VjbGlwc2Vfd3N0X3hzbF9qYXhwX2xhdW5jaGluZ19wcm9jZXNzb3JUeXBlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiODE0MGYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uL2RvYy9odG1sL2V4dGVuc2lvbl9wb2ludC9vcmdfZWNsaXBzZV93c3RfeHNsX2pheHBfbGF1bmNoaW5nX3Byb2Nlc3NvclR5cGUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08SFRNTD4KLTxIRUFEPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPlhTTFQgUHJvY2Vzc29yIFR5cGU8L3RpdGxlPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj5AaW1wb3J0IHVybCgiLi4vLi4vYm9vay5jc3MiKTs8L3N0eWxlPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj5AaW1wb3J0IHVybCgiLi4vLi4vc2NoZW1hLmNzcyIpOzwvc3R5bGU+Ci08L0hFQUQ+Ci08Qk9EWT4KLTxIMSBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXIiPlhTTFQgUHJvY2Vzc29yIFR5cGU8L0gxPgotPHA+PC9wPgotPGg2IGNsYXNzPSJDYXB0aW9uRmlnQ29sdW1uIFNjaGVtYUhlYWRlciI+SWRlbnRpZmllcjogPC9oNj5vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5qYXhwLnByb2Nlc3NvclR5cGU8cD48L3A+Ci08aDYgY2xhc3M9IkNhcHRpb25GaWdDb2x1bW4gU2NoZW1hSGVhZGVyIj5EZXNjcmlwdGlvbjogPC9oNj5Db250cmlidXRlIGEgSmF2YSBYU0xUIHByb2Nlc3NvciB0eXBlIChlLmcuIFhhbGFuLCBTYXhvbikuIFRoZSBwcm9jZXNzb3IgdHlwZSBkZWZpbmVzIHdoaWNoIEpBWFAgYXR0cmlidXRlcyBhbmQgb3V0cHV0IHByb3BlcmllcyBhcmUgc3VwcG9ydGVkLCBhbmQgYWxzbyB0aGUgdHJhbnNmb3JtZXIgZmFjdG9yeSBjbGFzc2VzIGl0IGNvbnRhaW5zLjxwPjwvcD4KLTxoNiBjbGFzcz0iQ2FwdGlvbkZpZ0NvbHVtbiBTY2hlbWFIZWFkZXIiPkNvbmZpZ3VyYXRpb24gTWFya3VwOjwvaDY+Ci08cD48L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLmV4dGVuc2lvbiI+ZXh0ZW5zaW9uPC9hPiAoPGEgaHJlZj0iI2UucHJvY2Vzc29yVHlwZSI+cHJvY2Vzc29yVHlwZTwvYT4rKSZndDs8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshQVRUTElTVCBleHRlbnNpb248L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5wb2ludCZuYnNwO0NEQVRBICNSRVFVSVJFRDxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmlkJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q0RBVEEgI0lNUExJRUQ8cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5uYW1lJm5ic3A7Jm5ic3A7Q0RBVEEgI0lNUExJRUQmZ3Q7PC9wPgotPHA+PC9wPgotPHVsIGNsYXNzPSJDb25maWdNYXJrdXBBdHRsaXN0RGVzYyI+Ci08L3VsPgotPGJyPjxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUucHJvY2Vzc29yVHlwZSI+cHJvY2Vzc29yVHlwZTwvYT4gKDxhIGhyZWY9IiNlLnRyYW5zZm9ybWVyRmFjdG9yeSI+dHJhbnNmb3JtZXJGYWN0b3J5PC9hPiopJmd0OzwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFBVFRMSVNUIHByb2Nlc3NvclR5cGU8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5pZCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNSRVFVSVJFRDxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmxhYmVsJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q0RBVEEgI1JFUVVJUkVEPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+b3V0cHV0UHJvcGVydGllcyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNJTVBMSUVEPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+YXR0cmlidXRlUHJvcGVydGllcyZuYnNwO0NEQVRBICNJTVBMSUVEJmd0OzwvcD4KLTxwPjwvcD4KLTx1bCBjbGFzcz0iQ29uZmlnTWFya3VwQXR0bGlzdERlc2MiPgotPGxpPjxiPmlkPC9iPiAtIFVuaXF1ZSBpZCBmb3IgdGhlIHByb2Nlc3NvciB0eXBlPC9saT4KLTxsaT48Yj5sYWJlbDwvYj4gLSBOYW1lIGZvciBkaXNwbGF5IGluIHRoZSBVSTwvbGk+Ci08bGk+PGI+b3V0cHV0UHJvcGVydGllczwvYj4gLSBMb2NhdGlvbiBvZiBhIHByb3BlcnRpZXMgZmlsZSBjb250YWluaW5nIHRoZSBsaXN0IG9mIHRoZSBwcm9jZXNzb3JzIG91dHB1dCBwcm9wZXJ0aWVzLiBNdXN0IGJlIGEgcGF0aCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgYnVuZGxlLjwvbGk+Ci08bGk+PGI+YXR0cmlidXRlUHJvcGVydGllczwvYj4gLSBMb2NhdGlvbiBvZiBhIHByb3BlcnRpZXMgZmlsZSBjb250YWluaW5nIHRoZSBsaXN0IG9mIHRoZSBhdHRyaWJ1dGVzIHN1cHBvcnRlZCBieSB0aGlzIHByb2Nlc3Nvci4gTXVzdCBiZSBhIHBhdGggcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIGJ1bmRsZS48L2xpPgotPC91bD4KLTxicj48cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLnRyYW5zZm9ybWVyRmFjdG9yeSI+dHJhbnNmb3JtZXJGYWN0b3J5PC9hPiBFTVBUWSZndDs8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshQVRUTElTVCB0cmFuc2Zvcm1lckZhY3Rvcnk8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5mYWN0b3J5Q2xhc3MmbmJzcDtDREFUQSAjUkVRVUlSRUQ8cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5uYW1lJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q0RBVEEgI1JFUVVJUkVEJmd0OzwvcD4KLTxwPjwvcD4KLTxwIGNsYXNzPSJDb25maWdNYXJrdXBFbGVtZW50RGVzYyI+Ci1BIFRyYW5zZm9ybWVyRmFjdG9yeSBmb3IgdGhpcyB0eXBlPC9wPgotPGJyPgotPHVsIGNsYXNzPSJDb25maWdNYXJrdXBBdHRsaXN0RGVzYyI+Ci08bGk+PGI+ZmFjdG9yeUNsYXNzPC9iPiAtIFRoZSBmdWxseS1xdWFsaWZpZWQgdHJhbnNmb3JtZXIgZmFjdG9yeSBjbGFzczwvbGk+Ci08bGk+PGI+bmFtZTwvYj4gLSBBIG5hbWUgZm9yIHRoaXMgdHJhbnNmb3JtZXIgZmFjdG9yeSB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIFVJPC9saT4KLTwvdWw+Ci08YnI+PGg2IGNsYXNzPSJDYXB0aW9uRmlnQ29sdW1uIFNjaGVtYUhlYWRlciI+RXhhbXBsZXM6IDwvaDY+PHByZSBjbGFzcz0iRXhhbXBsZSI+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hVGFnIj4KLSAgICZsdDtleHRlbnNpb24KLSAgICAgICAgIHBvaW50PTwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFDc3RyaW5nIj4mcXVvdDtvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLnByb2Nlc3NvclR5cGUmcXVvdDs8L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hVGFnIj4mZ3Q7Ci0gICAgICAmbHQ7cHJvY2Vzc29yVHlwZQotICAgICAgICAgICAgYXR0cmlidXRlUHJvcGVydGllcz08L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hQ3N0cmluZyI+JnF1b3Q7WGFsYW5BdHRyaWJ1dGVzLnByb3BlcnRpZXMmcXVvdDs8L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hVGFnIj4KLSAgICAgICAgICAgIGlkPTwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFDc3RyaW5nIj4mcXVvdDtvcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLnByb2Nlc3NvclR5cGUmcXVvdDs8L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hVGFnIj4KLSAgICAgICAgICAgIGxhYmVsPTwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFDc3RyaW5nIj4mcXVvdDslcHJvY2Vzc29yVHlwZS5sYWJlbC4wJnF1b3Q7PC9zcGFuPjxzcGFuIGNsYXNzPSJjb2RlIFNjaGVtYVRhZyI+Ci0gICAgICAgICAgICBvdXRwdXRQcm9wZXJ0aWVzPTwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFDc3RyaW5nIj4mcXVvdDtYYWxhbk91dHB1dFByb3BlcnRpZXMucHJvcGVydGllcyZxdW90Ozwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFUYWciPiZndDsKLSAgICAgICAgICZsdDt0cmFuc2Zvcm1lckZhY3RvcnkKLSAgICAgICAgICAgICAgIGZhY3RvcnlDbGFzcz08L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hQ3N0cmluZyI+JnF1b3Q7b3JnLmFwYWNoZS54YWxhbi5wcm9jZXNzb3IuVHJhbnNmb3JtZXJGYWN0b3J5SW1wbCZxdW90Ozwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFUYWciPgotICAgICAgICAgICAgICAgbmFtZT08L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hQ3N0cmluZyI+JnF1b3Q7SW50ZXJwcmV0aXZlJnF1b3Q7PC9zcGFuPjxzcGFuIGNsYXNzPSJjb2RlIFNjaGVtYVRhZyI+Jmd0OwotICAgICAgICAgJmx0Oy90cmFuc2Zvcm1lckZhY3RvcnkmZ3Q7Ci0gICAgICAgICAmbHQ7dHJhbnNmb3JtZXJGYWN0b3J5Ci0gICAgICAgICAgICAgICBmYWN0b3J5Q2xhc3M9PC9zcGFuPjxzcGFuIGNsYXNzPSJjb2RlIFNjaGVtYUNzdHJpbmciPiZxdW90O29yZy5hcGFjaGUueGFsYW4ueHNsdGMudHJheC5UcmFuc2Zvcm1lckZhY3RvcnlJbXBsJnF1b3Q7PC9zcGFuPjxzcGFuIGNsYXNzPSJjb2RlIFNjaGVtYVRhZyI+Ci0gICAgICAgICAgICAgICBuYW1lPTwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFDc3RyaW5nIj4mcXVvdDtDb21waWxpbmcmcXVvdDs8L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hVGFnIj4mZ3Q7Ci0gICAgICAgICAmbHQ7L3RyYW5zZm9ybWVyRmFjdG9yeSZndDsKLSAgICAgICZsdDsvcHJvY2Vzc29yVHlwZSZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotPC9zcGFuPjwvcHJlPgotPHA+PC9wPgotCi08YnI+Ci08cCBjbGFzcz0ibm90ZSBTY2hlbWFDb3B5cmlnaHQiPgotQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gPGEgaHJlZj0iaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsiPmh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrPC9hPi48YnI+Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgPGEKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4KLQotPC9wPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uL2RvYy9odG1sL29yZy5lY2xpcHNlLndzdC54bWwueHBhdGguY29yZS5YUGF0aENvcmVQbHVnaW4uaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi9kb2MvaHRtbC9vcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLmNvcmUuWFBhdGhDb3JlUGx1Z2luLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0YjgxZWQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uL2RvYy9odG1sL29yZy5lY2xpcHNlLndzdC54bWwueHBhdGguY29yZS5YUGF0aENvcmVQbHVnaW4uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTxodG1sPjxib2R5PjxwPjxmb250IHNpemU9IisxIj48c3Ryb25nPlBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC5jb3JlPC9zdHJvbmc+PC9mb250PjwvcD48aHI+PGgyPjxmb250IHNpemU9Ii0xIj48c3Ryb25nPm9yZy5lY2xpcHNlLndzdC54bWwueHBhdGguY29yZTwvc3Ryb25nPjwvZm9udD48YnI+Ci0gICAgICAgICAgICAgICBDbGFzcyBYUGF0aENvcmVQbHVnaW48L2gyPjxicj48aHI+PHByZT5wdWJsaWMgY2xhc3MgPHN0cm9uZz5YUGF0aENvcmVQbHVnaW48L3N0cm9uZz4KLWV4dGVuZHMgUGx1Z2luPC9wcmU+VGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlPGhyPjx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIj48dHIgY29scz0iMiIgYmdjb2xvcj0iI0NDQ0NGRiI+PHRkIGNvbHNwYW49IjIiIHdpZHRoPSIxMDAlIj48aDI+RmllbGQgU3VtbWFyeTwvaDI+PC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIHN0YXRpYyAgamF2YS5sYW5nLlN0cmluZzwvY29kZT48L3RkPjx0ZCB3aWR0aD0iODAlIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI2ZpZWxkX1BMVUdJTl9JRCI+UExVR0lOX0lEPC9hPjwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48L3RhYmxlPjxicj48dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSI+PHRyIGJnY29sb3I9IiNDQ0NDRkYiPjx0ZCB3aWR0aD0iMTAwJSI+PGgyPkNvbnN0cnVjdG9yIFN1bW1hcnk8L2gyPjwvdGQ+PC90cj48dHI+PHRkPjxjb2RlPjxzdHJvbmc+PGEgaHJlZj0iI2Nvbl9YUGF0aENvcmVQbHVnaW4iPlhQYXRoQ29yZVBsdWdpbjwvYT48L3N0cm9uZz4oKTwvY29kZT48L3RkPjwvdHI+PC90YWJsZT48YnI+PHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiPjx0ciBjb2xzPSIyIiBiZ2NvbG9yPSIjQ0NDQ0ZGIj48dGQgY29sc3Bhbj0iMiIgd2lkdGg9IjEwMCUiPjxoMj5NZXRob2QgU3VtbWFyeTwvaDI+PC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIHN0YXRpYyBvcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLmNvcmUuWFBhdGhDb3JlUGx1Z2luPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSIiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjbWV0aG9kX2dldERlZmF1bHQiPmdldERlZmF1bHQ8L2E+KCk8L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2U8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgdm9pZDwvY29kZT48L3RkPjx0ZCB3aWR0aD0iIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI21ldGhvZF9zdGFydCI+c3RhcnQ8L2E+KEJ1bmRsZUNvbnRleHQgY29udGV4dCk8L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICA8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgdm9pZDwvY29kZT48L3RkPjx0ZCB3aWR0aD0iIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI21ldGhvZF9zdG9wIj5zdG9wPC9hPihCdW5kbGVDb250ZXh0IGNvbnRleHQpPC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgPC90ZD48L3RyPjwvdGFibGU+PGhyPjx0YWJsZSBjb2xzPSIyIiB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIj48dHIgY29sc3Bhbj0iMiIgd2lkdGg9IjEwMCUiIGJnY29sb3I9IiNDQ0NDRkYiIGFsaWduPSJsZWZ0Ij48dGQ+PGgyPgotICAgICAgICAgICAgICAgICAgRmllbGQgRGV0YWlsCi0gICAgICAgICAgICAgICA8L2gyPjwvdGQ+PC90cj48L3RhYmxlPjxoMj48YSBuYW1lPSJmaWVsZF9QTFVHSU5fSUQiPlBMVUdJTl9JRDwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmcgPHN0cm9uZz5QTFVHSU5fSUQ8L3N0cm9uZz48L2NvZGU+PC9wPjxocj48dGFibGUgY29scz0iMiIgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSI+PHRyIGNvbHNwYW49IjIiIHdpZHRoPSIxMDAlIiBiZ2NvbG9yPSIjQ0NDQ0ZGIiBhbGlnbj0ibGVmdCI+PHRkPjxoMj4KLSAgICAgICAgICAgICAgICAgIENvbnN0cnVjdG9yIERldGFpbAotICAgICAgICAgICAgICAgPC9oMj48L3RkPjwvdHI+PC90YWJsZT48aDI+PGEgbmFtZT0iY29uX1hQYXRoQ29yZVBsdWdpbiI+WFBhdGhDb3JlUGx1Z2luPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIDxzdHJvbmc+WFBhdGhDb3JlUGx1Z2luPC9zdHJvbmc+KCk8L2NvZGU+PC9wPjxwPlRoZSBjb25zdHJ1Y3RvcjwvcD48aHI+PHRhYmxlIGNvbHM9IjIiIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiPjx0ciBjb2xzcGFuPSIyIiB3aWR0aD0iMTAwJSIgYmdjb2xvcj0iI0NDQ0NGRiIgYWxpZ249ImxlZnQiPjx0ZD48aDI+Ci0gICAgICAgICAgICAgICAgICBNZXRob2RzIERldGFpbAotICAgICAgICAgICAgICAgPC9oMj48L3RkPjwvdHI+PC90YWJsZT48aDI+PGEgbmFtZT0ibWV0aG9kX2dldERlZmF1bHQiPmdldERlZmF1bHQ8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgb3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC5jb3JlLlhQYXRoQ29yZVBsdWdpbiA8c3Ryb25nPmdldERlZmF1bHQ8L3N0cm9uZz4oKTwvY29kZT48L3A+PHA+UmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlPC9wPjxoMz5SZXR1cm5zPC9oMz48cD48Y29kZT5vcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLmNvcmUuWFBhdGhDb3JlUGx1Z2luPC9jb2RlPiAtIHRoZSBzaGFyZWQgaW5zdGFuY2U8L3A+PGhyPjxoMj48YSBuYW1lPSJtZXRob2Rfc3RhcnQiPnN0YXJ0PC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIHZvaWQgPHN0cm9uZz5zdGFydDwvc3Ryb25nPihCdW5kbGVDb250ZXh0IGNvbnRleHQpPC9jb2RlPjwvcD48cD48L3A+PGgzPlBhcmFtZXRlcnM8L2gzPjxwPjxjb2RlPmNvbnRleHQ8L2NvZGU+PC9wPjxoMz5UaHJvd3M6PC9oMz48cD48Y29kZT5qYXZhLmxhbmcuRXhjZXB0aW9uPC9jb2RlPjwvcD48aHI+PGgyPjxhIG5hbWU9Im1ldGhvZF9zdG9wIj5zdG9wPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIHZvaWQgPHN0cm9uZz5zdG9wPC9zdHJvbmc+KEJ1bmRsZUNvbnRleHQgY29udGV4dCk8L2NvZGU+PC9wPjxwPjwvcD48aDM+UGFyYW1ldGVyczwvaDM+PHA+PGNvZGU+Y29udGV4dDwvY29kZT48L3A+PGgzPlRocm93czo8L2gzPjxwPjxjb2RlPmphdmEubGFuZy5FeGNlcHRpb248L2NvZGU+PC9wPjxocj48L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi9kb2MvaHRtbC9vcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLmNvcmUudXRpbC5YU0xUWFBhdGhIZWxwZXIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi9kb2MvaHRtbC9vcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLmNvcmUudXRpbC5YU0xUWFBhdGhIZWxwZXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYxNDJlMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuc2RrLmRvY3VtZW50YXRpb24vZG9jL2h0bWwvb3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC5jb3JlLnV0aWwuWFNMVFhQYXRoSGVscGVyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotPGh0bWw+PGJvZHk+PHA+PGZvbnQgc2l6ZT0iKzEiPjxzdHJvbmc+UGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLmNvcmUudXRpbDwvc3Ryb25nPjwvZm9udD48L3A+PGhyPjxoMj48Zm9udCBzaXplPSItMSI+PHN0cm9uZz5vcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLmNvcmUudXRpbDwvc3Ryb25nPjwvZm9udD48YnI+Ci0gICAgICAgICAgICAgICBDbGFzcyBYU0xUWFBhdGhIZWxwZXI8L2gyPjxicj48aHI+PHByZT5wdWJsaWMgY2xhc3MgPHN0cm9uZz5YU0xUWFBhdGhIZWxwZXI8L3N0cm9uZz4KLWV4dGVuZHMgamF2YS5sYW5nLk9iamVjdDwvcHJlPjxocj48dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSI+PHRyIGJnY29sb3I9IiNDQ0NDRkYiPjx0ZCB3aWR0aD0iMTAwJSI+PGgyPkNvbnN0cnVjdG9yIFN1bW1hcnk8L2gyPjwvdGQ+PC90cj48dHI+PHRkPjxjb2RlPjxzdHJvbmc+PGEgaHJlZj0iI2Nvbl9YU0xUWFBhdGhIZWxwZXIiPlhTTFRYUGF0aEhlbHBlcjwvYT48L3N0cm9uZz4oKTwvY29kZT48L3RkPjwvdHI+PC90YWJsZT48YnI+PHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiPjx0ciBjb2xzPSIyIiBiZ2NvbG9yPSIjQ0NDQ0ZGIj48dGQgY29sc3Bhbj0iMiIgd2lkdGg9IjEwMCUiPjxoMj5NZXRob2QgU3VtbWFyeTwvaDI+PC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSIiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjbWV0aG9kX2NhbGN1bGF0ZVhQYXRoVG9Ob2RlIj5jYWxjdWxhdGVYUGF0aFRvTm9kZTwvYT4ob3JnLnczYy5kb20uTm9kZSBub2RlKTwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyBzdGF0aWMgdm9pZDwvY29kZT48L3RkPjx0ZCB3aWR0aD0iIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI21ldGhvZF9jb21waWxlIj5jb21waWxlPC9hPihqYXZhLmxhbmcuU3RyaW5nIGV4cHJlc3Npb24pPC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgPC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIHN0YXRpYyBYT2JqZWN0PC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSIiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjbWV0aG9kX2V2YWwiPmV2YWw8L2E+KG9yZy53M2MuZG9tLk5vZGUgY29udGV4dE5vZGUKLSAgICAgICAgICwKLSAgICAgIGphdmEubGFuZy5TdHJpbmcgc3RyKTwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIEV2YWx1YXRlIFhQYXRoIHN0cmluZyB0byBhbiBYT2JqZWN0LiBVc2luZyB0aGlzIG1ldGhvZCwgWFBhdGggbmFtZXNwYWNlCi0gcHJlZml4ZXMgd2lsbCBiZSByZXNvbHZlZCBmcm9tIHRoZSBuYW1lc3BhY2VOb2RlLjwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyBzdGF0aWMgWE9iamVjdDwvY29kZT48L3RkPjx0ZCB3aWR0aD0iIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI21ldGhvZF9ldmFsIj5ldmFsPC9hPihvcmcudzNjLmRvbS5Ob2RlIGNvbnRleHROb2RlCi0gICAgICAgICAsCi0gICAgICBqYXZhLmxhbmcuU3RyaW5nIHN0cgotICAgICAgICAgLAotICAgICAgb3JnLnczYy5kb20uTm9kZSBuYW1lc3BhY2VOb2RlKTwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIEV2YWx1YXRlIFhQYXRoIHN0cmluZyB0byBhbiBYT2JqZWN0LiBYUGF0aCBuYW1lc3BhY2UgcHJlZml4ZXMgYXJlCi0gcmVzb2x2ZWQgZnJvbSB0aGUgbmFtZXNwYWNlTm9kZS4gVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgaXMgYSBsaXR0bGUKLSBzbG93LCBzaW5jZSBpdCBjcmVhdGVzIGEgbnVtYmVyIG9mIG9iamVjdHMgZWFjaCB0aW1lIGl0IGlzIGNhbGxlZC4gVGhpcwotIGNvdWxkIGJlIG9wdGltaXplZCB0byBrZWVwIHRoZSBzYW1lIG9iamVjdHMgYXJvdW5kLCBidXQgdGhlbgotIHRocmVhZC1zYWZldHkgaXNzdWVzIHdvdWxkIGFyaXNlLjwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyBzdGF0aWMgWE9iamVjdDwvY29kZT48L3RkPjx0ZCB3aWR0aD0iIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI21ldGhvZF9ldmFsIj5ldmFsPC9hPihvcmcudzNjLmRvbS5Ob2RlIGNvbnRleHROb2RlCi0gICAgICAgICAsCi0gICAgICBqYXZhLmxhbmcuU3RyaW5nIHN0cgotICAgICAgICAgLAotICAgICAgUHJlZml4UmVzb2x2ZXIgcHJlZml4UmVzb2x2ZXIpPC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgRXZhbHVhdGUgWFBhdGggc3RyaW5nIHRvIGFuIFhPYmplY3QuIFhQYXRoIG5hbWVzcGFjZSBwcmVmaXhlcyBhcmUKLSByZXNvbHZlZCBmcm9tIHRoZSBuYW1lc3BhY2VOb2RlLiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBpcyBhIGxpdHRsZQotIHNsb3csIHNpbmNlIGl0IGNyZWF0ZXMgYSBudW1iZXIgb2Ygb2JqZWN0cyBlYWNoIHRpbWUgaXQgaXMgY2FsbGVkLiBUaGlzCi0gY291bGQgYmUgb3B0aW1pemVkIHRvIGtlZXAgdGhlIHNhbWUgb2JqZWN0cyBhcm91bmQsIGJ1dCB0aGVuCi0gdGhyZWFkLXNhZmV0eSBpc3N1ZXMgd291bGQgYXJpc2UuPC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHJvdGVjdGVkIHN0YXRpYyBGdW5jdGlvblRhYmxlPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSIiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjbWV0aG9kX2dldEZ1bmN0aW9uVGFibGUiPmdldEZ1bmN0aW9uVGFibGU8L2E+KCk8L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICA8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgc3RhdGljIG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlSXRlcmF0b3I8L2NvZGU+PC90ZD48dGQgd2lkdGg9IiIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNtZXRob2Rfc2VsZWN0Tm9kZUl0ZXJhdG9yIj5zZWxlY3ROb2RlSXRlcmF0b3I8L2E+KG9yZy53M2MuZG9tLk5vZGUgY29udGV4dE5vZGUKLSAgICAgICAgICwKLSAgICAgIGphdmEubGFuZy5TdHJpbmcgc3RyKTwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIFVzZSBhbiBYUGF0aCBzdHJpbmcgdG8gc2VsZWN0IGEgbm9kZWxpc3QuIFhQYXRoIG5hbWVzcGFjZSBwcmVmaXhlcyBhcmUKLSByZXNvbHZlZCBmcm9tIHRoZSBjb250ZXh0Tm9kZS48L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgc3RhdGljIG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlSXRlcmF0b3I8L2NvZGU+PC90ZD48dGQgd2lkdGg9IiIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNtZXRob2Rfc2VsZWN0Tm9kZUl0ZXJhdG9yIj5zZWxlY3ROb2RlSXRlcmF0b3I8L2E+KG9yZy53M2MuZG9tLk5vZGUgY29udGV4dE5vZGUKLSAgICAgICAgICwKLSAgICAgIGphdmEubGFuZy5TdHJpbmcgc3RyCi0gICAgICAgICAsCi0gICAgICBvcmcudzNjLmRvbS5Ob2RlIG5hbWVzcGFjZU5vZGUpPC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgVXNlIGFuIFhQYXRoIHN0cmluZyB0byBzZWxlY3QgYSBub2RlbGlzdC4gWFBhdGggbmFtZXNwYWNlIHByZWZpeGVzIGFyZQotIHJlc29sdmVkIGZyb20gdGhlIG5hbWVzcGFjZU5vZGUuPC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIHN0YXRpYyBvcmcudzNjLmRvbS5Ob2RlTGlzdDwvY29kZT48L3RkPjx0ZCB3aWR0aD0iIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI21ldGhvZF9zZWxlY3ROb2RlTGlzdCI+c2VsZWN0Tm9kZUxpc3Q8L2E+KG9yZy53M2MuZG9tLk5vZGUgY29udGV4dE5vZGUKLSAgICAgICAgICwKLSAgICAgIGphdmEubGFuZy5TdHJpbmcgc3RyKTwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIFVzZSBhbiBYUGF0aCBzdHJpbmcgdG8gc2VsZWN0IGEgbm9kZWxpc3QuIFhQYXRoIG5hbWVzcGFjZSBwcmVmaXhlcyBhcmUKLSByZXNvbHZlZCBmcm9tIHRoZSBjb250ZXh0Tm9kZS48L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgc3RhdGljIG9yZy53M2MuZG9tLk5vZGVMaXN0PC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSIiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjbWV0aG9kX3NlbGVjdE5vZGVMaXN0Ij5zZWxlY3ROb2RlTGlzdDwvYT4ob3JnLnczYy5kb20uTm9kZSBjb250ZXh0Tm9kZQotICAgICAgICAgLAotICAgICAgamF2YS5sYW5nLlN0cmluZyBzdHIKLSAgICAgICAgICwKLSAgICAgIG9yZy53M2MuZG9tLk5vZGUgbmFtZXNwYWNlTm9kZSk8L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICBVc2UgYW4gWFBhdGggc3RyaW5nIHRvIHNlbGVjdCBhIG5vZGVsaXN0LiBYUGF0aCBuYW1lc3BhY2UgcHJlZml4ZXMgYXJlCi0gcmVzb2x2ZWQgZnJvbSB0aGUgbmFtZXNwYWNlTm9kZS48L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgc3RhdGljIG9yZy53M2MuZG9tLk5vZGU8L2NvZGU+PC90ZD48dGQgd2lkdGg9IiIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNtZXRob2Rfc2VsZWN0U2luZ2xlTm9kZSI+c2VsZWN0U2luZ2xlTm9kZTwvYT4ob3JnLnczYy5kb20uTm9kZSBjb250ZXh0Tm9kZQotICAgICAgICAgLAotICAgICAgamF2YS5sYW5nLlN0cmluZyBzdHIpPC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgVXNlIGFuIFhQYXRoIHN0cmluZyB0byBzZWxlY3QgYSBzaW5nbGUgbm9kZS4gWFBhdGggbmFtZXNwYWNlIHByZWZpeGVzIGFyZQotIHJlc29sdmVkIGZyb20gdGhlIGNvbnRleHQgbm9kZSwgd2hpY2ggbWF5IG5vdCBiZSB3aGF0IHlvdSB3YW50IChzZWUgdGhlCi0gbmV4dCBtZXRob2QpLjwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyBzdGF0aWMgb3JnLnczYy5kb20uTm9kZTwvY29kZT48L3RkPjx0ZCB3aWR0aD0iIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI21ldGhvZF9zZWxlY3RTaW5nbGVOb2RlIj5zZWxlY3RTaW5nbGVOb2RlPC9hPihvcmcudzNjLmRvbS5Ob2RlIGNvbnRleHROb2RlCi0gICAgICAgICAsCi0gICAgICBqYXZhLmxhbmcuU3RyaW5nIHN0cgotICAgICAgICAgLAotICAgICAgb3JnLnczYy5kb20uTm9kZSBuYW1lc3BhY2VOb2RlKTwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIFVzZSBhbiBYUGF0aCBzdHJpbmcgdG8gc2VsZWN0IGEgc2luZ2xlIG5vZGUuIFhQYXRoIG5hbWVzcGFjZSBwcmVmaXhlcyBhcmUKLSByZXNvbHZlZCBmcm9tIHRoZSBuYW1lc3BhY2VOb2RlLjwvdGQ+PC90cj48L3RhYmxlPjxocj48dGFibGUgY29scz0iMiIgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSI+PHRyIGNvbHNwYW49IjIiIHdpZHRoPSIxMDAlIiBiZ2NvbG9yPSIjQ0NDQ0ZGIiBhbGlnbj0ibGVmdCI+PHRkPjxoMj4KLSAgICAgICAgICAgICAgICAgIENvbnN0cnVjdG9yIERldGFpbAotICAgICAgICAgICAgICAgPC9oMj48L3RkPjwvdHI+PC90YWJsZT48aDI+PGEgbmFtZT0iY29uX1hTTFRYUGF0aEhlbHBlciI+WFNMVFhQYXRoSGVscGVyPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIDxzdHJvbmc+WFNMVFhQYXRoSGVscGVyPC9zdHJvbmc+KCk8L2NvZGU+PC9wPjxwPjwvcD48aHI+PHRhYmxlIGNvbHM9IjIiIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiPjx0ciBjb2xzcGFuPSIyIiB3aWR0aD0iMTAwJSIgYmdjb2xvcj0iI0NDQ0NGRiIgYWxpZ249ImxlZnQiPjx0ZD48aDI+Ci0gICAgICAgICAgICAgICAgICBNZXRob2RzIERldGFpbAotICAgICAgICAgICAgICAgPC9oMj48L3RkPjwvdHI+PC90YWJsZT48aDI+PGEgbmFtZT0ibWV0aG9kX2NhbGN1bGF0ZVhQYXRoVG9Ob2RlIj5jYWxjdWxhdGVYUGF0aFRvTm9kZTwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIDxzdHJvbmc+Y2FsY3VsYXRlWFBhdGhUb05vZGU8L3N0cm9uZz4ob3JnLnczYy5kb20uTm9kZSBub2RlKTwvY29kZT48L3A+PHA+PC9wPjxoMz5QYXJhbWV0ZXJzPC9oMz48cD48Y29kZT5ub2RlPC9jb2RlPjwvcD48aDM+UmV0dXJuczwvaDM+PHA+PGNvZGU+amF2YS5sYW5nLlN0cmluZzwvY29kZT48L3A+PGhyPjxoMj48YSBuYW1lPSJtZXRob2RfY29tcGlsZSI+Y29tcGlsZTwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyB2b2lkIDxzdHJvbmc+Y29tcGlsZTwvc3Ryb25nPihqYXZhLmxhbmcuU3RyaW5nIGV4cHJlc3Npb24pPC9jb2RlPjwvcD48cD48L3A+PGgzPlBhcmFtZXRlcnM8L2gzPjxwPjxjb2RlPmV4cHJlc3Npb248L2NvZGU+PC9wPjxoMz5UaHJvd3M6PC9oMz48cD48Y29kZT5qYXZheC54bWwueHBhdGguWFBhdGhFeHByZXNzaW9uRXhjZXB0aW9uPC9jb2RlPjwvcD48aHI+PGgyPjxhIG5hbWU9Im1ldGhvZF9ldmFsIj5ldmFsPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIFhPYmplY3QgPHN0cm9uZz5ldmFsPC9zdHJvbmc+KG9yZy53M2MuZG9tLk5vZGUgY29udGV4dE5vZGUKLSAgICAgICAgICwKLSAgICAgIGphdmEubGFuZy5TdHJpbmcgc3RyKTwvY29kZT48L3A+PHA+RXZhbHVhdGUgWFBhdGggc3RyaW5nIHRvIGFuIFhPYmplY3QuIFVzaW5nIHRoaXMgbWV0aG9kLCBYUGF0aCBuYW1lc3BhY2UKLSBwcmVmaXhlcyB3aWxsIGJlIHJlc29sdmVkIGZyb20gdGhlIG5hbWVzcGFjZU5vZGUuPC9wPjxoMz5QYXJhbWV0ZXJzPC9oMz48cD48Y29kZT5jb250ZXh0Tm9kZTwvY29kZT4gLSBUaGUgbm9kZSB0byBzdGFydCBzZWFyY2hpbmcgZnJvbS48L3A+PHA+PGNvZGU+c3RyPC9jb2RlPiAtIEEgdmFsaWQgWFBhdGggc3RyaW5nLjwvcD48aDM+UmV0dXJuczwvaDM+PHA+PGNvZGU+WE9iamVjdDwvY29kZT4gLSBBbiBYT2JqZWN0LCB3aGljaCBjYW4gYmUgdXNlZCB0byBvYnRhaW4gYSBzdHJpbmcsIG51bWJlciwgICAgICAgICAgbm9kZWxpc3QsIGV0Yywgc2hvdWxkIG5ldmVyIGJlIG51bGwuPC9wPjxoMz5UaHJvd3M6PC9oMz48cD48Y29kZT5qYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uPC9jb2RlPjwvcD48aHI+PGgyPjxhIG5hbWU9Im1ldGhvZF9ldmFsIj5ldmFsPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIFhPYmplY3QgPHN0cm9uZz5ldmFsPC9zdHJvbmc+KG9yZy53M2MuZG9tLk5vZGUgY29udGV4dE5vZGUKLSAgICAgICAgICwKLSAgICAgIGphdmEubGFuZy5TdHJpbmcgc3RyCi0gICAgICAgICAsCi0gICAgICBvcmcudzNjLmRvbS5Ob2RlIG5hbWVzcGFjZU5vZGUpPC9jb2RlPjwvcD48cD5FdmFsdWF0ZSBYUGF0aCBzdHJpbmcgdG8gYW4gWE9iamVjdC4gWFBhdGggbmFtZXNwYWNlIHByZWZpeGVzIGFyZQotIHJlc29sdmVkIGZyb20gdGhlIG5hbWVzcGFjZU5vZGUuIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGlzIGEgbGl0dGxlCi0gc2xvdywgc2luY2UgaXQgY3JlYXRlcyBhIG51bWJlciBvZiBvYmplY3RzIGVhY2ggdGltZSBpdCBpcyBjYWxsZWQuIFRoaXMKLSBjb3VsZCBiZSBvcHRpbWl6ZWQgdG8ga2VlcCB0aGUgc2FtZSBvYmplY3RzIGFyb3VuZCwgYnV0IHRoZW4KLSB0aHJlYWQtc2FmZXR5IGlzc3VlcyB3b3VsZCBhcmlzZS48L3A+PGgzPlBhcmFtZXRlcnM8L2gzPjxwPjxjb2RlPmNvbnRleHROb2RlPC9jb2RlPiAtIFRoZSBub2RlIHRvIHN0YXJ0IHNlYXJjaGluZyBmcm9tLjwvcD48cD48Y29kZT5zdHI8L2NvZGU+IC0gQSB2YWxpZCBYUGF0aCBzdHJpbmcuPC9wPjxwPjxjb2RlPm5hbWVzcGFjZU5vZGU8L2NvZGU+IC0gVGhlIG5vZGUgZnJvbSB3aGljaCBwcmVmaXhlcyBpbiB0aGUgWFBhdGggd2lsbCBiZSByZXNvbHZlZCB0byAgICAgICAgICAgICBuYW1lc3BhY2VzLjwvcD48aDM+UmV0dXJuczwvaDM+PHA+PGNvZGU+WE9iamVjdDwvY29kZT4gLSBBbiBYT2JqZWN0LCB3aGljaCBjYW4gYmUgdXNlZCB0byBvYnRhaW4gYSBzdHJpbmcsIG51bWJlciwgICAgICAgICAgbm9kZWxpc3QsIGV0Yywgc2hvdWxkIG5ldmVyIGJlIG51bGwuPC9wPjxoMz5UaHJvd3M6PC9oMz48cD48Y29kZT5qYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uPC9jb2RlPjwvcD48aHI+PGgyPjxhIG5hbWU9Im1ldGhvZF9ldmFsIj5ldmFsPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIFhPYmplY3QgPHN0cm9uZz5ldmFsPC9zdHJvbmc+KG9yZy53M2MuZG9tLk5vZGUgY29udGV4dE5vZGUKLSAgICAgICAgICwKLSAgICAgIGphdmEubGFuZy5TdHJpbmcgc3RyCi0gICAgICAgICAsCi0gICAgICBQcmVmaXhSZXNvbHZlciBwcmVmaXhSZXNvbHZlcik8L2NvZGU+PC9wPjxwPkV2YWx1YXRlIFhQYXRoIHN0cmluZyB0byBhbiBYT2JqZWN0LiBYUGF0aCBuYW1lc3BhY2UgcHJlZml4ZXMgYXJlCi0gcmVzb2x2ZWQgZnJvbSB0aGUgbmFtZXNwYWNlTm9kZS4gVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgaXMgYSBsaXR0bGUKLSBzbG93LCBzaW5jZSBpdCBjcmVhdGVzIGEgbnVtYmVyIG9mIG9iamVjdHMgZWFjaCB0aW1lIGl0IGlzIGNhbGxlZC4gVGhpcwotIGNvdWxkIGJlIG9wdGltaXplZCB0byBrZWVwIHRoZSBzYW1lIG9iamVjdHMgYXJvdW5kLCBidXQgdGhlbgotIHRocmVhZC1zYWZldHkgaXNzdWVzIHdvdWxkIGFyaXNlLjwvcD48aDM+UGFyYW1ldGVyczwvaDM+PHA+PGNvZGU+Y29udGV4dE5vZGU8L2NvZGU+IC0gVGhlIG5vZGUgdG8gc3RhcnQgc2VhcmNoaW5nIGZyb20uPC9wPjxwPjxjb2RlPnN0cjwvY29kZT4gLSBBIHZhbGlkIFhQYXRoIHN0cmluZy48L3A+PHA+PGNvZGU+cHJlZml4UmVzb2x2ZXI8L2NvZGU+IC0gV2lsbCBiZSBjYWxsZWQgaWYgdGhlIHBhcnNlciBlbmNvdW50ZXJzIG5hbWVzcGFjZSBwcmVmaXhlcywgdG8gICAgICAgICAgICAgcmVzb2x2ZSB0aGUgcHJlZml4ZXMgdG8gVVJMcy48L3A+PGgzPlJldHVybnM8L2gzPjxwPjxjb2RlPlhPYmplY3Q8L2NvZGU+IC0gQW4gWE9iamVjdCwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gb2J0YWluIGEgc3RyaW5nLCBudW1iZXIsICAgICAgICAgIG5vZGVsaXN0LCBldGMsIHNob3VsZCBuZXZlciBiZSBudWxsLjwvcD48aDM+VGhyb3dzOjwvaDM+PHA+PGNvZGU+amF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjwvY29kZT48L3A+PGhyPjxoMj48YSBuYW1lPSJtZXRob2RfZ2V0RnVuY3Rpb25UYWJsZSI+Z2V0RnVuY3Rpb25UYWJsZTwvYT48L2gyPjxwPjxjb2RlPnByb3RlY3RlZCBGdW5jdGlvblRhYmxlIDxzdHJvbmc+Z2V0RnVuY3Rpb25UYWJsZTwvc3Ryb25nPigpPC9jb2RlPjwvcD48cD48L3A+PGgzPlJldHVybnM8L2gzPjxwPjxjb2RlPkZ1bmN0aW9uVGFibGU8L2NvZGU+PC9wPjxocj48aDI+PGEgbmFtZT0ibWV0aG9kX3NlbGVjdE5vZGVJdGVyYXRvciI+c2VsZWN0Tm9kZUl0ZXJhdG9yPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlSXRlcmF0b3IgPHN0cm9uZz5zZWxlY3ROb2RlSXRlcmF0b3I8L3N0cm9uZz4ob3JnLnczYy5kb20uTm9kZSBjb250ZXh0Tm9kZQotICAgICAgICAgLAotICAgICAgamF2YS5sYW5nLlN0cmluZyBzdHIpPC9jb2RlPjwvcD48cD5Vc2UgYW4gWFBhdGggc3RyaW5nIHRvIHNlbGVjdCBhIG5vZGVsaXN0LiBYUGF0aCBuYW1lc3BhY2UgcHJlZml4ZXMgYXJlCi0gcmVzb2x2ZWQgZnJvbSB0aGUgY29udGV4dE5vZGUuPC9wPjxoMz5QYXJhbWV0ZXJzPC9oMz48cD48Y29kZT5jb250ZXh0Tm9kZTwvY29kZT4gLSBUaGUgbm9kZSB0byBzdGFydCBzZWFyY2hpbmcgZnJvbS48L3A+PHA+PGNvZGU+c3RyPC9jb2RlPiAtIEEgdmFsaWQgWFBhdGggc3RyaW5nLjwvcD48aDM+UmV0dXJuczwvaDM+PHA+PGNvZGU+b3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcjwvY29kZT4gLSBBIE5vZGVJdGVyYXRvciwgc2hvdWxkIG5ldmVyIGJlIG51bGwuPC9wPjxoMz5UaHJvd3M6PC9oMz48cD48Y29kZT5qYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uPC9jb2RlPjwvcD48aHI+PGgyPjxhIG5hbWU9Im1ldGhvZF9zZWxlY3ROb2RlSXRlcmF0b3IiPnNlbGVjdE5vZGVJdGVyYXRvcjwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUl0ZXJhdG9yIDxzdHJvbmc+c2VsZWN0Tm9kZUl0ZXJhdG9yPC9zdHJvbmc+KG9yZy53M2MuZG9tLk5vZGUgY29udGV4dE5vZGUKLSAgICAgICAgICwKLSAgICAgIGphdmEubGFuZy5TdHJpbmcgc3RyCi0gICAgICAgICAsCi0gICAgICBvcmcudzNjLmRvbS5Ob2RlIG5hbWVzcGFjZU5vZGUpPC9jb2RlPjwvcD48cD5Vc2UgYW4gWFBhdGggc3RyaW5nIHRvIHNlbGVjdCBhIG5vZGVsaXN0LiBYUGF0aCBuYW1lc3BhY2UgcHJlZml4ZXMgYXJlCi0gcmVzb2x2ZWQgZnJvbSB0aGUgbmFtZXNwYWNlTm9kZS48L3A+PGgzPlBhcmFtZXRlcnM8L2gzPjxwPjxjb2RlPmNvbnRleHROb2RlPC9jb2RlPiAtIFRoZSBub2RlIHRvIHN0YXJ0IHNlYXJjaGluZyBmcm9tLjwvcD48cD48Y29kZT5zdHI8L2NvZGU+IC0gQSB2YWxpZCBYUGF0aCBzdHJpbmcuPC9wPjxwPjxjb2RlPm5hbWVzcGFjZU5vZGU8L2NvZGU+IC0gVGhlIG5vZGUgZnJvbSB3aGljaCBwcmVmaXhlcyBpbiB0aGUgWFBhdGggd2lsbCBiZSByZXNvbHZlZCB0byAgICAgICAgICAgICBuYW1lc3BhY2VzLjwvcD48aDM+UmV0dXJuczwvaDM+PHA+PGNvZGU+b3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcjwvY29kZT4gLSBBIE5vZGVJdGVyYXRvciwgc2hvdWxkIG5ldmVyIGJlIG51bGwuPC9wPjxoMz5UaHJvd3M6PC9oMz48cD48Y29kZT5qYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uPC9jb2RlPjwvcD48aHI+PGgyPjxhIG5hbWU9Im1ldGhvZF9zZWxlY3ROb2RlTGlzdCI+c2VsZWN0Tm9kZUxpc3Q8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgb3JnLnczYy5kb20uTm9kZUxpc3QgPHN0cm9uZz5zZWxlY3ROb2RlTGlzdDwvc3Ryb25nPihvcmcudzNjLmRvbS5Ob2RlIGNvbnRleHROb2RlCi0gICAgICAgICAsCi0gICAgICBqYXZhLmxhbmcuU3RyaW5nIHN0cik8L2NvZGU+PC9wPjxwPlVzZSBhbiBYUGF0aCBzdHJpbmcgdG8gc2VsZWN0IGEgbm9kZWxpc3QuIFhQYXRoIG5hbWVzcGFjZSBwcmVmaXhlcyBhcmUKLSByZXNvbHZlZCBmcm9tIHRoZSBjb250ZXh0Tm9kZS48L3A+PGgzPlBhcmFtZXRlcnM8L2gzPjxwPjxjb2RlPmNvbnRleHROb2RlPC9jb2RlPiAtIFRoZSBub2RlIHRvIHN0YXJ0IHNlYXJjaGluZyBmcm9tLjwvcD48cD48Y29kZT5zdHI8L2NvZGU+IC0gQSB2YWxpZCBYUGF0aCBzdHJpbmcuPC9wPjxoMz5SZXR1cm5zPC9oMz48cD48Y29kZT5vcmcudzNjLmRvbS5Ob2RlTGlzdDwvY29kZT4gLSBBIE5vZGVJdGVyYXRvciwgc2hvdWxkIG5ldmVyIGJlIG51bGwuPC9wPjxoMz5UaHJvd3M6PC9oMz48cD48Y29kZT5qYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uPC9jb2RlPjwvcD48aHI+PGgyPjxhIG5hbWU9Im1ldGhvZF9zZWxlY3ROb2RlTGlzdCI+c2VsZWN0Tm9kZUxpc3Q8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgb3JnLnczYy5kb20uTm9kZUxpc3QgPHN0cm9uZz5zZWxlY3ROb2RlTGlzdDwvc3Ryb25nPihvcmcudzNjLmRvbS5Ob2RlIGNvbnRleHROb2RlCi0gICAgICAgICAsCi0gICAgICBqYXZhLmxhbmcuU3RyaW5nIHN0cgotICAgICAgICAgLAotICAgICAgb3JnLnczYy5kb20uTm9kZSBuYW1lc3BhY2VOb2RlKTwvY29kZT48L3A+PHA+VXNlIGFuIFhQYXRoIHN0cmluZyB0byBzZWxlY3QgYSBub2RlbGlzdC4gWFBhdGggbmFtZXNwYWNlIHByZWZpeGVzIGFyZQotIHJlc29sdmVkIGZyb20gdGhlIG5hbWVzcGFjZU5vZGUuPC9wPjxoMz5QYXJhbWV0ZXJzPC9oMz48cD48Y29kZT5jb250ZXh0Tm9kZTwvY29kZT4gLSBUaGUgbm9kZSB0byBzdGFydCBzZWFyY2hpbmcgZnJvbS48L3A+PHA+PGNvZGU+c3RyPC9jb2RlPiAtIEEgdmFsaWQgWFBhdGggc3RyaW5nLjwvcD48cD48Y29kZT5uYW1lc3BhY2VOb2RlPC9jb2RlPiAtIFRoZSBub2RlIGZyb20gd2hpY2ggcHJlZml4ZXMgaW4gdGhlIFhQYXRoIHdpbGwgYmUgcmVzb2x2ZWQgdG8gICAgICAgICAgICAgbmFtZXNwYWNlcy48L3A+PGgzPlJldHVybnM8L2gzPjxwPjxjb2RlPm9yZy53M2MuZG9tLk5vZGVMaXN0PC9jb2RlPiAtIEEgTm9kZUl0ZXJhdG9yLCBzaG91bGQgbmV2ZXIgYmUgbnVsbC48L3A+PGgzPlRocm93czo8L2gzPjxwPjxjb2RlPmphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb248L2NvZGU+PC9wPjxocj48aDI+PGEgbmFtZT0ibWV0aG9kX3NlbGVjdFNpbmdsZU5vZGUiPnNlbGVjdFNpbmdsZU5vZGU8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgb3JnLnczYy5kb20uTm9kZSA8c3Ryb25nPnNlbGVjdFNpbmdsZU5vZGU8L3N0cm9uZz4ob3JnLnczYy5kb20uTm9kZSBjb250ZXh0Tm9kZQotICAgICAgICAgLAotICAgICAgamF2YS5sYW5nLlN0cmluZyBzdHIpPC9jb2RlPjwvcD48cD5Vc2UgYW4gWFBhdGggc3RyaW5nIHRvIHNlbGVjdCBhIHNpbmdsZSBub2RlLiBYUGF0aCBuYW1lc3BhY2UgcHJlZml4ZXMgYXJlCi0gcmVzb2x2ZWQgZnJvbSB0aGUgY29udGV4dCBub2RlLCB3aGljaCBtYXkgbm90IGJlIHdoYXQgeW91IHdhbnQgKHNlZSB0aGUKLSBuZXh0IG1ldGhvZCkuPC9wPjxoMz5QYXJhbWV0ZXJzPC9oMz48cD48Y29kZT5jb250ZXh0Tm9kZTwvY29kZT4gLSBUaGUgbm9kZSB0byBzdGFydCBzZWFyY2hpbmcgZnJvbS48L3A+PHA+PGNvZGU+c3RyPC9jb2RlPiAtIEEgdmFsaWQgWFBhdGggc3RyaW5nLjwvcD48aDM+UmV0dXJuczwvaDM+PHA+PGNvZGU+b3JnLnczYy5kb20uTm9kZTwvY29kZT4gLSBUaGUgZmlyc3Qgbm9kZSBmb3VuZCB0aGF0IG1hdGNoZXMgdGhlIFhQYXRoLCBvciBudWxsLjwvcD48aDM+VGhyb3dzOjwvaDM+PHA+PGNvZGU+amF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjwvY29kZT48L3A+PGhyPjxoMj48YSBuYW1lPSJtZXRob2Rfc2VsZWN0U2luZ2xlTm9kZSI+c2VsZWN0U2luZ2xlTm9kZTwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyBvcmcudzNjLmRvbS5Ob2RlIDxzdHJvbmc+c2VsZWN0U2luZ2xlTm9kZTwvc3Ryb25nPihvcmcudzNjLmRvbS5Ob2RlIGNvbnRleHROb2RlCi0gICAgICAgICAsCi0gICAgICBqYXZhLmxhbmcuU3RyaW5nIHN0cgotICAgICAgICAgLAotICAgICAgb3JnLnczYy5kb20uTm9kZSBuYW1lc3BhY2VOb2RlKTwvY29kZT48L3A+PHA+VXNlIGFuIFhQYXRoIHN0cmluZyB0byBzZWxlY3QgYSBzaW5nbGUgbm9kZS4gWFBhdGggbmFtZXNwYWNlIHByZWZpeGVzIGFyZQotIHJlc29sdmVkIGZyb20gdGhlIG5hbWVzcGFjZU5vZGUuPC9wPjxoMz5QYXJhbWV0ZXJzPC9oMz48cD48Y29kZT5jb250ZXh0Tm9kZTwvY29kZT4gLSBUaGUgbm9kZSB0byBzdGFydCBzZWFyY2hpbmcgZnJvbS48L3A+PHA+PGNvZGU+c3RyPC9jb2RlPiAtIEEgdmFsaWQgWFBhdGggc3RyaW5nLjwvcD48cD48Y29kZT5uYW1lc3BhY2VOb2RlPC9jb2RlPiAtIFRoZSBub2RlIGZyb20gd2hpY2ggcHJlZml4ZXMgaW4gdGhlIFhQYXRoIHdpbGwgYmUgcmVzb2x2ZWQgdG8gICAgICAgICAgICAgbmFtZXNwYWNlcy48L3A+PGgzPlJldHVybnM8L2gzPjxwPjxjb2RlPm9yZy53M2MuZG9tLk5vZGU8L2NvZGU+IC0gVGhlIGZpcnN0IG5vZGUgZm91bmQgdGhhdCBtYXRjaGVzIHRoZSBYUGF0aCwgb3IgbnVsbC48L3A+PGgzPlRocm93czo8L2gzPjxwPjxjb2RlPmphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb248L2NvZGU+PC9wPjxocj48L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi9kb2MvaHRtbC9vcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLnVpLlhQYXRoVUlNZXNzYWdlcy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uL2RvYy9odG1sL29yZy5lY2xpcHNlLndzdC54bWwueHBhdGgudWkuWFBhdGhVSU1lc3NhZ2VzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MjEyMzEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uL2RvYy9odG1sL29yZy5lY2xpcHNlLndzdC54bWwueHBhdGgudWkuWFBhdGhVSU1lc3NhZ2VzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi08aHRtbD48Ym9keT48cD48Zm9udCBzaXplPSIrMSI+PHN0cm9uZz5QYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwueHBhdGgudWk8L3N0cm9uZz48L2ZvbnQ+PC9wPjxocj48aDI+PGZvbnQgc2l6ZT0iLTEiPjxzdHJvbmc+b3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aTwvc3Ryb25nPjwvZm9udD48YnI+Ci0gICAgICAgICAgICAgICBDbGFzcyBYUGF0aFVJTWVzc2FnZXM8L2gyPjxicj48aHI+PHByZT5wdWJsaWMgY2xhc3MgPHN0cm9uZz5YUGF0aFVJTWVzc2FnZXM8L3N0cm9uZz4KLWV4dGVuZHMgTkxTPC9wcmU+U3RyaW5ncyB1c2VkIGJ5IFhQYXRoIFVJPGhyPjx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIj48dHIgY29scz0iMiIgYmdjb2xvcj0iI0NDQ0NGRiI+PHRkIGNvbHNwYW49IjIiIHdpZHRoPSIxMDAlIj48aDI+RmllbGQgU3VtbWFyeTwvaDI+PC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIHN0YXRpYyAgamF2YS5sYW5nLlN0cmluZzwvY29kZT48L3RkPjx0ZCB3aWR0aD0iODAlIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI2ZpZWxkX1hQYXRoTmF2aWdhdG9yX0NvbnRleHQiPlhQYXRoTmF2aWdhdG9yX0NvbnRleHQ8L2E+PC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgPC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIHN0YXRpYyAgamF2YS5sYW5nLlN0cmluZzwvY29kZT48L3RkPjx0ZCB3aWR0aD0iODAlIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI2ZpZWxkX1hQYXRoTmF2aWdhdG9yX0RvY3VtZW50Ij5YUGF0aE5hdmlnYXRvcl9Eb2N1bWVudDwvYT48L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICA8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSI4MCUiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjZmllbGRfWFBhdGhOYXZpZ2F0b3JfRE9NX1RyZWUiPlhQYXRoTmF2aWdhdG9yX0RPTV9UcmVlPC9hPjwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmc8L2NvZGU+PC90ZD48dGQgd2lkdGg9IjgwJSIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNmaWVsZF9YUGF0aE5hdmlnYXRvcl9FeHByZXNzaW9uIj5YUGF0aE5hdmlnYXRvcl9FeHByZXNzaW9uPC9hPjwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmc8L2NvZGU+PC90ZD48dGQgd2lkdGg9IjgwJSIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNmaWVsZF9YUGF0aE5hdmlnYXRvcl9OYW1lc3BhY2VfUHJlZml4ZXMiPlhQYXRoTmF2aWdhdG9yX05hbWVzcGFjZV9QcmVmaXhlczwvYT48L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICA8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSI4MCUiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjZmllbGRfWFBhdGhOYXZpZ2F0b3JfTmFtZXNwYWNlcyI+WFBhdGhOYXZpZ2F0b3JfTmFtZXNwYWNlczwvYT48L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICA8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSI4MCUiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjZmllbGRfWFBhdGhOYXZpZ2F0b3JfTmFtZXNwYWNlc19UaXAiPlhQYXRoTmF2aWdhdG9yX05hbWVzcGFjZXNfVGlwPC9hPjwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmc8L2NvZGU+PC90ZD48dGQgd2lkdGg9IjgwJSIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNmaWVsZF9YUGF0aE5hdmlnYXRvcl9Ob2RlX2NvdWxkX25vdF9iZV9zZWxlY3RlZCI+WFBhdGhOYXZpZ2F0b3JfTm9kZV9jb3VsZF9ub3RfYmVfc2VsZWN0ZWQ8L2E+PC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgPC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIHN0YXRpYyAgamF2YS5sYW5nLlN0cmluZzwvY29kZT48L3RkPjx0ZCB3aWR0aD0iODAlIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI2ZpZWxkX1hQYXRoTmF2aWdhdG9yX05vdGhpbmdfc2VsZWN0ZWQiPlhQYXRoTmF2aWdhdG9yX05vdGhpbmdfc2VsZWN0ZWQ8L2E+PC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgPC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIHN0YXRpYyAgamF2YS5sYW5nLlN0cmluZzwvY29kZT48L3RkPjx0ZCB3aWR0aD0iODAlIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI2ZpZWxkX1hQYXRoTmF2aWdhdG9yX1JlZnJlc2hfU291cmNlX0RvY3MiPlhQYXRoTmF2aWdhdG9yX1JlZnJlc2hfU291cmNlX0RvY3M8L2E+PC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgPC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIHN0YXRpYyAgamF2YS5sYW5nLlN0cmluZzwvY29kZT48L3RkPjx0ZCB3aWR0aD0iODAlIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI2ZpZWxkX1hQYXRoTmF2aWdhdG9yX1JlZnJlc2hfU291cmNlX0RvY3NfVGlwIj5YUGF0aE5hdmlnYXRvcl9SZWZyZXNoX1NvdXJjZV9Eb2NzX1RpcDwvYT48L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICA8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSI4MCUiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjZmllbGRfWFBhdGhOYXZpZ2F0b3JfUnVuX29uX3NlbGVjdGVkIj5YUGF0aE5hdmlnYXRvcl9SdW5fb25fc2VsZWN0ZWQ8L2E+PC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgPC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIHN0YXRpYyAgamF2YS5sYW5nLlN0cmluZzwvY29kZT48L3RkPjx0ZCB3aWR0aD0iODAlIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI2ZpZWxkX1hQYXRoTmF2aWdhdG9yX1J1bl9YUGF0aF9RdWVyeSI+WFBhdGhOYXZpZ2F0b3JfUnVuX1hQYXRoX1F1ZXJ5PC9hPjwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmc8L2NvZGU+PC90ZD48dGQgd2lkdGg9IjgwJSIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNmaWVsZF9YUGF0aE5hdmlnYXRvcl9TZWxlY3Rfc291cmNlX2ZpcnN0Ij5YUGF0aE5hdmlnYXRvcl9TZWxlY3Rfc291cmNlX2ZpcnN0PC9hPjwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmc8L2NvZGU+PC90ZD48dGQgd2lkdGg9IjgwJSIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNmaWVsZF9YUGF0aE5hdmlnYXRvcl9TZWxlY3Rpb24iPlhQYXRoTmF2aWdhdG9yX1NlbGVjdGlvbjwvYT48L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICA8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSI4MCUiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjZmllbGRfWFBhdGhOYXZpZ2F0b3JfU2hvd19Jbl9Tb3VyY2UiPlhQYXRoTmF2aWdhdG9yX1Nob3dfSW5fU291cmNlPC9hPjwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmc8L2NvZGU+PC90ZD48dGQgd2lkdGg9IjgwJSIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNmaWVsZF9YUGF0aE5hdmlnYXRvcl9TaG93X0luX1NvdXJjZV9UaXAiPlhQYXRoTmF2aWdhdG9yX1Nob3dfSW5fU291cmNlX1RpcDwvYT48L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICA8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSI4MCUiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjZmllbGRfWFBhdGhOYXZpZ2F0b3JfVGV4dCI+WFBhdGhOYXZpZ2F0b3JfVGV4dDwvYT48L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICA8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSI4MCUiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjZmllbGRfWFBhdGhOYXZpZ2F0b3JfWE1MX1NvdXJjZV9Eb2N1bWVudCI+WFBhdGhOYXZpZ2F0b3JfWE1MX1NvdXJjZV9Eb2N1bWVudDwvYT48L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICA8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSI4MCUiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjZmllbGRfWFBhdGhOYXZpZ2F0b3JfWFBhdGhfRXZhbF9GYWlsZWQiPlhQYXRoTmF2aWdhdG9yX1hQYXRoX0V2YWxfRmFpbGVkPC9hPjwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmc8L2NvZGU+PC90ZD48dGQgd2lkdGg9IjgwJSIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNmaWVsZF9YUGF0aE5hdmlnYXRvcl9YUGF0aF9OYXZpZ2F0b3IiPlhQYXRoTmF2aWdhdG9yX1hQYXRoX05hdmlnYXRvcjwvYT48L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICA8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSI4MCUiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjZmllbGRfWFBhdGhOYXZpZ2F0b3JfWFBhdGhfU2hvd19Jbl9Tb3VyY2VfRmFpbGVkIj5YUGF0aE5hdmlnYXRvcl9YUGF0aF9TaG93X0luX1NvdXJjZV9GYWlsZWQ8L2E+PC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgPC90ZD48L3RyPjwvdGFibGU+PGJyPjx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIj48dHIgY29scz0iMiIgYmdjb2xvcj0iI0NDQ0NGRiI+PHRkIGNvbHNwYW49IjIiIHdpZHRoPSIxMDAlIj48aDI+TWV0aG9kIFN1bW1hcnk8L2gyPjwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlJlc291cmNlQnVuZGxlPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSIiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjbWV0aG9kX2dldFJlc291cmNlQnVuZGxlIj5nZXRSZXNvdXJjZUJ1bmRsZTwvYT4oKTwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48L3RhYmxlPjxocj48dGFibGUgY29scz0iMiIgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSI+PHRyIGNvbHNwYW49IjIiIHdpZHRoPSIxMDAlIiBiZ2NvbG9yPSIjQ0NDQ0ZGIiBhbGlnbj0ibGVmdCI+PHRkPjxoMj4KLSAgICAgICAgICAgICAgICAgIEZpZWxkIERldGFpbAotICAgICAgICAgICAgICAgPC9oMj48L3RkPjwvdHI+PC90YWJsZT48aDI+PGEgbmFtZT0iZmllbGRfWFBhdGhOYXZpZ2F0b3JfQ29udGV4dCI+WFBhdGhOYXZpZ2F0b3JfQ29udGV4dDwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmcgPHN0cm9uZz5YUGF0aE5hdmlnYXRvcl9Db250ZXh0PC9zdHJvbmc+PC9jb2RlPjwvcD48aHI+PGgyPjxhIG5hbWU9ImZpZWxkX1hQYXRoTmF2aWdhdG9yX0RvY3VtZW50Ij5YUGF0aE5hdmlnYXRvcl9Eb2N1bWVudDwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmcgPHN0cm9uZz5YUGF0aE5hdmlnYXRvcl9Eb2N1bWVudDwvc3Ryb25nPjwvY29kZT48L3A+PGhyPjxoMj48YSBuYW1lPSJmaWVsZF9YUGF0aE5hdmlnYXRvcl9ET01fVHJlZSI+WFBhdGhOYXZpZ2F0b3JfRE9NX1RyZWU8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nIDxzdHJvbmc+WFBhdGhOYXZpZ2F0b3JfRE9NX1RyZWU8L3N0cm9uZz48L2NvZGU+PC9wPjxocj48aDI+PGEgbmFtZT0iZmllbGRfWFBhdGhOYXZpZ2F0b3JfRXhwcmVzc2lvbiI+WFBhdGhOYXZpZ2F0b3JfRXhwcmVzc2lvbjwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmcgPHN0cm9uZz5YUGF0aE5hdmlnYXRvcl9FeHByZXNzaW9uPC9zdHJvbmc+PC9jb2RlPjwvcD48aHI+PGgyPjxhIG5hbWU9ImZpZWxkX1hQYXRoTmF2aWdhdG9yX05hbWVzcGFjZV9QcmVmaXhlcyI+WFBhdGhOYXZpZ2F0b3JfTmFtZXNwYWNlX1ByZWZpeGVzPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIHN0YXRpYyAgamF2YS5sYW5nLlN0cmluZyA8c3Ryb25nPlhQYXRoTmF2aWdhdG9yX05hbWVzcGFjZV9QcmVmaXhlczwvc3Ryb25nPjwvY29kZT48L3A+PGhyPjxoMj48YSBuYW1lPSJmaWVsZF9YUGF0aE5hdmlnYXRvcl9OYW1lc3BhY2VzIj5YUGF0aE5hdmlnYXRvcl9OYW1lc3BhY2VzPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIHN0YXRpYyAgamF2YS5sYW5nLlN0cmluZyA8c3Ryb25nPlhQYXRoTmF2aWdhdG9yX05hbWVzcGFjZXM8L3N0cm9uZz48L2NvZGU+PC9wPjxocj48aDI+PGEgbmFtZT0iZmllbGRfWFBhdGhOYXZpZ2F0b3JfTmFtZXNwYWNlc19UaXAiPlhQYXRoTmF2aWdhdG9yX05hbWVzcGFjZXNfVGlwPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIHN0YXRpYyAgamF2YS5sYW5nLlN0cmluZyA8c3Ryb25nPlhQYXRoTmF2aWdhdG9yX05hbWVzcGFjZXNfVGlwPC9zdHJvbmc+PC9jb2RlPjwvcD48aHI+PGgyPjxhIG5hbWU9ImZpZWxkX1hQYXRoTmF2aWdhdG9yX05vZGVfY291bGRfbm90X2JlX3NlbGVjdGVkIj5YUGF0aE5hdmlnYXRvcl9Ob2RlX2NvdWxkX25vdF9iZV9zZWxlY3RlZDwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmcgPHN0cm9uZz5YUGF0aE5hdmlnYXRvcl9Ob2RlX2NvdWxkX25vdF9iZV9zZWxlY3RlZDwvc3Ryb25nPjwvY29kZT48L3A+PGhyPjxoMj48YSBuYW1lPSJmaWVsZF9YUGF0aE5hdmlnYXRvcl9Ob3RoaW5nX3NlbGVjdGVkIj5YUGF0aE5hdmlnYXRvcl9Ob3RoaW5nX3NlbGVjdGVkPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIHN0YXRpYyAgamF2YS5sYW5nLlN0cmluZyA8c3Ryb25nPlhQYXRoTmF2aWdhdG9yX05vdGhpbmdfc2VsZWN0ZWQ8L3N0cm9uZz48L2NvZGU+PC9wPjxocj48aDI+PGEgbmFtZT0iZmllbGRfWFBhdGhOYXZpZ2F0b3JfUmVmcmVzaF9Tb3VyY2VfRG9jcyI+WFBhdGhOYXZpZ2F0b3JfUmVmcmVzaF9Tb3VyY2VfRG9jczwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmcgPHN0cm9uZz5YUGF0aE5hdmlnYXRvcl9SZWZyZXNoX1NvdXJjZV9Eb2NzPC9zdHJvbmc+PC9jb2RlPjwvcD48aHI+PGgyPjxhIG5hbWU9ImZpZWxkX1hQYXRoTmF2aWdhdG9yX1JlZnJlc2hfU291cmNlX0RvY3NfVGlwIj5YUGF0aE5hdmlnYXRvcl9SZWZyZXNoX1NvdXJjZV9Eb2NzX1RpcDwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmcgPHN0cm9uZz5YUGF0aE5hdmlnYXRvcl9SZWZyZXNoX1NvdXJjZV9Eb2NzX1RpcDwvc3Ryb25nPjwvY29kZT48L3A+PGhyPjxoMj48YSBuYW1lPSJmaWVsZF9YUGF0aE5hdmlnYXRvcl9SdW5fb25fc2VsZWN0ZWQiPlhQYXRoTmF2aWdhdG9yX1J1bl9vbl9zZWxlY3RlZDwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmcgPHN0cm9uZz5YUGF0aE5hdmlnYXRvcl9SdW5fb25fc2VsZWN0ZWQ8L3N0cm9uZz48L2NvZGU+PC9wPjxocj48aDI+PGEgbmFtZT0iZmllbGRfWFBhdGhOYXZpZ2F0b3JfUnVuX1hQYXRoX1F1ZXJ5Ij5YUGF0aE5hdmlnYXRvcl9SdW5fWFBhdGhfUXVlcnk8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nIDxzdHJvbmc+WFBhdGhOYXZpZ2F0b3JfUnVuX1hQYXRoX1F1ZXJ5PC9zdHJvbmc+PC9jb2RlPjwvcD48aHI+PGgyPjxhIG5hbWU9ImZpZWxkX1hQYXRoTmF2aWdhdG9yX1NlbGVjdF9zb3VyY2VfZmlyc3QiPlhQYXRoTmF2aWdhdG9yX1NlbGVjdF9zb3VyY2VfZmlyc3Q8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nIDxzdHJvbmc+WFBhdGhOYXZpZ2F0b3JfU2VsZWN0X3NvdXJjZV9maXJzdDwvc3Ryb25nPjwvY29kZT48L3A+PGhyPjxoMj48YSBuYW1lPSJmaWVsZF9YUGF0aE5hdmlnYXRvcl9TZWxlY3Rpb24iPlhQYXRoTmF2aWdhdG9yX1NlbGVjdGlvbjwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmcgPHN0cm9uZz5YUGF0aE5hdmlnYXRvcl9TZWxlY3Rpb248L3N0cm9uZz48L2NvZGU+PC9wPjxocj48aDI+PGEgbmFtZT0iZmllbGRfWFBhdGhOYXZpZ2F0b3JfU2hvd19Jbl9Tb3VyY2UiPlhQYXRoTmF2aWdhdG9yX1Nob3dfSW5fU291cmNlPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIHN0YXRpYyAgamF2YS5sYW5nLlN0cmluZyA8c3Ryb25nPlhQYXRoTmF2aWdhdG9yX1Nob3dfSW5fU291cmNlPC9zdHJvbmc+PC9jb2RlPjwvcD48aHI+PGgyPjxhIG5hbWU9ImZpZWxkX1hQYXRoTmF2aWdhdG9yX1Nob3dfSW5fU291cmNlX1RpcCI+WFBhdGhOYXZpZ2F0b3JfU2hvd19Jbl9Tb3VyY2VfVGlwPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIHN0YXRpYyAgamF2YS5sYW5nLlN0cmluZyA8c3Ryb25nPlhQYXRoTmF2aWdhdG9yX1Nob3dfSW5fU291cmNlX1RpcDwvc3Ryb25nPjwvY29kZT48L3A+PGhyPjxoMj48YSBuYW1lPSJmaWVsZF9YUGF0aE5hdmlnYXRvcl9UZXh0Ij5YUGF0aE5hdmlnYXRvcl9UZXh0PC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIHN0YXRpYyAgamF2YS5sYW5nLlN0cmluZyA8c3Ryb25nPlhQYXRoTmF2aWdhdG9yX1RleHQ8L3N0cm9uZz48L2NvZGU+PC9wPjxocj48aDI+PGEgbmFtZT0iZmllbGRfWFBhdGhOYXZpZ2F0b3JfWE1MX1NvdXJjZV9Eb2N1bWVudCI+WFBhdGhOYXZpZ2F0b3JfWE1MX1NvdXJjZV9Eb2N1bWVudDwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmcgPHN0cm9uZz5YUGF0aE5hdmlnYXRvcl9YTUxfU291cmNlX0RvY3VtZW50PC9zdHJvbmc+PC9jb2RlPjwvcD48aHI+PGgyPjxhIG5hbWU9ImZpZWxkX1hQYXRoTmF2aWdhdG9yX1hQYXRoX0V2YWxfRmFpbGVkIj5YUGF0aE5hdmlnYXRvcl9YUGF0aF9FdmFsX0ZhaWxlZDwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmcgPHN0cm9uZz5YUGF0aE5hdmlnYXRvcl9YUGF0aF9FdmFsX0ZhaWxlZDwvc3Ryb25nPjwvY29kZT48L3A+PGhyPjxoMj48YSBuYW1lPSJmaWVsZF9YUGF0aE5hdmlnYXRvcl9YUGF0aF9OYXZpZ2F0b3IiPlhQYXRoTmF2aWdhdG9yX1hQYXRoX05hdmlnYXRvcjwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmcgPHN0cm9uZz5YUGF0aE5hdmlnYXRvcl9YUGF0aF9OYXZpZ2F0b3I8L3N0cm9uZz48L2NvZGU+PC9wPjxocj48aDI+PGEgbmFtZT0iZmllbGRfWFBhdGhOYXZpZ2F0b3JfWFBhdGhfU2hvd19Jbl9Tb3VyY2VfRmFpbGVkIj5YUGF0aE5hdmlnYXRvcl9YUGF0aF9TaG93X0luX1NvdXJjZV9GYWlsZWQ8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nIDxzdHJvbmc+WFBhdGhOYXZpZ2F0b3JfWFBhdGhfU2hvd19Jbl9Tb3VyY2VfRmFpbGVkPC9zdHJvbmc+PC9jb2RlPjwvcD48aHI+PHRhYmxlIGNvbHM9IjIiIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiPjx0ciBjb2xzcGFuPSIyIiB3aWR0aD0iMTAwJSIgYmdjb2xvcj0iI0NDQ0NGRiIgYWxpZ249ImxlZnQiPjx0ZD48aDI+Ci0gICAgICAgICAgICAgICAgICBNZXRob2RzIERldGFpbAotICAgICAgICAgICAgICAgPC9oMj48L3RkPjwvdHI+PC90YWJsZT48aDI+PGEgbmFtZT0ibWV0aG9kX2dldFJlc291cmNlQnVuZGxlIj5nZXRSZXNvdXJjZUJ1bmRsZTwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUgPHN0cm9uZz5nZXRSZXNvdXJjZUJ1bmRsZTwvc3Ryb25nPigpPC9jb2RlPjwvcD48cD48L3A+PGgzPlJldHVybnM8L2gzPjxwPjxjb2RlPmphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTwvY29kZT48L3A+PGhyPjwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uL2RvYy9odG1sL29yZy5lY2xpcHNlLndzdC54bWwueHBhdGgudWkuWFBhdGhWaWV3UGx1Z2luLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuc2RrLmRvY3VtZW50YXRpb24vZG9jL2h0bWwvb3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aS5YUGF0aFZpZXdQbHVnaW4uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM0MzRjMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuc2RrLmRvY3VtZW50YXRpb24vZG9jL2h0bWwvb3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aS5YUGF0aFZpZXdQbHVnaW4uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLTxodG1sPjxib2R5PjxwPjxmb250IHNpemU9IisxIj48c3Ryb25nPlBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aTwvc3Ryb25nPjwvZm9udD48L3A+PGhyPjxoMj48Zm9udCBzaXplPSItMSI+PHN0cm9uZz5vcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLnVpPC9zdHJvbmc+PC9mb250Pjxicj4KLSAgICAgICAgICAgICAgIENsYXNzIFhQYXRoVmlld1BsdWdpbjwvaDI+PGJyPjxocj48cHJlPnB1YmxpYyBjbGFzcyA8c3Ryb25nPlhQYXRoVmlld1BsdWdpbjwvc3Ryb25nPgotZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luPC9wcmU+PGhyPjx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIj48dHIgYmdjb2xvcj0iI0NDQ0NGRiI+PHRkIHdpZHRoPSIxMDAlIj48aDI+Q29uc3RydWN0b3IgU3VtbWFyeTwvaDI+PC90ZD48L3RyPjx0cj48dGQ+PGNvZGU+PHN0cm9uZz48YSBocmVmPSIjY29uX1hQYXRoVmlld1BsdWdpbiI+WFBhdGhWaWV3UGx1Z2luPC9hPjwvc3Ryb25nPigpPC9jb2RlPjwvdGQ+PC90cj48L3RhYmxlPjxicj48dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSI+PHRyIGNvbHM9IjIiIGJnY29sb3I9IiNDQ0NDRkYiPjx0ZCBjb2xzcGFuPSIyIiB3aWR0aD0iMTAwJSI+PGgyPk1ldGhvZCBTdW1tYXJ5PC9oMj48L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLndzdC54bWwueHBhdGgudWkuWFBhdGhWaWV3UGx1Z2luPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSIiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjbWV0aG9kX2dldERlZmF1bHQiPmdldERlZmF1bHQ8L2E+KCk8L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuPC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSIiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjbWV0aG9kX2dldFBsdWdpbklkIj5nZXRQbHVnaW5JZDwvYT4oKTwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU8L2NvZGU+PC90ZD48dGQgd2lkdGg9IiIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNtZXRob2RfZ2V0UmVzb3VyY2VCdW5kbGUiPmdldFJlc291cmNlQnVuZGxlPC9hPigpPC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgUmV0dXJucyB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlPC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSIiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjbWV0aG9kX2dldFJlc291cmNlU3RyaW5nIj5nZXRSZXNvdXJjZVN0cmluZzwvYT4oamF2YS5sYW5nLlN0cmluZyBrZXkpPC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgUmV0dXJucyB0aGUgc3RyaW5nIGZyb20gdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLSBvciAna2V5JyBpZiBub3QgZm91bmQuPC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIENvbnRleHRUeXBlUmVnaXN0cnk8L2NvZGU+PC90ZD48dGQgd2lkdGg9IiIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNtZXRob2RfZ2V0WFBhdGhUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSI+Z2V0WFBhdGhUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeTwvYT4oKTwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIFJldHVybnMgdGhlIHRlbXBsYXRlIGNvbnRleHQgdHlwZSByZWdpc3RyeSBmb3IgeHBhdGg8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgVGVtcGxhdGVTdG9yZTwvY29kZT48L3RkPjx0ZCB3aWR0aD0iIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI21ldGhvZF9nZXRYUGF0aFRlbXBsYXRlU3RvcmUiPmdldFhQYXRoVGVtcGxhdGVTdG9yZTwvYT4oKTwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIFJldHVybnMgdGhlIHRlbXBsYXRlIHN0b3JlIGZvciB0aGUgeHBhdGggdGVtcGxhdGVzLjwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyB2b2lkPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSIiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjbWV0aG9kX2luZm8iPmluZm88L2E+KGphdmEubGFuZy5TdHJpbmcgbWVzc2FnZSk8L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICA8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wcm90ZWN0ZWQgdm9pZDwvY29kZT48L3RkPjx0ZCB3aWR0aD0iIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI21ldGhvZF9pbml0aWFsaXplSW1hZ2VSZWdpc3RyeSI+aW5pdGlhbGl6ZUltYWdlUmVnaXN0cnk8L2E+KEltYWdlUmVnaXN0cnkgcmVnKTwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyB2b2lkPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSIiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjbWV0aG9kX2xvZyI+bG9nPC9hPihqYXZhLmxhbmcuU3RyaW5nIG1lc3NhZ2UKLSAgICAgICAgICwKLSAgICAgIGphdmEubGFuZy5UaHJvd2FibGUgZXgpPC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgPC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIHZvaWQ8L2NvZGU+PC90ZD48dGQgd2lkdGg9IiIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNtZXRob2RfbG9nIj5sb2c8L2E+KGphdmEubGFuZy5UaHJvd2FibGUgZXgpPC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgPC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIHZvaWQ8L2NvZGU+PC90ZD48dGQgd2lkdGg9IiIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNtZXRob2RfcGFydEFjdGl2YXRlZCI+cGFydEFjdGl2YXRlZDwvYT4oSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcGFydFJlZik8L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICA8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgdm9pZDwvY29kZT48L3RkPjx0ZCB3aWR0aD0iIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI21ldGhvZF9wYXJ0QnJvdWdodFRvVG9wIj5wYXJ0QnJvdWdodFRvVG9wPC9hPihJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKTwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyB2b2lkPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSIiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjbWV0aG9kX3BhcnRDbG9zZWQiPnBhcnRDbG9zZWQ8L2E+KElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHBhcnRSZWYpPC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgPC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIHZvaWQ8L2NvZGU+PC90ZD48dGQgd2lkdGg9IiIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNtZXRob2RfcGFydERlYWN0aXZhdGVkIj5wYXJ0RGVhY3RpdmF0ZWQ8L2E+KElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHBhcnRSZWYpPC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgPC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIHZvaWQ8L2NvZGU+PC90ZD48dGQgd2lkdGg9IiIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNtZXRob2RfcGFydEhpZGRlbiI+cGFydEhpZGRlbjwvYT4oSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcGFydFJlZik8L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICA8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgdm9pZDwvY29kZT48L3RkPjx0ZCB3aWR0aD0iIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI21ldGhvZF9wYXJ0SW5wdXRDaGFuZ2VkIj5wYXJ0SW5wdXRDaGFuZ2VkPC9hPihJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKTwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyB2b2lkPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSIiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjbWV0aG9kX3BhcnRPcGVuZWQiPnBhcnRPcGVuZWQ8L2E+KElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHBhcnRSZWYpPC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgPC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIHZvaWQ8L2NvZGU+PC90ZD48dGQgd2lkdGg9IiIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNtZXRob2RfcGFydFZpc2libGUiPnBhcnRWaXNpYmxlPC9hPihJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKTwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyB2b2lkPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSIiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjbWV0aG9kX3N0YXJ0Ij5zdGFydDwvYT4oQnVuZGxlQ29udGV4dCBjb250ZXh0KTwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbjwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyB2b2lkPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSIiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjbWV0aG9kX3N0b3AiPnN0b3A8L2E+KEJ1bmRsZUNvbnRleHQgY29udGV4dCk8L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkPC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIHN0YXRpYyB2b2lkPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSIiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjbWV0aG9kX3Rocm93Q29yZUV4Y2VwdGlvbiI+dGhyb3dDb3JlRXhjZXB0aW9uPC9hPihqYXZhLmxhbmcuU3RyaW5nIG1lc3NhZ2UKLSAgICAgICAgICwKLSAgICAgIGphdmEubGFuZy5UaHJvd2FibGUgdCk8L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICA8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wcm90ZWN0ZWQgdm9pZDwvY29kZT48L3RkPjx0ZCB3aWR0aD0iIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI21ldGhvZF91cGRhdGVYUGF0aE5hdmlnYXRvclZpZXciPnVwZGF0ZVhQYXRoTmF2aWdhdG9yVmlldzwvYT4oSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcGFydFJlZik8L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICA8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgdm9pZDwvY29kZT48L3RkPjx0ZCB3aWR0aD0iIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI21ldGhvZF93YXJuIj53YXJuPC9hPihqYXZhLmxhbmcuU3RyaW5nIG1lc3NhZ2UpPC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgPC90ZD48L3RyPjwvdGFibGU+PGhyPjx0YWJsZSBjb2xzPSIyIiB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIj48dHIgY29sc3Bhbj0iMiIgd2lkdGg9IjEwMCUiIGJnY29sb3I9IiNDQ0NDRkYiIGFsaWduPSJsZWZ0Ij48dGQ+PGgyPgotICAgICAgICAgICAgICAgICAgQ29uc3RydWN0b3IgRGV0YWlsCi0gICAgICAgICAgICAgICA8L2gyPjwvdGQ+PC90cj48L3RhYmxlPjxoMj48YSBuYW1lPSJjb25fWFBhdGhWaWV3UGx1Z2luIj5YUGF0aFZpZXdQbHVnaW48L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgPHN0cm9uZz5YUGF0aFZpZXdQbHVnaW48L3N0cm9uZz4oKTwvY29kZT48L3A+PHA+VGhlIGNvbnN0cnVjdG9yLjwvcD48aHI+PHRhYmxlIGNvbHM9IjIiIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiPjx0ciBjb2xzcGFuPSIyIiB3aWR0aD0iMTAwJSIgYmdjb2xvcj0iI0NDQ0NGRiIgYWxpZ249ImxlZnQiPjx0ZD48aDI+Ci0gICAgICAgICAgICAgICAgICBNZXRob2RzIERldGFpbAotICAgICAgICAgICAgICAgPC9oMj48L3RkPjwvdHI+PC90YWJsZT48aDI+PGEgbmFtZT0ibWV0aG9kX2dldERlZmF1bHQiPmdldERlZmF1bHQ8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgb3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aS5YUGF0aFZpZXdQbHVnaW4gPHN0cm9uZz5nZXREZWZhdWx0PC9zdHJvbmc+KCk8L2NvZGU+PC9wPjxwPlJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS48L3A+PGgzPlJldHVybnM8L2gzPjxwPjxjb2RlPm9yZy5lY2xpcHNlLndzdC54bWwueHBhdGgudWkuWFBhdGhWaWV3UGx1Z2luPC9jb2RlPjwvcD48aHI+PGgyPjxhIG5hbWU9Im1ldGhvZF9nZXRQbHVnaW5JZCI+Z2V0UGx1Z2luSWQ8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgamF2YS5sYW5nLlN0cmluZyA8c3Ryb25nPmdldFBsdWdpbklkPC9zdHJvbmc+KCk8L2NvZGU+PC9wPjxwPjwvcD48aDM+UmV0dXJuczwvaDM+PHA+PGNvZGU+amF2YS5sYW5nLlN0cmluZzwvY29kZT48L3A+PGhyPjxoMj48YSBuYW1lPSJtZXRob2RfZ2V0UmVzb3VyY2VCdW5kbGUiPmdldFJlc291cmNlQnVuZGxlPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZSA8c3Ryb25nPmdldFJlc291cmNlQnVuZGxlPC9zdHJvbmc+KCk8L2NvZGU+PC9wPjxwPlJldHVybnMgdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZTwvcD48aDM+UmV0dXJuczwvaDM+PHA+PGNvZGU+amF2YS51dGlsLlJlc291cmNlQnVuZGxlPC9jb2RlPjwvcD48aHI+PGgyPjxhIG5hbWU9Im1ldGhvZF9nZXRSZXNvdXJjZVN0cmluZyI+Z2V0UmVzb3VyY2VTdHJpbmc8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgamF2YS5sYW5nLlN0cmluZyA8c3Ryb25nPmdldFJlc291cmNlU3RyaW5nPC9zdHJvbmc+KGphdmEubGFuZy5TdHJpbmcga2V5KTwvY29kZT48L3A+PHA+UmV0dXJucyB0aGUgc3RyaW5nIGZyb20gdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLSBvciAna2V5JyBpZiBub3QgZm91bmQuPC9wPjxoMz5QYXJhbWV0ZXJzPC9oMz48cD48Y29kZT5rZXk8L2NvZGU+PC9wPjxoMz5SZXR1cm5zPC9oMz48cD48Y29kZT5qYXZhLmxhbmcuU3RyaW5nPC9jb2RlPjwvcD48aHI+PGgyPjxhIG5hbWU9Im1ldGhvZF9nZXRYUGF0aFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5Ij5nZXRYUGF0aFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5PC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIENvbnRleHRUeXBlUmVnaXN0cnkgPHN0cm9uZz5nZXRYUGF0aFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5PC9zdHJvbmc+KCk8L2NvZGU+PC9wPjxwPlJldHVybnMgdGhlIHRlbXBsYXRlIGNvbnRleHQgdHlwZSByZWdpc3RyeSBmb3IgeHBhdGg8L3A+PGgzPlJldHVybnM8L2gzPjxwPjxjb2RlPkNvbnRleHRUeXBlUmVnaXN0cnk8L2NvZGU+IC0gdGhlIHRlbXBsYXRlIGNvbnRleHQgdHlwZSByZWdpc3RyeSBmb3IgeHBhdGg8L3A+PGhyPjxoMj48YSBuYW1lPSJtZXRob2RfZ2V0WFBhdGhUZW1wbGF0ZVN0b3JlIj5nZXRYUGF0aFRlbXBsYXRlU3RvcmU8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgVGVtcGxhdGVTdG9yZSA8c3Ryb25nPmdldFhQYXRoVGVtcGxhdGVTdG9yZTwvc3Ryb25nPigpPC9jb2RlPjwvcD48cD5SZXR1cm5zIHRoZSB0ZW1wbGF0ZSBzdG9yZSBmb3IgdGhlIHhwYXRoIHRlbXBsYXRlcy48L3A+PGgzPlJldHVybnM8L2gzPjxwPjxjb2RlPlRlbXBsYXRlU3RvcmU8L2NvZGU+IC0gdGhlIHRlbXBsYXRlIHN0b3JlIGZvciB0aGUgeHBhdGggdGVtcGxhdGVzPC9wPjxocj48aDI+PGEgbmFtZT0ibWV0aG9kX2luZm8iPmluZm88L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgdm9pZCA8c3Ryb25nPmluZm88L3N0cm9uZz4oamF2YS5sYW5nLlN0cmluZyBtZXNzYWdlKTwvY29kZT48L3A+PHA+PC9wPjxoMz5QYXJhbWV0ZXJzPC9oMz48cD48Y29kZT5tZXNzYWdlPC9jb2RlPjwvcD48aHI+PGgyPjxhIG5hbWU9Im1ldGhvZF9pbml0aWFsaXplSW1hZ2VSZWdpc3RyeSI+aW5pdGlhbGl6ZUltYWdlUmVnaXN0cnk8L2E+PC9oMj48cD48Y29kZT5wcm90ZWN0ZWQgdm9pZCA8c3Ryb25nPmluaXRpYWxpemVJbWFnZVJlZ2lzdHJ5PC9zdHJvbmc+KEltYWdlUmVnaXN0cnkgcmVnKTwvY29kZT48L3A+PHA+PC9wPjxoMz5QYXJhbWV0ZXJzPC9oMz48cD48Y29kZT5yZWc8L2NvZGU+PC9wPjxocj48aDI+PGEgbmFtZT0ibWV0aG9kX2xvZyI+bG9nPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIHZvaWQgPHN0cm9uZz5sb2c8L3N0cm9uZz4oamF2YS5sYW5nLlN0cmluZyBtZXNzYWdlCi0gICAgICAgICAsCi0gICAgICBqYXZhLmxhbmcuVGhyb3dhYmxlIGV4KTwvY29kZT48L3A+PHA+PC9wPjxoMz5QYXJhbWV0ZXJzPC9oMz48cD48Y29kZT5tZXNzYWdlPC9jb2RlPjwvcD48cD48Y29kZT5leDwvY29kZT48L3A+PGhyPjxoMj48YSBuYW1lPSJtZXRob2RfbG9nIj5sb2c8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgdm9pZCA8c3Ryb25nPmxvZzwvc3Ryb25nPihqYXZhLmxhbmcuVGhyb3dhYmxlIGV4KTwvY29kZT48L3A+PHA+PC9wPjxoMz5QYXJhbWV0ZXJzPC9oMz48cD48Y29kZT5leDwvY29kZT48L3A+PGhyPjxoMj48YSBuYW1lPSJtZXRob2RfcGFydEFjdGl2YXRlZCI+cGFydEFjdGl2YXRlZDwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyB2b2lkIDxzdHJvbmc+cGFydEFjdGl2YXRlZDwvc3Ryb25nPihJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKTwvY29kZT48L3A+PHA+PC9wPjxoMz5QYXJhbWV0ZXJzPC9oMz48cD48Y29kZT5wYXJ0UmVmPC9jb2RlPjwvcD48aHI+PGgyPjxhIG5hbWU9Im1ldGhvZF9wYXJ0QnJvdWdodFRvVG9wIj5wYXJ0QnJvdWdodFRvVG9wPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIHZvaWQgPHN0cm9uZz5wYXJ0QnJvdWdodFRvVG9wPC9zdHJvbmc+KElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHBhcnRSZWYpPC9jb2RlPjwvcD48cD48L3A+PGgzPlBhcmFtZXRlcnM8L2gzPjxwPjxjb2RlPnBhcnRSZWY8L2NvZGU+PC9wPjxocj48aDI+PGEgbmFtZT0ibWV0aG9kX3BhcnRDbG9zZWQiPnBhcnRDbG9zZWQ8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgdm9pZCA8c3Ryb25nPnBhcnRDbG9zZWQ8L3N0cm9uZz4oSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcGFydFJlZik8L2NvZGU+PC9wPjxwPjwvcD48aDM+UGFyYW1ldGVyczwvaDM+PHA+PGNvZGU+cGFydFJlZjwvY29kZT48L3A+PGhyPjxoMj48YSBuYW1lPSJtZXRob2RfcGFydERlYWN0aXZhdGVkIj5wYXJ0RGVhY3RpdmF0ZWQ8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgdm9pZCA8c3Ryb25nPnBhcnREZWFjdGl2YXRlZDwvc3Ryb25nPihJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKTwvY29kZT48L3A+PHA+PC9wPjxoMz5QYXJhbWV0ZXJzPC9oMz48cD48Y29kZT5wYXJ0UmVmPC9jb2RlPjwvcD48aHI+PGgyPjxhIG5hbWU9Im1ldGhvZF9wYXJ0SGlkZGVuIj5wYXJ0SGlkZGVuPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIHZvaWQgPHN0cm9uZz5wYXJ0SGlkZGVuPC9zdHJvbmc+KElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHBhcnRSZWYpPC9jb2RlPjwvcD48cD48L3A+PGgzPlBhcmFtZXRlcnM8L2gzPjxwPjxjb2RlPnBhcnRSZWY8L2NvZGU+PC9wPjxocj48aDI+PGEgbmFtZT0ibWV0aG9kX3BhcnRJbnB1dENoYW5nZWQiPnBhcnRJbnB1dENoYW5nZWQ8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgdm9pZCA8c3Ryb25nPnBhcnRJbnB1dENoYW5nZWQ8L3N0cm9uZz4oSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcGFydFJlZik8L2NvZGU+PC9wPjxwPjwvcD48aDM+UGFyYW1ldGVyczwvaDM+PHA+PGNvZGU+cGFydFJlZjwvY29kZT48L3A+PGhyPjxoMj48YSBuYW1lPSJtZXRob2RfcGFydE9wZW5lZCI+cGFydE9wZW5lZDwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyB2b2lkIDxzdHJvbmc+cGFydE9wZW5lZDwvc3Ryb25nPihJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKTwvY29kZT48L3A+PHA+PC9wPjxoMz5QYXJhbWV0ZXJzPC9oMz48cD48Y29kZT5wYXJ0UmVmPC9jb2RlPjwvcD48aHI+PGgyPjxhIG5hbWU9Im1ldGhvZF9wYXJ0VmlzaWJsZSI+cGFydFZpc2libGU8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgdm9pZCA8c3Ryb25nPnBhcnRWaXNpYmxlPC9zdHJvbmc+KElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHBhcnRSZWYpPC9jb2RlPjwvcD48cD48L3A+PGgzPlBhcmFtZXRlcnM8L2gzPjxwPjxjb2RlPnBhcnRSZWY8L2NvZGU+PC9wPjxocj48aDI+PGEgbmFtZT0ibWV0aG9kX3N0YXJ0Ij5zdGFydDwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyB2b2lkIDxzdHJvbmc+c3RhcnQ8L3N0cm9uZz4oQnVuZGxlQ29udGV4dCBjb250ZXh0KTwvY29kZT48L3A+PHA+VGhpcyBtZXRob2QgaXMgY2FsbGVkIHVwb24gcGx1Zy1pbiBhY3RpdmF0aW9uPC9wPjxoMz5QYXJhbWV0ZXJzPC9oMz48cD48Y29kZT5jb250ZXh0PC9jb2RlPjwvcD48aDM+VGhyb3dzOjwvaDM+PHA+PGNvZGU+amF2YS5sYW5nLkV4Y2VwdGlvbjwvY29kZT48L3A+PGhyPjxoMj48YSBuYW1lPSJtZXRob2Rfc3RvcCI+c3RvcDwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyB2b2lkIDxzdHJvbmc+c3RvcDwvc3Ryb25nPihCdW5kbGVDb250ZXh0IGNvbnRleHQpPC9jb2RlPjwvcD48cD5UaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkPC9wPjxoMz5QYXJhbWV0ZXJzPC9oMz48cD48Y29kZT5jb250ZXh0PC9jb2RlPjwvcD48aDM+VGhyb3dzOjwvaDM+PHA+PGNvZGU+amF2YS5sYW5nLkV4Y2VwdGlvbjwvY29kZT48L3A+PGhyPjxoMj48YSBuYW1lPSJtZXRob2RfdGhyb3dDb3JlRXhjZXB0aW9uIj50aHJvd0NvcmVFeGNlcHRpb248L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgdm9pZCA8c3Ryb25nPnRocm93Q29yZUV4Y2VwdGlvbjwvc3Ryb25nPihqYXZhLmxhbmcuU3RyaW5nIG1lc3NhZ2UKLSAgICAgICAgICwKLSAgICAgIGphdmEubGFuZy5UaHJvd2FibGUgdCk8L2NvZGU+PC9wPjxwPjwvcD48aDM+UGFyYW1ldGVyczwvaDM+PHA+PGNvZGU+bWVzc2FnZTwvY29kZT48L3A+PHA+PGNvZGU+dDwvY29kZT48L3A+PGgzPlRocm93czo8L2gzPjxwPjxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+PC9wPjxocj48aDI+PGEgbmFtZT0ibWV0aG9kX3VwZGF0ZVhQYXRoTmF2aWdhdG9yVmlldyI+dXBkYXRlWFBhdGhOYXZpZ2F0b3JWaWV3PC9hPjwvaDI+PHA+PGNvZGU+cHJvdGVjdGVkIHZvaWQgPHN0cm9uZz51cGRhdGVYUGF0aE5hdmlnYXRvclZpZXc8L3N0cm9uZz4oSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcGFydFJlZik8L2NvZGU+PC9wPjxwPjwvcD48aDM+UGFyYW1ldGVyczwvaDM+PHA+PGNvZGU+cGFydFJlZjwvY29kZT48L3A+PGhyPjxoMj48YSBuYW1lPSJtZXRob2Rfd2FybiI+d2FybjwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyB2b2lkIDxzdHJvbmc+d2Fybjwvc3Ryb25nPihqYXZhLmxhbmcuU3RyaW5nIG1lc3NhZ2UpPC9jb2RlPjwvcD48cD48L3A+PGgzPlBhcmFtZXRlcnM8L2gzPjxwPjxjb2RlPm1lc3NhZ2U8L2NvZGU+PC9wPjxocj48L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi9kb2MvaHRtbC9vcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLnVpLnZpZXdzLkRPTU5vZGVMYWJlbFByb3ZpZGVyLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuc2RrLmRvY3VtZW50YXRpb24vZG9jL2h0bWwvb3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aS52aWV3cy5ET01Ob2RlTGFiZWxQcm92aWRlci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDU5NmQzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi9kb2MvaHRtbC9vcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLnVpLnZpZXdzLkRPTU5vZGVMYWJlbFByb3ZpZGVyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08aHRtbD48Ym9keT48cD48Zm9udCBzaXplPSIrMSI+PHN0cm9uZz5QYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwueHBhdGgudWkudmlld3M8L3N0cm9uZz48L2ZvbnQ+PC9wPjxocj48aDI+PGZvbnQgc2l6ZT0iLTEiPjxzdHJvbmc+b3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aS52aWV3czwvc3Ryb25nPjwvZm9udD48YnI+Ci0gICAgICAgICAgICAgICBDbGFzcyBET01Ob2RlTGFiZWxQcm92aWRlcjwvaDI+PGJyPjxocj48cHJlPnB1YmxpYyBjbGFzcyA8c3Ryb25nPkRPTU5vZGVMYWJlbFByb3ZpZGVyPC9zdHJvbmc+Ci1leHRlbmRzIExhYmVsUHJvdmlkZXI8L3ByZT48aHI+PHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiPjx0ciBiZ2NvbG9yPSIjQ0NDQ0ZGIj48dGQgd2lkdGg9IjEwMCUiPjxoMj5Db25zdHJ1Y3RvciBTdW1tYXJ5PC9oMj48L3RkPjwvdHI+PHRyPjx0ZD48Y29kZT48c3Ryb25nPjxhIGhyZWY9IiNjb25fRE9NTm9kZUxhYmVsUHJvdmlkZXIiPkRPTU5vZGVMYWJlbFByb3ZpZGVyPC9hPjwvc3Ryb25nPigpPC9jb2RlPjwvdGQ+PC90cj48L3RhYmxlPjxicj48dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSI+PHRyIGNvbHM9IjIiIGJnY29sb3I9IiNDQ0NDRkYiPjx0ZCBjb2xzcGFuPSIyIiB3aWR0aD0iMTAwJSI+PGgyPk1ldGhvZCBTdW1tYXJ5PC9oMj48L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgSW1hZ2U8L2NvZGU+PC90ZD48dGQgd2lkdGg9IiIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNtZXRob2RfZ2V0SW1hZ2UiPmdldEltYWdlPC9hPihqYXZhLmxhbmcuT2JqZWN0IGVsZW1lbnQpPC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgPC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIGphdmEubGFuZy5TdHJpbmc8L2NvZGU+PC90ZD48dGQgd2lkdGg9IiIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNtZXRob2RfZ2V0VGV4dCI+Z2V0VGV4dDwvYT4oamF2YS5sYW5nLk9iamVjdCBlbGVtZW50KTwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48L3RhYmxlPjxocj48dGFibGUgY29scz0iMiIgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSI+PHRyIGNvbHNwYW49IjIiIHdpZHRoPSIxMDAlIiBiZ2NvbG9yPSIjQ0NDQ0ZGIiBhbGlnbj0ibGVmdCI+PHRkPjxoMj4KLSAgICAgICAgICAgICAgICAgIENvbnN0cnVjdG9yIERldGFpbAotICAgICAgICAgICAgICAgPC9oMj48L3RkPjwvdHI+PC90YWJsZT48aDI+PGEgbmFtZT0iY29uX0RPTU5vZGVMYWJlbFByb3ZpZGVyIj5ET01Ob2RlTGFiZWxQcm92aWRlcjwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyA8c3Ryb25nPkRPTU5vZGVMYWJlbFByb3ZpZGVyPC9zdHJvbmc+KCk8L2NvZGU+PC9wPjxwPjwvcD48aHI+PHRhYmxlIGNvbHM9IjIiIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiPjx0ciBjb2xzcGFuPSIyIiB3aWR0aD0iMTAwJSIgYmdjb2xvcj0iI0NDQ0NGRiIgYWxpZ249ImxlZnQiPjx0ZD48aDI+Ci0gICAgICAgICAgICAgICAgICBNZXRob2RzIERldGFpbAotICAgICAgICAgICAgICAgPC9oMj48L3RkPjwvdHI+PC90YWJsZT48aDI+PGEgbmFtZT0ibWV0aG9kX2dldEltYWdlIj5nZXRJbWFnZTwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyBJbWFnZSA8c3Ryb25nPmdldEltYWdlPC9zdHJvbmc+KGphdmEubGFuZy5PYmplY3QgZWxlbWVudCk8L2NvZGU+PC9wPjxwPjwvcD48aDM+UGFyYW1ldGVyczwvaDM+PHA+PGNvZGU+ZWxlbWVudDwvY29kZT48L3A+PGgzPlJldHVybnM8L2gzPjxwPjxjb2RlPkltYWdlPC9jb2RlPjwvcD48aHI+PGgyPjxhIG5hbWU9Im1ldGhvZF9nZXRUZXh0Ij5nZXRUZXh0PC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIGphdmEubGFuZy5TdHJpbmcgPHN0cm9uZz5nZXRUZXh0PC9zdHJvbmc+KGphdmEubGFuZy5PYmplY3QgZWxlbWVudCk8L2NvZGU+PC9wPjxwPjwvcD48aDM+UGFyYW1ldGVyczwvaDM+PHA+PGNvZGU+ZWxlbWVudDwvY29kZT48L3A+PGgzPlJldHVybnM8L2gzPjxwPjxjb2RlPmphdmEubGFuZy5TdHJpbmc8L2NvZGU+PC9wPjxocj48L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi9kb2MvaHRtbC9vcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLnVpLnZpZXdzLkRPTVRyZWVDb250ZW50UHJvdmlkZXIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi9kb2MvaHRtbC9vcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLnVpLnZpZXdzLkRPTVRyZWVDb250ZW50UHJvdmlkZXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VhOTliMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuc2RrLmRvY3VtZW50YXRpb24vZG9jL2h0bWwvb3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aS52aWV3cy5ET01UcmVlQ29udGVudFByb3ZpZGVyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08aHRtbD48Ym9keT48cD48Zm9udCBzaXplPSIrMSI+PHN0cm9uZz5QYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwueHBhdGgudWkudmlld3M8L3N0cm9uZz48L2ZvbnQ+PC9wPjxocj48aDI+PGZvbnQgc2l6ZT0iLTEiPjxzdHJvbmc+b3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aS52aWV3czwvc3Ryb25nPjwvZm9udD48YnI+Ci0gICAgICAgICAgICAgICBDbGFzcyBET01UcmVlQ29udGVudFByb3ZpZGVyPC9oMj48YnI+PGhyPjxwcmU+cHVibGljIGNsYXNzIDxzdHJvbmc+RE9NVHJlZUNvbnRlbnRQcm92aWRlcjwvc3Ryb25nPgotZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0PC9wcmU+PGhyPjx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIj48dHIgY29scz0iMiIgYmdjb2xvcj0iI0NDQ0NGRiI+PHRkIGNvbHNwYW49IjIiIHdpZHRoPSIxMDAlIj48aDI+RmllbGQgU3VtbWFyeTwvaDI+PC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cGFja2FnZS1wcml2YXRlIG9yZy53M2MuZG9tLk5vZGU8L2NvZGU+PC90ZD48dGQgd2lkdGg9IjgwJSIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNmaWVsZF9ub2RlIj5ub2RlPC9hPjwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnBhY2thZ2UtcHJpdmF0ZSBzdGF0aWMgIGphdmEubGFuZy5PYmplY3RbXTwvY29kZT48L3RkPjx0ZCB3aWR0aD0iODAlIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI2ZpZWxkX05PVEhJTkciPk5PVEhJTkc8L2E+PC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgPC90ZD48L3RyPjwvdGFibGU+PGJyPjx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIj48dHIgYmdjb2xvcj0iI0NDQ0NGRiI+PHRkIHdpZHRoPSIxMDAlIj48aDI+Q29uc3RydWN0b3IgU3VtbWFyeTwvaDI+PC90ZD48L3RyPjx0cj48dGQ+PGNvZGU+PHN0cm9uZz48YSBocmVmPSIjY29uX0RPTVRyZWVDb250ZW50UHJvdmlkZXIiPkRPTVRyZWVDb250ZW50UHJvdmlkZXI8L2E+PC9zdHJvbmc+KCk8L2NvZGU+PC90ZD48L3RyPjwvdGFibGU+PGJyPjx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIj48dHIgY29scz0iMiIgYmdjb2xvcj0iI0NDQ0NGRiI+PHRkIGNvbHNwYW49IjIiIHdpZHRoPSIxMDAlIj48aDI+TWV0aG9kIFN1bW1hcnk8L2gyPjwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyB2b2lkPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSIiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjbWV0aG9kX2Rpc3Bvc2UiPmRpc3Bvc2U8L2E+KCk8L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICA8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgamF2YS5sYW5nLk9iamVjdFtdPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSIiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjbWV0aG9kX2dldENoaWxkcmVuIj5nZXRDaGlsZHJlbjwvYT4oamF2YS5sYW5nLk9iamVjdCBwYXJlbnRFbGVtZW50KTwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0W108L2NvZGU+PC90ZD48dGQgd2lkdGg9IiIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNtZXRob2RfZ2V0RWxlbWVudHMiPmdldEVsZW1lbnRzPC9hPihqYXZhLmxhbmcuT2JqZWN0IGlucHV0RWxlbWVudCk8L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICA8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgamF2YS5sYW5nLk9iamVjdDwvY29kZT48L3RkPjx0ZCB3aWR0aD0iIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI21ldGhvZF9nZXRQYXJlbnQiPmdldFBhcmVudDwvYT4oamF2YS5sYW5nLk9iamVjdCBlbGVtZW50KTwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyBib29sZWFuPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSIiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjbWV0aG9kX2hhc0NoaWxkcmVuIj5oYXNDaGlsZHJlbjwvYT4oamF2YS5sYW5nLk9iamVjdCBlbGVtZW50KTwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyB2b2lkPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSIiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjbWV0aG9kX2lucHV0Q2hhbmdlZCI+aW5wdXRDaGFuZ2VkPC9hPihWaWV3ZXIgdmlld2VyCi0gICAgICAgICAsCi0gICAgICBqYXZhLmxhbmcuT2JqZWN0IG9sZElucHV0Ci0gICAgICAgICAsCi0gICAgICBqYXZhLmxhbmcuT2JqZWN0IG5ld0lucHV0KTwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48L3RhYmxlPjxocj48dGFibGUgY29scz0iMiIgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSI+PHRyIGNvbHNwYW49IjIiIHdpZHRoPSIxMDAlIiBiZ2NvbG9yPSIjQ0NDQ0ZGIiBhbGlnbj0ibGVmdCI+PHRkPjxoMj4KLSAgICAgICAgICAgICAgICAgIEZpZWxkIERldGFpbAotICAgICAgICAgICAgICAgPC9oMj48L3RkPjwvdHI+PC90YWJsZT48aDI+PGEgbmFtZT0iZmllbGRfbm9kZSI+bm9kZTwvYT48L2gyPjxwPjxjb2RlPnBhY2thZ2UtcHJpdmF0ZSBvcmcudzNjLmRvbS5Ob2RlIDxzdHJvbmc+bm9kZTwvc3Ryb25nPjwvY29kZT48L3A+PGhyPjxoMj48YSBuYW1lPSJmaWVsZF9OT1RISU5HIj5OT1RISU5HPC9hPjwvaDI+PHA+PGNvZGU+cGFja2FnZS1wcml2YXRlIHN0YXRpYyAgamF2YS5sYW5nLk9iamVjdFtdIDxzdHJvbmc+Tk9USElORzwvc3Ryb25nPjwvY29kZT48L3A+PGhyPjx0YWJsZSBjb2xzPSIyIiB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIj48dHIgY29sc3Bhbj0iMiIgd2lkdGg9IjEwMCUiIGJnY29sb3I9IiNDQ0NDRkYiIGFsaWduPSJsZWZ0Ij48dGQ+PGgyPgotICAgICAgICAgICAgICAgICAgQ29uc3RydWN0b3IgRGV0YWlsCi0gICAgICAgICAgICAgICA8L2gyPjwvdGQ+PC90cj48L3RhYmxlPjxoMj48YSBuYW1lPSJjb25fRE9NVHJlZUNvbnRlbnRQcm92aWRlciI+RE9NVHJlZUNvbnRlbnRQcm92aWRlcjwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyA8c3Ryb25nPkRPTVRyZWVDb250ZW50UHJvdmlkZXI8L3N0cm9uZz4oKTwvY29kZT48L3A+PHA+PC9wPjxocj48dGFibGUgY29scz0iMiIgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSI+PHRyIGNvbHNwYW49IjIiIHdpZHRoPSIxMDAlIiBiZ2NvbG9yPSIjQ0NDQ0ZGIiBhbGlnbj0ibGVmdCI+PHRkPjxoMj4KLSAgICAgICAgICAgICAgICAgIE1ldGhvZHMgRGV0YWlsCi0gICAgICAgICAgICAgICA8L2gyPjwvdGQ+PC90cj48L3RhYmxlPjxoMj48YSBuYW1lPSJtZXRob2RfZGlzcG9zZSI+ZGlzcG9zZTwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyB2b2lkIDxzdHJvbmc+ZGlzcG9zZTwvc3Ryb25nPigpPC9jb2RlPjwvcD48cD48L3A+PGhyPjxoMj48YSBuYW1lPSJtZXRob2RfZ2V0Q2hpbGRyZW4iPmdldENoaWxkcmVuPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIGphdmEubGFuZy5PYmplY3RbXSA8c3Ryb25nPmdldENoaWxkcmVuPC9zdHJvbmc+KGphdmEubGFuZy5PYmplY3QgcGFyZW50RWxlbWVudCk8L2NvZGU+PC9wPjxwPjwvcD48aDM+UGFyYW1ldGVyczwvaDM+PHA+PGNvZGU+cGFyZW50RWxlbWVudDwvY29kZT48L3A+PGgzPlJldHVybnM8L2gzPjxwPjxjb2RlPmphdmEubGFuZy5PYmplY3RbXTwvY29kZT48L3A+PGhyPjxoMj48YSBuYW1lPSJtZXRob2RfZ2V0RWxlbWVudHMiPmdldEVsZW1lbnRzPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIGphdmEubGFuZy5PYmplY3RbXSA8c3Ryb25nPmdldEVsZW1lbnRzPC9zdHJvbmc+KGphdmEubGFuZy5PYmplY3QgaW5wdXRFbGVtZW50KTwvY29kZT48L3A+PHA+PC9wPjxoMz5QYXJhbWV0ZXJzPC9oMz48cD48Y29kZT5pbnB1dEVsZW1lbnQ8L2NvZGU+PC9wPjxoMz5SZXR1cm5zPC9oMz48cD48Y29kZT5qYXZhLmxhbmcuT2JqZWN0W108L2NvZGU+PC9wPjxocj48aDI+PGEgbmFtZT0ibWV0aG9kX2dldFBhcmVudCI+Z2V0UGFyZW50PC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIGphdmEubGFuZy5PYmplY3QgPHN0cm9uZz5nZXRQYXJlbnQ8L3N0cm9uZz4oamF2YS5sYW5nLk9iamVjdCBlbGVtZW50KTwvY29kZT48L3A+PHA+PC9wPjxoMz5QYXJhbWV0ZXJzPC9oMz48cD48Y29kZT5lbGVtZW50PC9jb2RlPjwvcD48aDM+UmV0dXJuczwvaDM+PHA+PGNvZGU+amF2YS5sYW5nLk9iamVjdDwvY29kZT48L3A+PGhyPjxoMj48YSBuYW1lPSJtZXRob2RfaGFzQ2hpbGRyZW4iPmhhc0NoaWxkcmVuPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIGJvb2xlYW4gPHN0cm9uZz5oYXNDaGlsZHJlbjwvc3Ryb25nPihqYXZhLmxhbmcuT2JqZWN0IGVsZW1lbnQpPC9jb2RlPjwvcD48cD48L3A+PGgzPlBhcmFtZXRlcnM8L2gzPjxwPjxjb2RlPmVsZW1lbnQ8L2NvZGU+PC9wPjxoMz5SZXR1cm5zPC9oMz48cD48Y29kZT5ib29sZWFuPC9jb2RlPjwvcD48aHI+PGgyPjxhIG5hbWU9Im1ldGhvZF9pbnB1dENoYW5nZWQiPmlucHV0Q2hhbmdlZDwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyB2b2lkIDxzdHJvbmc+aW5wdXRDaGFuZ2VkPC9zdHJvbmc+KFZpZXdlciB2aWV3ZXIKLSAgICAgICAgICwKLSAgICAgIGphdmEubGFuZy5PYmplY3Qgb2xkSW5wdXQKLSAgICAgICAgICwKLSAgICAgIGphdmEubGFuZy5PYmplY3QgbmV3SW5wdXQpPC9jb2RlPjwvcD48cD48L3A+PGgzPlBhcmFtZXRlcnM8L2gzPjxwPjxjb2RlPnZpZXdlcjwvY29kZT48L3A+PHA+PGNvZGU+b2xkSW5wdXQ8L2NvZGU+PC9wPjxwPjxjb2RlPm5ld0lucHV0PC9jb2RlPjwvcD48aHI+PC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuc2RrLmRvY3VtZW50YXRpb24vZG9jL2h0bWwvb3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aS52aWV3cy5ET01WaWV3ZXJGaWx0ZXIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi9kb2MvaHRtbC9vcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLnVpLnZpZXdzLkRPTVZpZXdlckZpbHRlci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzI0YWNmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi9kb2MvaHRtbC9vcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLnVpLnZpZXdzLkRPTVZpZXdlckZpbHRlci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPGh0bWw+PGJvZHk+PHA+PGZvbnQgc2l6ZT0iKzEiPjxzdHJvbmc+UGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLnVpLnZpZXdzPC9zdHJvbmc+PC9mb250PjwvcD48aHI+PGgyPjxmb250IHNpemU9Ii0xIj48c3Ryb25nPm9yZy5lY2xpcHNlLndzdC54bWwueHBhdGgudWkudmlld3M8L3N0cm9uZz48L2ZvbnQ+PGJyPgotICAgICAgICAgICAgICAgQ2xhc3MgRE9NVmlld2VyRmlsdGVyPC9oMj48YnI+PGhyPjxwcmU+cHVibGljIGNsYXNzIDxzdHJvbmc+RE9NVmlld2VyRmlsdGVyPC9zdHJvbmc+Ci1leHRlbmRzIFZpZXdlckZpbHRlcjwvcHJlPjxocj48dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSI+PHRyIGJnY29sb3I9IiNDQ0NDRkYiPjx0ZCB3aWR0aD0iMTAwJSI+PGgyPkNvbnN0cnVjdG9yIFN1bW1hcnk8L2gyPjwvdGQ+PC90cj48dHI+PHRkPjxjb2RlPjxzdHJvbmc+PGEgaHJlZj0iI2Nvbl9ET01WaWV3ZXJGaWx0ZXIiPkRPTVZpZXdlckZpbHRlcjwvYT48L3N0cm9uZz4oKTwvY29kZT48L3RkPjwvdHI+PC90YWJsZT48YnI+PHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiPjx0ciBjb2xzPSIyIiBiZ2NvbG9yPSIjQ0NDQ0ZGIj48dGQgY29sc3Bhbj0iMiIgd2lkdGg9IjEwMCUiPjxoMj5NZXRob2QgU3VtbWFyeTwvaDI+PC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIGJvb2xlYW48L2NvZGU+PC90ZD48dGQgd2lkdGg9IiIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNtZXRob2Rfc2VsZWN0Ij5zZWxlY3Q8L2E+KFZpZXdlciB2aWV3ZXIKLSAgICAgICAgICwKLSAgICAgIGphdmEubGFuZy5PYmplY3QgcGFyZW50RWxlbWVudAotICAgICAgICAgLAotICAgICAgamF2YS5sYW5nLk9iamVjdCBlbGVtZW50KTwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48L3RhYmxlPjxocj48dGFibGUgY29scz0iMiIgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSI+PHRyIGNvbHNwYW49IjIiIHdpZHRoPSIxMDAlIiBiZ2NvbG9yPSIjQ0NDQ0ZGIiBhbGlnbj0ibGVmdCI+PHRkPjxoMj4KLSAgICAgICAgICAgICAgICAgIENvbnN0cnVjdG9yIERldGFpbAotICAgICAgICAgICAgICAgPC9oMj48L3RkPjwvdHI+PC90YWJsZT48aDI+PGEgbmFtZT0iY29uX0RPTVZpZXdlckZpbHRlciI+RE9NVmlld2VyRmlsdGVyPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIDxzdHJvbmc+RE9NVmlld2VyRmlsdGVyPC9zdHJvbmc+KCk8L2NvZGU+PC9wPjxwPjwvcD48aHI+PHRhYmxlIGNvbHM9IjIiIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiPjx0ciBjb2xzcGFuPSIyIiB3aWR0aD0iMTAwJSIgYmdjb2xvcj0iI0NDQ0NGRiIgYWxpZ249ImxlZnQiPjx0ZD48aDI+Ci0gICAgICAgICAgICAgICAgICBNZXRob2RzIERldGFpbAotICAgICAgICAgICAgICAgPC9oMj48L3RkPjwvdHI+PC90YWJsZT48aDI+PGEgbmFtZT0ibWV0aG9kX3NlbGVjdCI+c2VsZWN0PC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIGJvb2xlYW4gPHN0cm9uZz5zZWxlY3Q8L3N0cm9uZz4oVmlld2VyIHZpZXdlcgotICAgICAgICAgLAotICAgICAgamF2YS5sYW5nLk9iamVjdCBwYXJlbnRFbGVtZW50Ci0gICAgICAgICAsCi0gICAgICBqYXZhLmxhbmcuT2JqZWN0IGVsZW1lbnQpPC9jb2RlPjwvcD48cD48L3A+PGgzPlBhcmFtZXRlcnM8L2gzPjxwPjxjb2RlPnZpZXdlcjwvY29kZT48L3A+PHA+PGNvZGU+cGFyZW50RWxlbWVudDwvY29kZT48L3A+PHA+PGNvZGU+ZWxlbWVudDwvY29kZT48L3A+PGgzPlJldHVybnM8L2gzPjxwPjxjb2RlPmJvb2xlYW48L2NvZGU+PC9wPjxocj48L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi9kb2MvaHRtbC9vcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLnVpLnZpZXdzLkVkaXROYW1lc3BhY2VQcmVmaXhEaWFsb2cuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi9kb2MvaHRtbC9vcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLnVpLnZpZXdzLkVkaXROYW1lc3BhY2VQcmVmaXhEaWFsb2cuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUxOTI5Yi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuc2RrLmRvY3VtZW50YXRpb24vZG9jL2h0bWwvb3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aS52aWV3cy5FZGl0TmFtZXNwYWNlUHJlZml4RGlhbG9nLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08aHRtbD48Ym9keT48cD48Zm9udCBzaXplPSIrMSI+PHN0cm9uZz5QYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwueHBhdGgudWkudmlld3M8L3N0cm9uZz48L2ZvbnQ+PC9wPjxocj48aDI+PGZvbnQgc2l6ZT0iLTEiPjxzdHJvbmc+b3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aS52aWV3czwvc3Ryb25nPjwvZm9udD48YnI+Ci0gICAgICAgICAgICAgICBDbGFzcyBFZGl0TmFtZXNwYWNlUHJlZml4RGlhbG9nPC9oMj48YnI+PGhyPjxwcmU+cHVibGljIGNsYXNzIDxzdHJvbmc+RWRpdE5hbWVzcGFjZVByZWZpeERpYWxvZzwvc3Ryb25nPgotZXh0ZW5kcyBEaWFsb2c8L3ByZT48aHI+PHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiPjx0ciBjb2xzPSIyIiBiZ2NvbG9yPSIjQ0NDQ0ZGIj48dGQgY29sc3Bhbj0iMiIgd2lkdGg9IjEwMCUiPjxoMj5GaWVsZCBTdW1tYXJ5PC9oMj48L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wcm90ZWN0ZWQgTGFiZWw8L2NvZGU+PC90ZD48dGQgd2lkdGg9IjgwJSIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNmaWVsZF9lcnJvck1lc3NhZ2VMYWJlbCI+ZXJyb3JNZXNzYWdlTGFiZWw8L2E+PC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgPC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHJvdGVjdGVkIGphdmEudXRpbC5MaXN0PC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSI4MCUiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjZmllbGRfbmFtZXNwYWNlSW5mb0xpc3QiPm5hbWVzcGFjZUluZm9MaXN0PC9hPjwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnByb3RlY3RlZCBJUGF0aDwvY29kZT48L3RkPjx0ZCB3aWR0aD0iODAlIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI2ZpZWxkX3Jlc291cmNlTG9jYXRpb24iPnJlc291cmNlTG9jYXRpb248L2E+PC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgPC90ZD48L3RyPjwvdGFibGU+PGJyPjx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIj48dHIgYmdjb2xvcj0iI0NDQ0NGRiI+PHRkIHdpZHRoPSIxMDAlIj48aDI+Q29uc3RydWN0b3IgU3VtbWFyeTwvaDI+PC90ZD48L3RyPjx0cj48dGQ+PGNvZGU+PHN0cm9uZz48YSBocmVmPSIjY29uX0VkaXROYW1lc3BhY2VQcmVmaXhEaWFsb2ciPkVkaXROYW1lc3BhY2VQcmVmaXhEaWFsb2c8L2E+PC9zdHJvbmc+KFNoZWxsIHBhcmVudFNoZWxsCi0gICAgICAgICAsCi0gICAgICBJUGF0aCByZXNvdXJjZUxvY2F0aW9uKTwvY29kZT48L3RkPjwvdHI+PC90YWJsZT48YnI+PHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiPjx0ciBjb2xzPSIyIiBiZ2NvbG9yPSIjQ0NDQ0ZGIj48dGQgY29sc3Bhbj0iMiIgd2lkdGg9IjEwMCUiPjxoMj5NZXRob2QgU3VtbWFyeTwvaDI+PC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHJvdGVjdGVkIHZvaWQ8L2NvZGU+PC90ZD48dGQgd2lkdGg9IiIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNtZXRob2RfY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhciI+Y3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcjwvYT4oQ29tcG9zaXRlIHBhcmVudCk8L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICA8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wcm90ZWN0ZWQgQ29udHJvbDwvY29kZT48L3RkPjx0ZCB3aWR0aD0iIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI21ldGhvZF9jcmVhdGVEaWFsb2dBcmVhIj5jcmVhdGVEaWFsb2dBcmVhPC9hPihDb21wb3NpdGUgcGFyZW50KTwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnByb3RlY3RlZCBDb250cm9sPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSIiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjbWV0aG9kX2dldERpYWxvZ0FyZWEiPmdldERpYWxvZ0FyZWE8L2E+KENvbXBvc2l0ZSBwYXJlbnQpPC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgPC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIGphdmEudXRpbC5MaXN0PC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSIiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjbWV0aG9kX2dldE5hbWVzcGFjZUluZm9MaXN0Ij5nZXROYW1lc3BhY2VJbmZvTGlzdDwvYT4oKTwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyB2b2lkPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSIiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjbWV0aG9kX3NldE5hbWVzcGFjZUluZm9MaXN0Ij5zZXROYW1lc3BhY2VJbmZvTGlzdDwvYT4oamF2YS51dGlsLkxpc3QgbGlzdCk8L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICA8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgdm9pZDwvY29kZT48L3RkPjx0ZCB3aWR0aD0iIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI21ldGhvZF91cGRhdGVFcnJvck1lc3NhZ2UiPnVwZGF0ZUVycm9yTWVzc2FnZTwvYT4oamF2YS51dGlsLkxpc3QgbmFtZXNwYWNlSW5mb0xpc3QpPC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgPC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIHZvaWQ8L2NvZGU+PC90ZD48dGQgd2lkdGg9IiIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNtZXRob2RfdXBkYXRlT2NjdXJlZCI+dXBkYXRlT2NjdXJlZDwvYT4oamF2YS5sYW5nLk9iamVjdCBvYmplY3QKLSAgICAgICAgICwKLSAgICAgIGphdmEubGFuZy5PYmplY3QgYXJnKTwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48L3RhYmxlPjxocj48dGFibGUgY29scz0iMiIgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSI+PHRyIGNvbHNwYW49IjIiIHdpZHRoPSIxMDAlIiBiZ2NvbG9yPSIjQ0NDQ0ZGIiBhbGlnbj0ibGVmdCI+PHRkPjxoMj4KLSAgICAgICAgICAgICAgICAgIEZpZWxkIERldGFpbAotICAgICAgICAgICAgICAgPC9oMj48L3RkPjwvdHI+PC90YWJsZT48aDI+PGEgbmFtZT0iZmllbGRfZXJyb3JNZXNzYWdlTGFiZWwiPmVycm9yTWVzc2FnZUxhYmVsPC9hPjwvaDI+PHA+PGNvZGU+cHJvdGVjdGVkIExhYmVsIDxzdHJvbmc+ZXJyb3JNZXNzYWdlTGFiZWw8L3N0cm9uZz48L2NvZGU+PC9wPjxocj48aDI+PGEgbmFtZT0iZmllbGRfbmFtZXNwYWNlSW5mb0xpc3QiPm5hbWVzcGFjZUluZm9MaXN0PC9hPjwvaDI+PHA+PGNvZGU+cHJvdGVjdGVkIGphdmEudXRpbC5MaXN0IDxzdHJvbmc+bmFtZXNwYWNlSW5mb0xpc3Q8L3N0cm9uZz48L2NvZGU+PC9wPjxocj48aDI+PGEgbmFtZT0iZmllbGRfcmVzb3VyY2VMb2NhdGlvbiI+cmVzb3VyY2VMb2NhdGlvbjwvYT48L2gyPjxwPjxjb2RlPnByb3RlY3RlZCBJUGF0aCA8c3Ryb25nPnJlc291cmNlTG9jYXRpb248L3N0cm9uZz48L2NvZGU+PC9wPjxocj48dGFibGUgY29scz0iMiIgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSI+PHRyIGNvbHNwYW49IjIiIHdpZHRoPSIxMDAlIiBiZ2NvbG9yPSIjQ0NDQ0ZGIiBhbGlnbj0ibGVmdCI+PHRkPjxoMj4KLSAgICAgICAgICAgICAgICAgIENvbnN0cnVjdG9yIERldGFpbAotICAgICAgICAgICAgICAgPC9oMj48L3RkPjwvdHI+PC90YWJsZT48aDI+PGEgbmFtZT0iY29uX0VkaXROYW1lc3BhY2VQcmVmaXhEaWFsb2ciPkVkaXROYW1lc3BhY2VQcmVmaXhEaWFsb2c8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgPHN0cm9uZz5FZGl0TmFtZXNwYWNlUHJlZml4RGlhbG9nPC9zdHJvbmc+KFNoZWxsIHBhcmVudFNoZWxsCi0gICAgICAgICAsCi0gICAgICBJUGF0aCByZXNvdXJjZUxvY2F0aW9uKTwvY29kZT48L3A+PHA+PC9wPjxocj48dGFibGUgY29scz0iMiIgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSI+PHRyIGNvbHNwYW49IjIiIHdpZHRoPSIxMDAlIiBiZ2NvbG9yPSIjQ0NDQ0ZGIiBhbGlnbj0ibGVmdCI+PHRkPjxoMj4KLSAgICAgICAgICAgICAgICAgIE1ldGhvZHMgRGV0YWlsCi0gICAgICAgICAgICAgICA8L2gyPjwvdGQ+PC90cj48L3RhYmxlPjxoMj48YSBuYW1lPSJtZXRob2RfY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhciI+Y3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcjwvYT48L2gyPjxwPjxjb2RlPnByb3RlY3RlZCB2b2lkIDxzdHJvbmc+Y3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcjwvc3Ryb25nPihDb21wb3NpdGUgcGFyZW50KTwvY29kZT48L3A+PHA+PC9wPjxoMz5QYXJhbWV0ZXJzPC9oMz48cD48Y29kZT5wYXJlbnQ8L2NvZGU+PC9wPjxocj48aDI+PGEgbmFtZT0ibWV0aG9kX2NyZWF0ZURpYWxvZ0FyZWEiPmNyZWF0ZURpYWxvZ0FyZWE8L2E+PC9oMj48cD48Y29kZT5wcm90ZWN0ZWQgQ29udHJvbCA8c3Ryb25nPmNyZWF0ZURpYWxvZ0FyZWE8L3N0cm9uZz4oQ29tcG9zaXRlIHBhcmVudCk8L2NvZGU+PC9wPjxwPjwvcD48aDM+UGFyYW1ldGVyczwvaDM+PHA+PGNvZGU+cGFyZW50PC9jb2RlPjwvcD48aDM+UmV0dXJuczwvaDM+PHA+PGNvZGU+Q29udHJvbDwvY29kZT48L3A+PGhyPjxoMj48YSBuYW1lPSJtZXRob2RfZ2V0RGlhbG9nQXJlYSI+Z2V0RGlhbG9nQXJlYTwvYT48L2gyPjxwPjxjb2RlPnByb3RlY3RlZCBDb250cm9sIDxzdHJvbmc+Z2V0RGlhbG9nQXJlYTwvc3Ryb25nPihDb21wb3NpdGUgcGFyZW50KTwvY29kZT48L3A+PHA+PC9wPjxoMz5QYXJhbWV0ZXJzPC9oMz48cD48Y29kZT5wYXJlbnQ8L2NvZGU+PC9wPjxoMz5SZXR1cm5zPC9oMz48cD48Y29kZT5Db250cm9sPC9jb2RlPjwvcD48aHI+PGgyPjxhIG5hbWU9Im1ldGhvZF9nZXROYW1lc3BhY2VJbmZvTGlzdCI+Z2V0TmFtZXNwYWNlSW5mb0xpc3Q8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgamF2YS51dGlsLkxpc3QgPHN0cm9uZz5nZXROYW1lc3BhY2VJbmZvTGlzdDwvc3Ryb25nPigpPC9jb2RlPjwvcD48cD48L3A+PGgzPlJldHVybnM8L2gzPjxwPjxjb2RlPmphdmEudXRpbC5MaXN0PC9jb2RlPjwvcD48aHI+PGgyPjxhIG5hbWU9Im1ldGhvZF9zZXROYW1lc3BhY2VJbmZvTGlzdCI+c2V0TmFtZXNwYWNlSW5mb0xpc3Q8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgdm9pZCA8c3Ryb25nPnNldE5hbWVzcGFjZUluZm9MaXN0PC9zdHJvbmc+KGphdmEudXRpbC5MaXN0IGxpc3QpPC9jb2RlPjwvcD48cD48L3A+PGgzPlBhcmFtZXRlcnM8L2gzPjxwPjxjb2RlPmxpc3Q8L2NvZGU+PC9wPjxocj48aDI+PGEgbmFtZT0ibWV0aG9kX3VwZGF0ZUVycm9yTWVzc2FnZSI+dXBkYXRlRXJyb3JNZXNzYWdlPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIHZvaWQgPHN0cm9uZz51cGRhdGVFcnJvck1lc3NhZ2U8L3N0cm9uZz4oamF2YS51dGlsLkxpc3QgbmFtZXNwYWNlSW5mb0xpc3QpPC9jb2RlPjwvcD48cD48L3A+PGgzPlBhcmFtZXRlcnM8L2gzPjxwPjxjb2RlPm5hbWVzcGFjZUluZm9MaXN0PC9jb2RlPjwvcD48aHI+PGgyPjxhIG5hbWU9Im1ldGhvZF91cGRhdGVPY2N1cmVkIj51cGRhdGVPY2N1cmVkPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIHZvaWQgPHN0cm9uZz51cGRhdGVPY2N1cmVkPC9zdHJvbmc+KGphdmEubGFuZy5PYmplY3Qgb2JqZWN0Ci0gICAgICAgICAsCi0gICAgICBqYXZhLmxhbmcuT2JqZWN0IGFyZyk8L2NvZGU+PC9wPjxwPjwvcD48aDM+UGFyYW1ldGVyczwvaDM+PHA+PGNvZGU+b2JqZWN0PC9jb2RlPjwvcD48cD48Y29kZT5hcmc8L2NvZGU+PC9wPjxocj48L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi9kb2MvaHRtbC9vcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLnVpLnZpZXdzLlhQYXRoTmF2aWdhdG9yLkVkaXRvclJlZmVyZW5jZUxhYmVsUHJvdmlkZXIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi9kb2MvaHRtbC9vcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLnVpLnZpZXdzLlhQYXRoTmF2aWdhdG9yLkVkaXRvclJlZmVyZW5jZUxhYmVsUHJvdmlkZXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMwZmNjMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuc2RrLmRvY3VtZW50YXRpb24vZG9jL2h0bWwvb3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aS52aWV3cy5YUGF0aE5hdmlnYXRvci5FZGl0b3JSZWZlcmVuY2VMYWJlbFByb3ZpZGVyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08aHRtbD48Ym9keT48cD48Zm9udCBzaXplPSIrMSI+PHN0cm9uZz5QYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwueHBhdGgudWkudmlld3M8L3N0cm9uZz48L2ZvbnQ+PC9wPjxocj48aDI+PGZvbnQgc2l6ZT0iLTEiPjxzdHJvbmc+b3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aS52aWV3czwvc3Ryb25nPjwvZm9udD48YnI+Ci0gICAgICAgICAgICAgICBDbGFzcyBYUGF0aE5hdmlnYXRvci5FZGl0b3JSZWZlcmVuY2VMYWJlbFByb3ZpZGVyPC9oMj48YnI+PGhyPjxwcmU+cGFja2FnZS1wcml2YXRlIGNsYXNzIDxzdHJvbmc+WFBhdGhOYXZpZ2F0b3IuRWRpdG9yUmVmZXJlbmNlTGFiZWxQcm92aWRlcjwvc3Ryb25nPgotZXh0ZW5kcyBMYWJlbFByb3ZpZGVyPC9wcmU+PGhyPjx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIj48dHIgY29scz0iMiIgYmdjb2xvcj0iI0NDQ0NGRiI+PHRkIGNvbHNwYW49IjIiIHdpZHRoPSIxMDAlIj48aDI+RmllbGQgU3VtbWFyeTwvaDI+PC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIHN0YXRpYyAgY2hhcjwvY29kZT48L3RkPjx0ZCB3aWR0aD0iODAlIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI2ZpZWxkX0RJUlRZX0lORElDQVRPUiI+RElSVFlfSU5ESUNBVE9SPC9hPjwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIEEgc3RyaW5nIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBhbiBlZGl0b3IgaXMgZGlydHk8L3RkPjwvdHI+PC90YWJsZT48YnI+PHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiPjx0ciBiZ2NvbG9yPSIjQ0NDQ0ZGIj48dGQgd2lkdGg9IjEwMCUiPjxoMj5Db25zdHJ1Y3RvciBTdW1tYXJ5PC9oMj48L3RkPjwvdHI+PHRyPjx0ZD48Y29kZT48c3Ryb25nPjxhIGhyZWY9IiNjb25fWFBhdGhOYXZpZ2F0b3IuRWRpdG9yUmVmZXJlbmNlTGFiZWxQcm92aWRlciI+WFBhdGhOYXZpZ2F0b3IuRWRpdG9yUmVmZXJlbmNlTGFiZWxQcm92aWRlcjwvYT48L3N0cm9uZz4oKTwvY29kZT48L3RkPjwvdHI+PC90YWJsZT48YnI+PHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiPjx0ciBjb2xzPSIyIiBiZ2NvbG9yPSIjQ0NDQ0ZGIj48dGQgY29sc3Bhbj0iMiIgd2lkdGg9IjEwMCUiPjxoMj5NZXRob2QgU3VtbWFyeTwvaDI+PC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIEltYWdlPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSIiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjbWV0aG9kX2dldEltYWdlIj5nZXRJbWFnZTwvYT4oamF2YS5sYW5nLk9iamVjdCBlbGVtZW50KTwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSIiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjbWV0aG9kX2dldFRleHQiPmdldFRleHQ8L2E+KGphdmEubGFuZy5PYmplY3QgZWxlbWVudCk8L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICA8L3RkPjwvdHI+PC90YWJsZT48aHI+PHRhYmxlIGNvbHM9IjIiIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiPjx0ciBjb2xzcGFuPSIyIiB3aWR0aD0iMTAwJSIgYmdjb2xvcj0iI0NDQ0NGRiIgYWxpZ249ImxlZnQiPjx0ZD48aDI+Ci0gICAgICAgICAgICAgICAgICBGaWVsZCBEZXRhaWwKLSAgICAgICAgICAgICAgIDwvaDI+PC90ZD48L3RyPjwvdGFibGU+PGgyPjxhIG5hbWU9ImZpZWxkX0RJUlRZX0lORElDQVRPUiI+RElSVFlfSU5ESUNBVE9SPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIHN0YXRpYyAgY2hhciA8c3Ryb25nPkRJUlRZX0lORElDQVRPUjwvc3Ryb25nPjwvY29kZT48L3A+PHRhYmxlPjx0cj48dGQ+QSBzdHJpbmcgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IGFuIGVkaXRvciBpcyBkaXJ0eTwvdGQ+PC90cj48L3RhYmxlPjxocj48dGFibGUgY29scz0iMiIgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSI+PHRyIGNvbHNwYW49IjIiIHdpZHRoPSIxMDAlIiBiZ2NvbG9yPSIjQ0NDQ0ZGIiBhbGlnbj0ibGVmdCI+PHRkPjxoMj4KLSAgICAgICAgICAgICAgICAgIENvbnN0cnVjdG9yIERldGFpbAotICAgICAgICAgICAgICAgPC9oMj48L3RkPjwvdHI+PC90YWJsZT48aDI+PGEgbmFtZT0iY29uX1hQYXRoTmF2aWdhdG9yLkVkaXRvclJlZmVyZW5jZUxhYmVsUHJvdmlkZXIiPlhQYXRoTmF2aWdhdG9yLkVkaXRvclJlZmVyZW5jZUxhYmVsUHJvdmlkZXI8L2E+PC9oMj48cD48Y29kZT5wYWNrYWdlLXByaXZhdGUgPHN0cm9uZz5YUGF0aE5hdmlnYXRvci5FZGl0b3JSZWZlcmVuY2VMYWJlbFByb3ZpZGVyPC9zdHJvbmc+KCk8L2NvZGU+PC9wPjxwPjwvcD48aHI+PHRhYmxlIGNvbHM9IjIiIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiPjx0ciBjb2xzcGFuPSIyIiB3aWR0aD0iMTAwJSIgYmdjb2xvcj0iI0NDQ0NGRiIgYWxpZ249ImxlZnQiPjx0ZD48aDI+Ci0gICAgICAgICAgICAgICAgICBNZXRob2RzIERldGFpbAotICAgICAgICAgICAgICAgPC9oMj48L3RkPjwvdHI+PC90YWJsZT48aDI+PGEgbmFtZT0ibWV0aG9kX2dldEltYWdlIj5nZXRJbWFnZTwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyBJbWFnZSA8c3Ryb25nPmdldEltYWdlPC9zdHJvbmc+KGphdmEubGFuZy5PYmplY3QgZWxlbWVudCk8L2NvZGU+PC9wPjxwPjwvcD48aDM+UGFyYW1ldGVyczwvaDM+PHA+PGNvZGU+ZWxlbWVudDwvY29kZT48L3A+PGgzPlJldHVybnM8L2gzPjxwPjxjb2RlPkltYWdlPC9jb2RlPjwvcD48aHI+PGgyPjxhIG5hbWU9Im1ldGhvZF9nZXRUZXh0Ij5nZXRUZXh0PC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIGphdmEubGFuZy5TdHJpbmcgPHN0cm9uZz5nZXRUZXh0PC9zdHJvbmc+KGphdmEubGFuZy5PYmplY3QgZWxlbWVudCk8L2NvZGU+PC9wPjxwPjwvcD48aDM+UGFyYW1ldGVyczwvaDM+PHA+PGNvZGU+ZWxlbWVudDwvY29kZT48L3A+PGgzPlJldHVybnM8L2gzPjxwPjxjb2RlPmphdmEubGFuZy5TdHJpbmc8L2NvZGU+PC9wPjxocj48L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi9kb2MvaHRtbC9vcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLnVpLnZpZXdzLlhQYXRoTmF2aWdhdG9yLlJlZnJlc2hBY3Rpb24uaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi9kb2MvaHRtbC9vcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLnVpLnZpZXdzLlhQYXRoTmF2aWdhdG9yLlJlZnJlc2hBY3Rpb24uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZiZWMzYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuc2RrLmRvY3VtZW50YXRpb24vZG9jL2h0bWwvb3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aS52aWV3cy5YUGF0aE5hdmlnYXRvci5SZWZyZXNoQWN0aW9uLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxib2R5PjxwPjxmb250IHNpemU9IisxIj48c3Ryb25nPlBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aS52aWV3czwvc3Ryb25nPjwvZm9udD48L3A+PGhyPjxoMj48Zm9udCBzaXplPSItMSI+PHN0cm9uZz5vcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLnVpLnZpZXdzPC9zdHJvbmc+PC9mb250Pjxicj4KLSAgICAgICAgICAgICAgIENsYXNzIFhQYXRoTmF2aWdhdG9yLlJlZnJlc2hBY3Rpb248L2gyPjxicj48aHI+PHByZT5wYWNrYWdlLXByaXZhdGUgY2xhc3MgPHN0cm9uZz5YUGF0aE5hdmlnYXRvci5SZWZyZXNoQWN0aW9uPC9zdHJvbmc+Ci1leHRlbmRzIEFjdGlvbjwvcHJlPjxocj48dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSI+PHRyIGJnY29sb3I9IiNDQ0NDRkYiPjx0ZCB3aWR0aD0iMTAwJSI+PGgyPkNvbnN0cnVjdG9yIFN1bW1hcnk8L2gyPjwvdGQ+PC90cj48dHI+PHRkPjxjb2RlPjxzdHJvbmc+PGEgaHJlZj0iI2Nvbl9YUGF0aE5hdmlnYXRvci5SZWZyZXNoQWN0aW9uIj5YUGF0aE5hdmlnYXRvci5SZWZyZXNoQWN0aW9uPC9hPjwvc3Ryb25nPigpPC9jb2RlPjwvdGQ+PC90cj48L3RhYmxlPjxicj48dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSI+PHRyIGNvbHM9IjIiIGJnY29sb3I9IiNDQ0NDRkYiPjx0ZCBjb2xzcGFuPSIyIiB3aWR0aD0iMTAwJSI+PGgyPk1ldGhvZCBTdW1tYXJ5PC9oMj48L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgdm9pZDwvY29kZT48L3RkPjx0ZCB3aWR0aD0iIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI21ldGhvZF9ydW4iPnJ1bjwvYT4oKTwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48L3RhYmxlPjxocj48dGFibGUgY29scz0iMiIgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSI+PHRyIGNvbHNwYW49IjIiIHdpZHRoPSIxMDAlIiBiZ2NvbG9yPSIjQ0NDQ0ZGIiBhbGlnbj0ibGVmdCI+PHRkPjxoMj4KLSAgICAgICAgICAgICAgICAgIENvbnN0cnVjdG9yIERldGFpbAotICAgICAgICAgICAgICAgPC9oMj48L3RkPjwvdHI+PC90YWJsZT48aDI+PGEgbmFtZT0iY29uX1hQYXRoTmF2aWdhdG9yLlJlZnJlc2hBY3Rpb24iPlhQYXRoTmF2aWdhdG9yLlJlZnJlc2hBY3Rpb248L2E+PC9oMj48cD48Y29kZT5wYWNrYWdlLXByaXZhdGUgPHN0cm9uZz5YUGF0aE5hdmlnYXRvci5SZWZyZXNoQWN0aW9uPC9zdHJvbmc+KCk8L2NvZGU+PC9wPjxwPjwvcD48aHI+PHRhYmxlIGNvbHM9IjIiIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiPjx0ciBjb2xzcGFuPSIyIiB3aWR0aD0iMTAwJSIgYmdjb2xvcj0iI0NDQ0NGRiIgYWxpZ249ImxlZnQiPjx0ZD48aDI+Ci0gICAgICAgICAgICAgICAgICBNZXRob2RzIERldGFpbAotICAgICAgICAgICAgICAgPC9oMj48L3RkPjwvdHI+PC90YWJsZT48aDI+PGEgbmFtZT0ibWV0aG9kX3J1biI+cnVuPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIHZvaWQgPHN0cm9uZz5ydW48L3N0cm9uZz4oKTwvY29kZT48L3A+PHA+PC9wPjxocj48L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi9kb2MvaHRtbC9vcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLnVpLnZpZXdzLlhQYXRoTmF2aWdhdG9yLlNob3dJblNvdXJjZUFjdGlvbi5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uL2RvYy9odG1sL29yZy5lY2xpcHNlLndzdC54bWwueHBhdGgudWkudmlld3MuWFBhdGhOYXZpZ2F0b3IuU2hvd0luU291cmNlQWN0aW9uLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllY2IwOGUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uL2RvYy9odG1sL29yZy5lY2xpcHNlLndzdC54bWwueHBhdGgudWkudmlld3MuWFBhdGhOYXZpZ2F0b3IuU2hvd0luU291cmNlQWN0aW9uLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPjxib2R5PjxwPjxmb250IHNpemU9IisxIj48c3Ryb25nPlBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aS52aWV3czwvc3Ryb25nPjwvZm9udD48L3A+PGhyPjxoMj48Zm9udCBzaXplPSItMSI+PHN0cm9uZz5vcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLnVpLnZpZXdzPC9zdHJvbmc+PC9mb250Pjxicj4KLSAgICAgICAgICAgICAgIENsYXNzIFhQYXRoTmF2aWdhdG9yLlNob3dJblNvdXJjZUFjdGlvbjwvaDI+PGJyPjxocj48cHJlPnBhY2thZ2UtcHJpdmF0ZSBjbGFzcyA8c3Ryb25nPlhQYXRoTmF2aWdhdG9yLlNob3dJblNvdXJjZUFjdGlvbjwvc3Ryb25nPgotZXh0ZW5kcyBBY3Rpb248L3ByZT48aHI+PHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiPjx0ciBiZ2NvbG9yPSIjQ0NDQ0ZGIj48dGQgd2lkdGg9IjEwMCUiPjxoMj5Db25zdHJ1Y3RvciBTdW1tYXJ5PC9oMj48L3RkPjwvdHI+PHRyPjx0ZD48Y29kZT48c3Ryb25nPjxhIGhyZWY9IiNjb25fWFBhdGhOYXZpZ2F0b3IuU2hvd0luU291cmNlQWN0aW9uIj5YUGF0aE5hdmlnYXRvci5TaG93SW5Tb3VyY2VBY3Rpb248L2E+PC9zdHJvbmc+KCk8L2NvZGU+PC90ZD48L3RyPjwvdGFibGU+PGJyPjx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIj48dHIgY29scz0iMiIgYmdjb2xvcj0iI0NDQ0NGRiI+PHRkIGNvbHNwYW49IjIiIHdpZHRoPSIxMDAlIj48aDI+TWV0aG9kIFN1bW1hcnk8L2gyPjwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyB2b2lkPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSIiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjbWV0aG9kX3J1biI+cnVuPC9hPigpPC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgPC90ZD48L3RyPjwvdGFibGU+PGhyPjx0YWJsZSBjb2xzPSIyIiB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIj48dHIgY29sc3Bhbj0iMiIgd2lkdGg9IjEwMCUiIGJnY29sb3I9IiNDQ0NDRkYiIGFsaWduPSJsZWZ0Ij48dGQ+PGgyPgotICAgICAgICAgICAgICAgICAgQ29uc3RydWN0b3IgRGV0YWlsCi0gICAgICAgICAgICAgICA8L2gyPjwvdGQ+PC90cj48L3RhYmxlPjxoMj48YSBuYW1lPSJjb25fWFBhdGhOYXZpZ2F0b3IuU2hvd0luU291cmNlQWN0aW9uIj5YUGF0aE5hdmlnYXRvci5TaG93SW5Tb3VyY2VBY3Rpb248L2E+PC9oMj48cD48Y29kZT5wYWNrYWdlLXByaXZhdGUgPHN0cm9uZz5YUGF0aE5hdmlnYXRvci5TaG93SW5Tb3VyY2VBY3Rpb248L3N0cm9uZz4oKTwvY29kZT48L3A+PHA+PC9wPjxocj48dGFibGUgY29scz0iMiIgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSI+PHRyIGNvbHNwYW49IjIiIHdpZHRoPSIxMDAlIiBiZ2NvbG9yPSIjQ0NDQ0ZGIiBhbGlnbj0ibGVmdCI+PHRkPjxoMj4KLSAgICAgICAgICAgICAgICAgIE1ldGhvZHMgRGV0YWlsCi0gICAgICAgICAgICAgICA8L2gyPjwvdGQ+PC90cj48L3RhYmxlPjxoMj48YSBuYW1lPSJtZXRob2RfcnVuIj5ydW48L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgdm9pZCA8c3Ryb25nPnJ1bjwvc3Ryb25nPigpPC9jb2RlPjwvcD48cD48L3A+PGhyPjwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uL2RvYy9odG1sL29yZy5lY2xpcHNlLndzdC54bWwueHBhdGgudWkudmlld3MuWFBhdGhOYXZpZ2F0b3IuWE1MRWRpdG9yc0NvbnRlbnRQcm92aWRlci5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uL2RvYy9odG1sL29yZy5lY2xpcHNlLndzdC54bWwueHBhdGgudWkudmlld3MuWFBhdGhOYXZpZ2F0b3IuWE1MRWRpdG9yc0NvbnRlbnRQcm92aWRlci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzU3MzU5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi9kb2MvaHRtbC9vcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLnVpLnZpZXdzLlhQYXRoTmF2aWdhdG9yLlhNTEVkaXRvcnNDb250ZW50UHJvdmlkZXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTxodG1sPjxib2R5PjxwPjxmb250IHNpemU9IisxIj48c3Ryb25nPlBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aS52aWV3czwvc3Ryb25nPjwvZm9udD48L3A+PGhyPjxoMj48Zm9udCBzaXplPSItMSI+PHN0cm9uZz5vcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLnVpLnZpZXdzPC9zdHJvbmc+PC9mb250Pjxicj4KLSAgICAgICAgICAgICAgIENsYXNzIFhQYXRoTmF2aWdhdG9yLlhNTEVkaXRvcnNDb250ZW50UHJvdmlkZXI8L2gyPjxicj48aHI+PHByZT5wYWNrYWdlLXByaXZhdGUgY2xhc3MgPHN0cm9uZz5YUGF0aE5hdmlnYXRvci5YTUxFZGl0b3JzQ29udGVudFByb3ZpZGVyPC9zdHJvbmc+Ci1leHRlbmRzIGphdmEubGFuZy5PYmplY3Q8L3ByZT48aHI+PHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiPjx0ciBiZ2NvbG9yPSIjQ0NDQ0ZGIj48dGQgd2lkdGg9IjEwMCUiPjxoMj5Db25zdHJ1Y3RvciBTdW1tYXJ5PC9oMj48L3RkPjwvdHI+PHRyPjx0ZD48Y29kZT48c3Ryb25nPjxhIGhyZWY9IiNjb25fWFBhdGhOYXZpZ2F0b3IuWE1MRWRpdG9yc0NvbnRlbnRQcm92aWRlciI+WFBhdGhOYXZpZ2F0b3IuWE1MRWRpdG9yc0NvbnRlbnRQcm92aWRlcjwvYT48L3N0cm9uZz4oKTwvY29kZT48L3RkPjwvdHI+PC90YWJsZT48YnI+PHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiPjx0ciBjb2xzPSIyIiBiZ2NvbG9yPSIjQ0NDQ0ZGIj48dGQgY29sc3Bhbj0iMiIgd2lkdGg9IjEwMCUiPjxoMj5NZXRob2QgU3VtbWFyeTwvaDI+PC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIHZvaWQ8L2NvZGU+PC90ZD48dGQgd2lkdGg9IiIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNtZXRob2RfZGlzcG9zZSI+ZGlzcG9zZTwvYT4oKTwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0W108L2NvZGU+PC90ZD48dGQgd2lkdGg9IiIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNtZXRob2RfZ2V0RWxlbWVudHMiPmdldEVsZW1lbnRzPC9hPihqYXZhLmxhbmcuT2JqZWN0IGlucHV0RWxlbWVudCk8L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICA8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgdm9pZDwvY29kZT48L3RkPjx0ZCB3aWR0aD0iIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI21ldGhvZF9pbnB1dENoYW5nZWQiPmlucHV0Q2hhbmdlZDwvYT4oVmlld2VyIHZpZXdlcgotICAgICAgICAgLAotICAgICAgamF2YS5sYW5nLk9iamVjdCBvbGRJbnB1dAotICAgICAgICAgLAotICAgICAgamF2YS5sYW5nLk9iamVjdCBuZXdJbnB1dCk8L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICA8L3RkPjwvdHI+PC90YWJsZT48aHI+PHRhYmxlIGNvbHM9IjIiIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiPjx0ciBjb2xzcGFuPSIyIiB3aWR0aD0iMTAwJSIgYmdjb2xvcj0iI0NDQ0NGRiIgYWxpZ249ImxlZnQiPjx0ZD48aDI+Ci0gICAgICAgICAgICAgICAgICBDb25zdHJ1Y3RvciBEZXRhaWwKLSAgICAgICAgICAgICAgIDwvaDI+PC90ZD48L3RyPjwvdGFibGU+PGgyPjxhIG5hbWU9ImNvbl9YUGF0aE5hdmlnYXRvci5YTUxFZGl0b3JzQ29udGVudFByb3ZpZGVyIj5YUGF0aE5hdmlnYXRvci5YTUxFZGl0b3JzQ29udGVudFByb3ZpZGVyPC9hPjwvaDI+PHA+PGNvZGU+cGFja2FnZS1wcml2YXRlIDxzdHJvbmc+WFBhdGhOYXZpZ2F0b3IuWE1MRWRpdG9yc0NvbnRlbnRQcm92aWRlcjwvc3Ryb25nPigpPC9jb2RlPjwvcD48cD48L3A+PGhyPjx0YWJsZSBjb2xzPSIyIiB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIj48dHIgY29sc3Bhbj0iMiIgd2lkdGg9IjEwMCUiIGJnY29sb3I9IiNDQ0NDRkYiIGFsaWduPSJsZWZ0Ij48dGQ+PGgyPgotICAgICAgICAgICAgICAgICAgTWV0aG9kcyBEZXRhaWwKLSAgICAgICAgICAgICAgIDwvaDI+PC90ZD48L3RyPjwvdGFibGU+PGgyPjxhIG5hbWU9Im1ldGhvZF9kaXNwb3NlIj5kaXNwb3NlPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIHZvaWQgPHN0cm9uZz5kaXNwb3NlPC9zdHJvbmc+KCk8L2NvZGU+PC9wPjxwPjwvcD48aHI+PGgyPjxhIG5hbWU9Im1ldGhvZF9nZXRFbGVtZW50cyI+Z2V0RWxlbWVudHM8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgamF2YS5sYW5nLk9iamVjdFtdIDxzdHJvbmc+Z2V0RWxlbWVudHM8L3N0cm9uZz4oamF2YS5sYW5nLk9iamVjdCBpbnB1dEVsZW1lbnQpPC9jb2RlPjwvcD48cD48L3A+PGgzPlBhcmFtZXRlcnM8L2gzPjxwPjxjb2RlPmlucHV0RWxlbWVudDwvY29kZT48L3A+PGgzPlJldHVybnM8L2gzPjxwPjxjb2RlPmphdmEubGFuZy5PYmplY3RbXTwvY29kZT48L3A+PGhyPjxoMj48YSBuYW1lPSJtZXRob2RfaW5wdXRDaGFuZ2VkIj5pbnB1dENoYW5nZWQ8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgdm9pZCA8c3Ryb25nPmlucHV0Q2hhbmdlZDwvc3Ryb25nPihWaWV3ZXIgdmlld2VyCi0gICAgICAgICAsCi0gICAgICBqYXZhLmxhbmcuT2JqZWN0IG9sZElucHV0Ci0gICAgICAgICAsCi0gICAgICBqYXZhLmxhbmcuT2JqZWN0IG5ld0lucHV0KTwvY29kZT48L3A+PHA+PC9wPjxoMz5QYXJhbWV0ZXJzPC9oMz48cD48Y29kZT52aWV3ZXI8L2NvZGU+PC9wPjxwPjxjb2RlPm9sZElucHV0PC9jb2RlPjwvcD48cD48Y29kZT5uZXdJbnB1dDwvY29kZT48L3A+PGhyPjwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uL2RvYy9odG1sL29yZy5lY2xpcHNlLndzdC54bWwueHBhdGgudWkudmlld3MuWFBhdGhOYXZpZ2F0b3IuWFBhdGhBY3Rpb24uaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi9kb2MvaHRtbC9vcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLnVpLnZpZXdzLlhQYXRoTmF2aWdhdG9yLlhQYXRoQWN0aW9uLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4YTRkOGYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uL2RvYy9odG1sL29yZy5lY2xpcHNlLndzdC54bWwueHBhdGgudWkudmlld3MuWFBhdGhOYXZpZ2F0b3IuWFBhdGhBY3Rpb24uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+PGJvZHk+PHA+PGZvbnQgc2l6ZT0iKzEiPjxzdHJvbmc+UGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLnVpLnZpZXdzPC9zdHJvbmc+PC9mb250PjwvcD48aHI+PGgyPjxmb250IHNpemU9Ii0xIj48c3Ryb25nPm9yZy5lY2xpcHNlLndzdC54bWwueHBhdGgudWkudmlld3M8L3N0cm9uZz48L2ZvbnQ+PGJyPgotICAgICAgICAgICAgICAgQ2xhc3MgWFBhdGhOYXZpZ2F0b3IuWFBhdGhBY3Rpb248L2gyPjxicj48aHI+PHByZT5wYWNrYWdlLXByaXZhdGUgY2xhc3MgPHN0cm9uZz5YUGF0aE5hdmlnYXRvci5YUGF0aEFjdGlvbjwvc3Ryb25nPgotZXh0ZW5kcyBBY3Rpb248L3ByZT48aHI+PHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiPjx0ciBiZ2NvbG9yPSIjQ0NDQ0ZGIj48dGQgd2lkdGg9IjEwMCUiPjxoMj5Db25zdHJ1Y3RvciBTdW1tYXJ5PC9oMj48L3RkPjwvdHI+PHRyPjx0ZD48Y29kZT48c3Ryb25nPjxhIGhyZWY9IiNjb25fWFBhdGhOYXZpZ2F0b3IuWFBhdGhBY3Rpb24iPlhQYXRoTmF2aWdhdG9yLlhQYXRoQWN0aW9uPC9hPjwvc3Ryb25nPigpPC9jb2RlPjwvdGQ+PC90cj48L3RhYmxlPjxicj48dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSI+PHRyIGNvbHM9IjIiIGJnY29sb3I9IiNDQ0NDRkYiPjx0ZCBjb2xzcGFuPSIyIiB3aWR0aD0iMTAwJSI+PGgyPk1ldGhvZCBTdW1tYXJ5PC9oMj48L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgdm9pZDwvY29kZT48L3RkPjx0ZCB3aWR0aD0iIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI21ldGhvZF9ydW4iPnJ1bjwvYT4oKTwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48L3RhYmxlPjxocj48dGFibGUgY29scz0iMiIgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSI+PHRyIGNvbHNwYW49IjIiIHdpZHRoPSIxMDAlIiBiZ2NvbG9yPSIjQ0NDQ0ZGIiBhbGlnbj0ibGVmdCI+PHRkPjxoMj4KLSAgICAgICAgICAgICAgICAgIENvbnN0cnVjdG9yIERldGFpbAotICAgICAgICAgICAgICAgPC9oMj48L3RkPjwvdHI+PC90YWJsZT48aDI+PGEgbmFtZT0iY29uX1hQYXRoTmF2aWdhdG9yLlhQYXRoQWN0aW9uIj5YUGF0aE5hdmlnYXRvci5YUGF0aEFjdGlvbjwvYT48L2gyPjxwPjxjb2RlPnBhY2thZ2UtcHJpdmF0ZSA8c3Ryb25nPlhQYXRoTmF2aWdhdG9yLlhQYXRoQWN0aW9uPC9zdHJvbmc+KCk8L2NvZGU+PC9wPjxwPjwvcD48aHI+PHRhYmxlIGNvbHM9IjIiIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiPjx0ciBjb2xzcGFuPSIyIiB3aWR0aD0iMTAwJSIgYmdjb2xvcj0iI0NDQ0NGRiIgYWxpZ249ImxlZnQiPjx0ZD48aDI+Ci0gICAgICAgICAgICAgICAgICBNZXRob2RzIERldGFpbAotICAgICAgICAgICAgICAgPC9oMj48L3RkPjwvdHI+PC90YWJsZT48aDI+PGEgbmFtZT0ibWV0aG9kX3J1biI+cnVuPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIHZvaWQgPHN0cm9uZz5ydW48L3N0cm9uZz4oKTwvY29kZT48L3A+PHA+PC9wPjxocj48L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi9kb2MvaHRtbC9vcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLnVpLnZpZXdzLlhQYXRoTmF2aWdhdG9yLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuc2RrLmRvY3VtZW50YXRpb24vZG9jL2h0bWwvb3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aS52aWV3cy5YUGF0aE5hdmlnYXRvci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzUxMDMwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi9kb2MvaHRtbC9vcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLnVpLnZpZXdzLlhQYXRoTmF2aWdhdG9yLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08aHRtbD48Ym9keT48cD48Zm9udCBzaXplPSIrMSI+PHN0cm9uZz5QYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwueHBhdGgudWkudmlld3M8L3N0cm9uZz48L2ZvbnQ+PC9wPjxocj48aDI+PGZvbnQgc2l6ZT0iLTEiPjxzdHJvbmc+b3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aS52aWV3czwvc3Ryb25nPjwvZm9udD48YnI+Ci0gICAgICAgICAgICAgICBDbGFzcyBYUGF0aE5hdmlnYXRvcjwvaDI+PGJyPjxocj48cHJlPnB1YmxpYyBjbGFzcyA8c3Ryb25nPlhQYXRoTmF2aWdhdG9yPC9zdHJvbmc+Ci1leHRlbmRzIFZpZXdQYXJ0PC9wcmU+PGhyPjx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIj48dHIgY29scz0iMiIgYmdjb2xvcj0iI0NDQ0NGRiI+PHRkIGNvbHNwYW49IjIiIHdpZHRoPSIxMDAlIj48aDI+RmllbGQgU3VtbWFyeTwvaDI+PC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHJvdGVjdGVkIElNZW1lbnRvPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSI4MCUiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjZmllbGRfbWVtZW50byI+bWVtZW50bzwvYT48L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICA8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSI4MCUiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjZmllbGRfTUVNRU5UT19RVUVSWUNPTlRFWFRfRE9DVU1FTlQiPk1FTUVOVE9fUVVFUllDT05URVhUX0RPQ1VNRU5UPC9hPjwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmc8L2NvZGU+PC90ZD48dGQgd2lkdGg9IjgwJSIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNmaWVsZF9NRU1FTlRPX1FVRVJZQ09OVEVYVF9LRVkiPk1FTUVOVE9fUVVFUllDT05URVhUX0tFWTwvYT48L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICA8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSI4MCUiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjZmllbGRfTUVNRU5UT19RVUVSWUNPTlRFWFRfU0VMRUNUSU9OIj5NRU1FTlRPX1FVRVJZQ09OVEVYVF9TRUxFQ1RJT048L2E+PC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgPC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIHN0YXRpYyAgamF2YS5sYW5nLlN0cmluZzwvY29kZT48L3RkPjx0ZCB3aWR0aD0iODAlIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI2ZpZWxkX01FTUVOVE9fWFBBVEhOQVZJR0FUT1JfU0VDVElPTiI+TUVNRU5UT19YUEFUSE5BVklHQVRPUl9TRUNUSU9OPC9hPjwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmc8L2NvZGU+PC90ZD48dGQgd2lkdGg9IjgwJSIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNmaWVsZF9NRU1FTlRPX1hQQVRIUVVFUllfS0VZIj5NRU1FTlRPX1hQQVRIUVVFUllfS0VZPC9hPjwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnByb3RlY3RlZCBqYXZhLnV0aWwuV2Vha0hhc2hNYXA8L2NvZGU+PC90ZD48dGQgd2lkdGg9IjgwJSIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNmaWVsZF9uYW1lc3BhY2VJbmZvIj5uYW1lc3BhY2VJbmZvPC9hPjwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48L3RhYmxlPjxicj48dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSI+PHRyIGJnY29sb3I9IiNDQ0NDRkYiPjx0ZCB3aWR0aD0iMTAwJSI+PGgyPkNvbnN0cnVjdG9yIFN1bW1hcnk8L2gyPjwvdGQ+PC90cj48dHI+PHRkPjxjb2RlPjxzdHJvbmc+PGEgaHJlZj0iI2Nvbl9YUGF0aE5hdmlnYXRvciI+WFBhdGhOYXZpZ2F0b3I8L2E+PC9zdHJvbmc+KCk8L2NvZGU+PC90ZD48L3RyPjx0cj48dGQ+PGNvZGU+PHN0cm9uZz48YSBocmVmPSIjY29uX1hQYXRoTmF2aWdhdG9yLkVkaXRvclJlZmVyZW5jZUxhYmVsUHJvdmlkZXIiPlhQYXRoTmF2aWdhdG9yLkVkaXRvclJlZmVyZW5jZUxhYmVsUHJvdmlkZXI8L2E+PC9zdHJvbmc+KCk8L2NvZGU+PC90ZD48L3RyPjx0cj48dGQ+PGNvZGU+PHN0cm9uZz48YSBocmVmPSIjY29uX1hQYXRoTmF2aWdhdG9yLlJlZnJlc2hBY3Rpb24iPlhQYXRoTmF2aWdhdG9yLlJlZnJlc2hBY3Rpb248L2E+PC9zdHJvbmc+KCk8L2NvZGU+PC90ZD48L3RyPjx0cj48dGQ+PGNvZGU+PHN0cm9uZz48YSBocmVmPSIjY29uX1hQYXRoTmF2aWdhdG9yLlNob3dJblNvdXJjZUFjdGlvbiI+WFBhdGhOYXZpZ2F0b3IuU2hvd0luU291cmNlQWN0aW9uPC9hPjwvc3Ryb25nPigpPC9jb2RlPjwvdGQ+PC90cj48dHI+PHRkPjxjb2RlPjxzdHJvbmc+PGEgaHJlZj0iI2Nvbl9YUGF0aE5hdmlnYXRvci5YTUxFZGl0b3JzQ29udGVudFByb3ZpZGVyIj5YUGF0aE5hdmlnYXRvci5YTUxFZGl0b3JzQ29udGVudFByb3ZpZGVyPC9hPjwvc3Ryb25nPigpPC9jb2RlPjwvdGQ+PC90cj48dHI+PHRkPjxjb2RlPjxzdHJvbmc+PGEgaHJlZj0iI2Nvbl9YUGF0aE5hdmlnYXRvci5YUGF0aEFjdGlvbiI+WFBhdGhOYXZpZ2F0b3IuWFBhdGhBY3Rpb248L2E+PC9zdHJvbmc+KCk8L2NvZGU+PC90ZD48L3RyPjwvdGFibGU+PGJyPjx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIj48dHIgY29scz0iMiIgYmdjb2xvcj0iI0NDQ0NGRiI+PHRkIGNvbHNwYW49IjIiIHdpZHRoPSIxMDAlIj48aDI+TWV0aG9kIFN1bW1hcnk8L2gyPjwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyB2b2lkPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSIiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjbWV0aG9kX2NyZWF0ZVBhcnRDb250cm9sIj5jcmVhdGVQYXJ0Q29udHJvbDwvYT4oQ29tcG9zaXRlIHBhcmVudCk8L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICBUaGlzIGlzIGEgY2FsbGJhY2sgdGhhdCB3aWxsIGFsbG93IHVzIHRvIGNyZWF0ZSB0aGUgdmlld2VyIGFuZCBpbml0aWFsaXplCi0gaXQuPC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHJvdGVjdGVkIG9yZy53M2MuZG9tLkVsZW1lbnQ8L2NvZGU+PC90ZD48dGQgd2lkdGg9IiIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNtZXRob2RfZ2V0UXVlcnlDb250ZXh0Ij5nZXRRdWVyeUNvbnRleHQ8L2E+KCk8L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICA8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wcm90ZWN0ZWQgb3JnLnczYy5kb20uRG9jdW1lbnQ8L2NvZGU+PC90ZD48dGQgd2lkdGg9IiIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNtZXRob2RfZ2V0U2VsZWN0ZWREb2N1bWVudCI+Z2V0U2VsZWN0ZWREb2N1bWVudDwvYT4oKTwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyB2b2lkPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSIiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjbWV0aG9kX2luaXQiPmluaXQ8L2E+KElWaWV3U2l0ZSBzaXRlCi0gICAgICAgICAsCi0gICAgICBJTWVtZW50byBtZW1lbnRvKTwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnByb3RlY3RlZCB2b2lkPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSIiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjbWV0aG9kX3Jlc3RvcmVTdGF0ZSI+cmVzdG9yZVN0YXRlPC9hPigpPC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgPC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIHZvaWQ8L2NvZGU+PC90ZD48dGQgd2lkdGg9IiIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNtZXRob2Rfc2F2ZVN0YXRlIj5zYXZlU3RhdGU8L2E+KElNZW1lbnRvIG1lbWVudG8pPC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgPC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIHZvaWQ8L2NvZGU+PC90ZD48dGQgd2lkdGg9IiIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNtZXRob2Rfc2V0Rm9jdXMiPnNldEZvY3VzPC9hPigpPC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgUGFzc2luZyB0aGUgZm9jdXMgcmVxdWVzdCB0byB0aGUgdmlld2VyJ3MgY29udHJvbC48L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgdm9pZDwvY29kZT48L3RkPjx0ZCB3aWR0aD0iIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI21ldGhvZF91cGRhdGUiPnVwZGF0ZTwvYT4oKTwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48L3RhYmxlPjxocj48dGFibGUgY29scz0iMiIgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSI+PHRyIGNvbHNwYW49IjIiIHdpZHRoPSIxMDAlIiBiZ2NvbG9yPSIjQ0NDQ0ZGIiBhbGlnbj0ibGVmdCI+PHRkPjxoMj4KLSAgICAgICAgICAgICAgICAgIEZpZWxkIERldGFpbAotICAgICAgICAgICAgICAgPC9oMj48L3RkPjwvdHI+PC90YWJsZT48aDI+PGEgbmFtZT0iZmllbGRfbWVtZW50byI+bWVtZW50bzwvYT48L2gyPjxwPjxjb2RlPnByb3RlY3RlZCBJTWVtZW50byA8c3Ryb25nPm1lbWVudG88L3N0cm9uZz48L2NvZGU+PC9wPjxocj48aDI+PGEgbmFtZT0iZmllbGRfTUVNRU5UT19RVUVSWUNPTlRFWFRfRE9DVU1FTlQiPk1FTUVOVE9fUVVFUllDT05URVhUX0RPQ1VNRU5UPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIHN0YXRpYyAgamF2YS5sYW5nLlN0cmluZyA8c3Ryb25nPk1FTUVOVE9fUVVFUllDT05URVhUX0RPQ1VNRU5UPC9zdHJvbmc+PC9jb2RlPjwvcD48aHI+PGgyPjxhIG5hbWU9ImZpZWxkX01FTUVOVE9fUVVFUllDT05URVhUX0tFWSI+TUVNRU5UT19RVUVSWUNPTlRFWFRfS0VZPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIHN0YXRpYyAgamF2YS5sYW5nLlN0cmluZyA8c3Ryb25nPk1FTUVOVE9fUVVFUllDT05URVhUX0tFWTwvc3Ryb25nPjwvY29kZT48L3A+PGhyPjxoMj48YSBuYW1lPSJmaWVsZF9NRU1FTlRPX1FVRVJZQ09OVEVYVF9TRUxFQ1RJT04iPk1FTUVOVE9fUVVFUllDT05URVhUX1NFTEVDVElPTjwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmcgPHN0cm9uZz5NRU1FTlRPX1FVRVJZQ09OVEVYVF9TRUxFQ1RJT048L3N0cm9uZz48L2NvZGU+PC9wPjxocj48aDI+PGEgbmFtZT0iZmllbGRfTUVNRU5UT19YUEFUSE5BVklHQVRPUl9TRUNUSU9OIj5NRU1FTlRPX1hQQVRITkFWSUdBVE9SX1NFQ1RJT048L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nIDxzdHJvbmc+TUVNRU5UT19YUEFUSE5BVklHQVRPUl9TRUNUSU9OPC9zdHJvbmc+PC9jb2RlPjwvcD48aHI+PGgyPjxhIG5hbWU9ImZpZWxkX01FTUVOVE9fWFBBVEhRVUVSWV9LRVkiPk1FTUVOVE9fWFBBVEhRVUVSWV9LRVk8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nIDxzdHJvbmc+TUVNRU5UT19YUEFUSFFVRVJZX0tFWTwvc3Ryb25nPjwvY29kZT48L3A+PGhyPjxoMj48YSBuYW1lPSJmaWVsZF9uYW1lc3BhY2VJbmZvIj5uYW1lc3BhY2VJbmZvPC9hPjwvaDI+PHA+PGNvZGU+cHJvdGVjdGVkIGphdmEudXRpbC5XZWFrSGFzaE1hcCA8c3Ryb25nPm5hbWVzcGFjZUluZm88L3N0cm9uZz48L2NvZGU+PC9wPjxocj48dGFibGUgY29scz0iMiIgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSI+PHRyIGNvbHNwYW49IjIiIHdpZHRoPSIxMDAlIiBiZ2NvbG9yPSIjQ0NDQ0ZGIiBhbGlnbj0ibGVmdCI+PHRkPjxoMj4KLSAgICAgICAgICAgICAgICAgIENvbnN0cnVjdG9yIERldGFpbAotICAgICAgICAgICAgICAgPC9oMj48L3RkPjwvdHI+PC90YWJsZT48aDI+PGEgbmFtZT0iY29uX1hQYXRoTmF2aWdhdG9yIj5YUGF0aE5hdmlnYXRvcjwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyA8c3Ryb25nPlhQYXRoTmF2aWdhdG9yPC9zdHJvbmc+KCk8L2NvZGU+PC9wPjxwPjwvcD48aHI+PHRhYmxlIGNvbHM9IjIiIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiPjx0ciBjb2xzcGFuPSIyIiB3aWR0aD0iMTAwJSIgYmdjb2xvcj0iI0NDQ0NGRiIgYWxpZ249ImxlZnQiPjx0ZD48aDI+Ci0gICAgICAgICAgICAgICAgICBNZXRob2RzIERldGFpbAotICAgICAgICAgICAgICAgPC9oMj48L3RkPjwvdHI+PC90YWJsZT48aDI+PGEgbmFtZT0ibWV0aG9kX2NyZWF0ZVBhcnRDb250cm9sIj5jcmVhdGVQYXJ0Q29udHJvbDwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyB2b2lkIDxzdHJvbmc+Y3JlYXRlUGFydENvbnRyb2w8L3N0cm9uZz4oQ29tcG9zaXRlIHBhcmVudCk8L2NvZGU+PC9wPjxwPlRoaXMgaXMgYSBjYWxsYmFjayB0aGF0IHdpbGwgYWxsb3cgdXMgdG8gY3JlYXRlIHRoZSB2aWV3ZXIgYW5kIGluaXRpYWxpemUKLSBpdC48L3A+PGgzPlBhcmFtZXRlcnM8L2gzPjxwPjxjb2RlPnBhcmVudDwvY29kZT48L3A+PGhyPjxoMj48YSBuYW1lPSJtZXRob2RfZ2V0UXVlcnlDb250ZXh0Ij5nZXRRdWVyeUNvbnRleHQ8L2E+PC9oMj48cD48Y29kZT5wcm90ZWN0ZWQgb3JnLnczYy5kb20uRWxlbWVudCA8c3Ryb25nPmdldFF1ZXJ5Q29udGV4dDwvc3Ryb25nPigpPC9jb2RlPjwvcD48cD48L3A+PGgzPlJldHVybnM8L2gzPjxwPjxjb2RlPm9yZy53M2MuZG9tLkVsZW1lbnQ8L2NvZGU+PC9wPjxocj48aDI+PGEgbmFtZT0ibWV0aG9kX2dldFNlbGVjdGVkRG9jdW1lbnQiPmdldFNlbGVjdGVkRG9jdW1lbnQ8L2E+PC9oMj48cD48Y29kZT5wcm90ZWN0ZWQgb3JnLnczYy5kb20uRG9jdW1lbnQgPHN0cm9uZz5nZXRTZWxlY3RlZERvY3VtZW50PC9zdHJvbmc+KCk8L2NvZGU+PC9wPjxwPjwvcD48aDM+UmV0dXJuczwvaDM+PHA+PGNvZGU+b3JnLnczYy5kb20uRG9jdW1lbnQ8L2NvZGU+PC9wPjxocj48aDI+PGEgbmFtZT0ibWV0aG9kX2luaXQiPmluaXQ8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgdm9pZCA8c3Ryb25nPmluaXQ8L3N0cm9uZz4oSVZpZXdTaXRlIHNpdGUKLSAgICAgICAgICwKLSAgICAgIElNZW1lbnRvIG1lbWVudG8pPC9jb2RlPjwvcD48cD48L3A+PGgzPlBhcmFtZXRlcnM8L2gzPjxwPjxjb2RlPnNpdGU8L2NvZGU+PC9wPjxwPjxjb2RlPm1lbWVudG88L2NvZGU+PC9wPjxoMz5UaHJvd3M6PC9oMz48cD48Y29kZT5QYXJ0SW5pdEV4Y2VwdGlvbjwvY29kZT48L3A+PGhyPjxoMj48YSBuYW1lPSJtZXRob2RfcmVzdG9yZVN0YXRlIj5yZXN0b3JlU3RhdGU8L2E+PC9oMj48cD48Y29kZT5wcm90ZWN0ZWQgdm9pZCA8c3Ryb25nPnJlc3RvcmVTdGF0ZTwvc3Ryb25nPigpPC9jb2RlPjwvcD48cD48L3A+PGhyPjxoMj48YSBuYW1lPSJtZXRob2Rfc2F2ZVN0YXRlIj5zYXZlU3RhdGU8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgdm9pZCA8c3Ryb25nPnNhdmVTdGF0ZTwvc3Ryb25nPihJTWVtZW50byBtZW1lbnRvKTwvY29kZT48L3A+PHA+PC9wPjxoMz5QYXJhbWV0ZXJzPC9oMz48cD48Y29kZT5tZW1lbnRvPC9jb2RlPjwvcD48aHI+PGgyPjxhIG5hbWU9Im1ldGhvZF9zZXRGb2N1cyI+c2V0Rm9jdXM8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgdm9pZCA8c3Ryb25nPnNldEZvY3VzPC9zdHJvbmc+KCk8L2NvZGU+PC9wPjxwPlBhc3NpbmcgdGhlIGZvY3VzIHJlcXVlc3QgdG8gdGhlIHZpZXdlcidzIGNvbnRyb2wuPC9wPjxocj48aDI+PGEgbmFtZT0ibWV0aG9kX3VwZGF0ZSI+dXBkYXRlPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIHZvaWQgPHN0cm9uZz51cGRhdGU8L3N0cm9uZz4oKTwvY29kZT48L3A+PHA+PC9wPjxocj48L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi9kb2MvaHRtbC9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuTWVzc2FnZXMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi9kb2MvaHRtbC9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuTWVzc2FnZXMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJiMTAzZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuc2RrLmRvY3VtZW50YXRpb24vZG9jL2h0bWwvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLk1lc3NhZ2VzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi08aHRtbD48Ym9keT48cD48Zm9udCBzaXplPSIrMSI+PHN0cm9uZz5QYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuY29yZTwvc3Ryb25nPjwvZm9udD48L3A+PGhyPjxoMj48Zm9udCBzaXplPSItMSI+PHN0cm9uZz5vcmcuZWNsaXBzZS53c3QueHNsLmNvcmU8L3N0cm9uZz48L2ZvbnQ+PGJyPgotICAgICAgICAgICAgICAgQ2xhc3MgTWVzc2FnZXM8L2gyPjxicj48aHI+PHByZT5wdWJsaWMgY2xhc3MgPHN0cm9uZz5NZXNzYWdlczwvc3Ryb25nPgotZXh0ZW5kcyBOTFM8L3ByZT48cD48L3A+PHA+PC9wPjxocj48dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSI+PHRyIGNvbHM9IjIiIGJnY29sb3I9IiNDQ0NDRkYiPjx0ZCBjb2xzcGFuPSIyIiB3aWR0aD0iMTAwJSI+PGgyPkZpZWxkIFN1bW1hcnk8L2gyPjwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmc8L2NvZGU+PC90ZD48dGQgd2lkdGg9IjgwJSIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNmaWVsZF9YSW5jbHVkZVRhc2tfMCI+WEluY2x1ZGVUYXNrXzA8L2E+PC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgVE9ETzogQWRkIEphdmFEb2M8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSI4MCUiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjZmllbGRfWEluY2x1ZGVUYXNrXzEiPlhJbmNsdWRlVGFza18xPC9hPjwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIFRPRE86IEFkZCBKYXZhRG9jPC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIHN0YXRpYyAgamF2YS5sYW5nLlN0cmluZzwvY29kZT48L3RkPjx0ZCB3aWR0aD0iODAlIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI2ZpZWxkX1hJbmNsdWRlVGFza18yIj5YSW5jbHVkZVRhc2tfMjwvYT48L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICBUT0RPOiBBZGQgSmF2YURvYzwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmc8L2NvZGU+PC90ZD48dGQgd2lkdGg9IjgwJSIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNmaWVsZF9YSW5jbHVkZVRhc2tfMyI+WEluY2x1ZGVUYXNrXzM8L2E+PC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgVE9ETzogQWRkIEphdmFEb2M8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSI4MCUiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjZmllbGRfWEluY2x1ZGVUYXNrXzQiPlhJbmNsdWRlVGFza180PC9hPjwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIFRPRE86IEFkZCBKYXZhRG9jPC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIHN0YXRpYyAgamF2YS5sYW5nLlN0cmluZzwvY29kZT48L3RkPjx0ZCB3aWR0aD0iODAlIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI2ZpZWxkX1hJbmNsdWRlVGFza181Ij5YSW5jbHVkZVRhc2tfNTwvYT48L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICBUT0RPOiBBZGQgSmF2YURvYzwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmc8L2NvZGU+PC90ZD48dGQgd2lkdGg9IjgwJSIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNmaWVsZF9YSW5jbHVkZVRhc2tfNiI+WEluY2x1ZGVUYXNrXzY8L2E+PC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgVE9ETzogQWRkIEphdmFEb2M8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSI4MCUiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjZmllbGRfWEluY2x1ZGVUYXNrXzciPlhJbmNsdWRlVGFza183PC9hPjwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIFRPRE86IEFkZCBKYXZhRG9jPC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIHN0YXRpYyAgamF2YS5sYW5nLlN0cmluZzwvY29kZT48L3RkPjx0ZCB3aWR0aD0iODAlIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI2ZpZWxkX1hJbmNsdWRlVGFza184Ij5YSW5jbHVkZVRhc2tfODwvYT48L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICBUT0RPOiBBZGQgSmF2YURvYzwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmc8L2NvZGU+PC90ZD48dGQgd2lkdGg9IjgwJSIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNmaWVsZF9YSW5jbHVkZVRhc2tfOSI+WEluY2x1ZGVUYXNrXzk8L2E+PC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgVE9ETzogQWRkIEphdmFEb2M8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSI4MCUiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjZmllbGRfWFNMQ29yZVBsdWdpbl9iYWRJbml0aWFsaXphdGlvbkRhdGEiPlhTTENvcmVQbHVnaW5fYmFkSW5pdGlhbGl6YXRpb25EYXRhPC9hPjwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIFRPRE86IEFkZCBKYXZhRG9jPC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIHN0YXRpYyAgamF2YS5sYW5nLlN0cmluZzwvY29kZT48L3RkPjx0ZCB3aWR0aD0iODAlIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI2ZpZWxkX1hTTENvcmVQbHVnaW5fY29yZUVycm9yIj5YU0xDb3JlUGx1Z2luX2NvcmVFcnJvcjwvYT48L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICBUT0RPOiBBZGQgSmF2YURvYzwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmc8L2NvZGU+PC90ZD48dGQgd2lkdGg9IjgwJSIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNmaWVsZF9YU0xDb3JlUGx1Z2luX3BhcnNlckNvbmZpZ3VyYXRpb24iPlhTTENvcmVQbHVnaW5fcGFyc2VyQ29uZmlndXJhdGlvbjwvYT48L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICBUT0RPOiBBZGQgSmF2YURvYzwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmc8L2NvZGU+PC90ZD48dGQgd2lkdGg9IjgwJSIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNmaWVsZF9YU0xWYWxpZGF0b3JfMSI+WFNMVmFsaWRhdG9yXzE8L2E+PC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgPC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIHN0YXRpYyAgamF2YS5sYW5nLlN0cmluZzwvY29kZT48L3RkPjx0ZCB3aWR0aD0iODAlIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI2ZpZWxkX1hTTFZhbGlkYXRvcl8xMCI+WFNMVmFsaWRhdG9yXzEwPC9hPjwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIFN0eWxlc2hlZXQgaW1wb3J0aW5nIGl0c2VsZjwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmc8L2NvZGU+PC90ZD48dGQgd2lkdGg9IjgwJSIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNmaWVsZF9YU0xWYWxpZGF0b3JfMTEiPlhTTFZhbGlkYXRvcl8xMTwvYT48L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICBUZW1wbGF0ZSBjb25mbGljdCAoaW50ZXJuYWwpPC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIHN0YXRpYyAgamF2YS5sYW5nLlN0cmluZzwvY29kZT48L3RkPjx0ZCB3aWR0aD0iODAlIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI2ZpZWxkX1hTTFZhbGlkYXRvcl8xMiI+WFNMVmFsaWRhdG9yXzEyPC9hPjwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIFRlbXBsYXRlIGNvbmZsaWN0IChpbmNsdWRlZCk8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSI4MCUiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjZmllbGRfWFNMVmFsaWRhdG9yXzEzIj5YU0xWYWxpZGF0b3JfMTM8L2E+PC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgVGVtcGxhdGUgY29uZmxpY3QgKGV4dGVybmFsKTwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmc8L2NvZGU+PC90ZD48dGQgd2lkdGg9IjgwJSIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNmaWVsZF9YU0xWYWxpZGF0b3JfMTQiPlhTTFZhbGlkYXRvcl8xNDwvYT48L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICBQYXJhbWV0ZXIgbWlzc2luZyBuYW1lIGF0dHJpYnV0ZTwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmc8L2NvZGU+PC90ZD48dGQgd2lkdGg9IjgwJSIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNmaWVsZF9YU0xWYWxpZGF0b3JfMTUiPlhTTFZhbGlkYXRvcl8xNTwvYT48L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICBQYXJhbWV0ZXIgd2l0aCBlbXB0eSBuYW1lIGF0dHJpYnV0ZTwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmc8L2NvZGU+PC90ZD48dGQgd2lkdGg9IjgwJSIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNmaWVsZF9YU0xWYWxpZGF0b3JfMTYiPlhTTFZhbGlkYXRvcl8xNjwvYT48L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICBEdXBsaWNhdGUgcGFyYW1ldGVyPC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIHN0YXRpYyAgamF2YS5sYW5nLlN0cmluZzwvY29kZT48L3RkPjx0ZCB3aWR0aD0iODAlIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI2ZpZWxkX1hTTFZhbGlkYXRvcl8xOCI+WFNMVmFsaWRhdG9yXzE4PC9hPjwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIFVucmVzb2x2ZWQgbmFtZWQgdGVtcGxhdGU8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSI4MCUiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjZmllbGRfWFNMVmFsaWRhdG9yXzIiPlhTTFZhbGlkYXRvcl8yPC9hPjwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIENpcmN1bGFyIHJlZmVyZW5jZTwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmc8L2NvZGU+PC90ZD48dGQgd2lkdGg9IjgwJSIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNmaWVsZF9YU0xWYWxpZGF0b3JfMjAiPlhTTFZhbGlkYXRvcl8yMDwvYT48L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICBQYXJhbWV0ZXIgd2l0aG91dCBkZWZhdWx0IHZhbHVlPC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIHN0YXRpYyAgamF2YS5sYW5nLlN0cmluZzwvY29kZT48L3RkPjx0ZCB3aWR0aD0iODAlIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI2ZpZWxkX1hTTFZhbGlkYXRvcl8yMiI+WFNMVmFsaWRhdG9yXzIyPC9hPjwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIFBhcmFtZXRlciBkb2VzIG5vdCBleGlzdDwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmc8L2NvZGU+PC90ZD48dGQgd2lkdGg9IjgwJSIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNmaWVsZF9YU0xWYWxpZGF0b3JfMjMiPlhTTFZhbGlkYXRvcl8yMzwvYT48L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICBocmVmIGF0dHJpYnV0ZSBpcyByZXF1aXJlZDwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmc8L2NvZGU+PC90ZD48dGQgd2lkdGg9IjgwJSIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNmaWVsZF9YU0xWYWxpZGF0b3JfMyI+WFNMVmFsaWRhdG9yXzM8L2E+PC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgTWlzc2luZyBwYXJhbWV0ZXI8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSI4MCUiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjZmllbGRfWFNMVmFsaWRhdG9yXzQiPlhTTFZhbGlkYXRvcl80PC9hPjwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIFVucmVzb2x2ZWQgaW5jbHVkZTwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmc8L2NvZGU+PC90ZD48dGQgd2lkdGg9IjgwJSIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNmaWVsZF9YU0xWYWxpZGF0b3JfNiI+WFNMVmFsaWRhdG9yXzY8L2E+PC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgU3R5bGVzaGVldCBpbmNsdWRlcyBpdHNlbGY8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSI4MCUiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjZmllbGRfWFNMVmFsaWRhdG9yXzgiPlhTTFZhbGlkYXRvcl84PC9hPjwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIFVucmVzb2x2ZWQgaW1wb3J0PC90ZD48L3RyPjwvdGFibGU+PGJyPjx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIj48dHIgYmdjb2xvcj0iI0NDQ0NGRiI+PHRkIHdpZHRoPSIxMDAlIj48aDI+Q29uc3RydWN0b3IgU3VtbWFyeTwvaDI+PC90ZD48L3RyPjx0cj48dGQ+PGNvZGU+PHN0cm9uZz48YSBocmVmPSIjY29uX01lc3NhZ2VzIj5NZXNzYWdlczwvYT48L3N0cm9uZz4oKTwvY29kZT48L3RkPjwvdHI+PC90YWJsZT48YnI+PHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiPjx0ciBjb2xzPSIyIiBiZ2NvbG9yPSIjQ0NDQ0ZGIj48dGQgY29sc3Bhbj0iMiIgd2lkdGg9IjEwMCUiPjxoMj5NZXRob2QgU3VtbWFyeTwvaDI+PC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIHN0YXRpYyB2b2lkPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSIiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjbWV0aG9kX3JlbG9hZE1lc3NhZ2VzIj5yZWxvYWRNZXNzYWdlczwvYT4oKTwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIFRPRE86IEFkZCBKYXZhRG9jPC90ZD48L3RyPjwvdGFibGU+PGhyPjx0YWJsZSBjb2xzPSIyIiB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIj48dHIgY29sc3Bhbj0iMiIgd2lkdGg9IjEwMCUiIGJnY29sb3I9IiNDQ0NDRkYiIGFsaWduPSJsZWZ0Ij48dGQ+PGgyPgotICAgICAgICAgICAgICAgICAgRmllbGQgRGV0YWlsCi0gICAgICAgICAgICAgICA8L2gyPjwvdGQ+PC90cj48L3RhYmxlPjxoMj48YSBuYW1lPSJmaWVsZF9YSW5jbHVkZVRhc2tfMCI+WEluY2x1ZGVUYXNrXzA8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nIDxzdHJvbmc+WEluY2x1ZGVUYXNrXzA8L3N0cm9uZz48L2NvZGU+PC9wPjx0YWJsZT48dHI+PHRkPlRPRE86IEFkZCBKYXZhRG9jPC90ZD48L3RyPjwvdGFibGU+PGhyPjxoMj48YSBuYW1lPSJmaWVsZF9YSW5jbHVkZVRhc2tfMSI+WEluY2x1ZGVUYXNrXzE8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nIDxzdHJvbmc+WEluY2x1ZGVUYXNrXzE8L3N0cm9uZz48L2NvZGU+PC9wPjx0YWJsZT48dHI+PHRkPlRPRE86IEFkZCBKYXZhRG9jPC90ZD48L3RyPjwvdGFibGU+PGhyPjxoMj48YSBuYW1lPSJmaWVsZF9YSW5jbHVkZVRhc2tfMiI+WEluY2x1ZGVUYXNrXzI8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nIDxzdHJvbmc+WEluY2x1ZGVUYXNrXzI8L3N0cm9uZz48L2NvZGU+PC9wPjx0YWJsZT48dHI+PHRkPlRPRE86IEFkZCBKYXZhRG9jPC90ZD48L3RyPjwvdGFibGU+PGhyPjxoMj48YSBuYW1lPSJmaWVsZF9YSW5jbHVkZVRhc2tfMyI+WEluY2x1ZGVUYXNrXzM8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nIDxzdHJvbmc+WEluY2x1ZGVUYXNrXzM8L3N0cm9uZz48L2NvZGU+PC9wPjx0YWJsZT48dHI+PHRkPlRPRE86IEFkZCBKYXZhRG9jPC90ZD48L3RyPjwvdGFibGU+PGhyPjxoMj48YSBuYW1lPSJmaWVsZF9YSW5jbHVkZVRhc2tfNCI+WEluY2x1ZGVUYXNrXzQ8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nIDxzdHJvbmc+WEluY2x1ZGVUYXNrXzQ8L3N0cm9uZz48L2NvZGU+PC9wPjx0YWJsZT48dHI+PHRkPlRPRE86IEFkZCBKYXZhRG9jPC90ZD48L3RyPjwvdGFibGU+PGhyPjxoMj48YSBuYW1lPSJmaWVsZF9YSW5jbHVkZVRhc2tfNSI+WEluY2x1ZGVUYXNrXzU8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nIDxzdHJvbmc+WEluY2x1ZGVUYXNrXzU8L3N0cm9uZz48L2NvZGU+PC9wPjx0YWJsZT48dHI+PHRkPlRPRE86IEFkZCBKYXZhRG9jPC90ZD48L3RyPjwvdGFibGU+PGhyPjxoMj48YSBuYW1lPSJmaWVsZF9YSW5jbHVkZVRhc2tfNiI+WEluY2x1ZGVUYXNrXzY8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nIDxzdHJvbmc+WEluY2x1ZGVUYXNrXzY8L3N0cm9uZz48L2NvZGU+PC9wPjx0YWJsZT48dHI+PHRkPlRPRE86IEFkZCBKYXZhRG9jPC90ZD48L3RyPjwvdGFibGU+PGhyPjxoMj48YSBuYW1lPSJmaWVsZF9YSW5jbHVkZVRhc2tfNyI+WEluY2x1ZGVUYXNrXzc8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nIDxzdHJvbmc+WEluY2x1ZGVUYXNrXzc8L3N0cm9uZz48L2NvZGU+PC9wPjx0YWJsZT48dHI+PHRkPlRPRE86IEFkZCBKYXZhRG9jPC90ZD48L3RyPjwvdGFibGU+PGhyPjxoMj48YSBuYW1lPSJmaWVsZF9YSW5jbHVkZVRhc2tfOCI+WEluY2x1ZGVUYXNrXzg8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nIDxzdHJvbmc+WEluY2x1ZGVUYXNrXzg8L3N0cm9uZz48L2NvZGU+PC9wPjx0YWJsZT48dHI+PHRkPlRPRE86IEFkZCBKYXZhRG9jPC90ZD48L3RyPjwvdGFibGU+PGhyPjxoMj48YSBuYW1lPSJmaWVsZF9YSW5jbHVkZVRhc2tfOSI+WEluY2x1ZGVUYXNrXzk8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nIDxzdHJvbmc+WEluY2x1ZGVUYXNrXzk8L3N0cm9uZz48L2NvZGU+PC9wPjx0YWJsZT48dHI+PHRkPlRPRE86IEFkZCBKYXZhRG9jPC90ZD48L3RyPjwvdGFibGU+PGhyPjxoMj48YSBuYW1lPSJmaWVsZF9YU0xDb3JlUGx1Z2luX2JhZEluaXRpYWxpemF0aW9uRGF0YSI+WFNMQ29yZVBsdWdpbl9iYWRJbml0aWFsaXphdGlvbkRhdGE8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nIDxzdHJvbmc+WFNMQ29yZVBsdWdpbl9iYWRJbml0aWFsaXphdGlvbkRhdGE8L3N0cm9uZz48L2NvZGU+PC9wPjx0YWJsZT48dHI+PHRkPlRPRE86IEFkZCBKYXZhRG9jPC90ZD48L3RyPjwvdGFibGU+PGhyPjxoMj48YSBuYW1lPSJmaWVsZF9YU0xDb3JlUGx1Z2luX2NvcmVFcnJvciI+WFNMQ29yZVBsdWdpbl9jb3JlRXJyb3I8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nIDxzdHJvbmc+WFNMQ29yZVBsdWdpbl9jb3JlRXJyb3I8L3N0cm9uZz48L2NvZGU+PC9wPjx0YWJsZT48dHI+PHRkPlRPRE86IEFkZCBKYXZhRG9jPC90ZD48L3RyPjwvdGFibGU+PGhyPjxoMj48YSBuYW1lPSJmaWVsZF9YU0xDb3JlUGx1Z2luX3BhcnNlckNvbmZpZ3VyYXRpb24iPlhTTENvcmVQbHVnaW5fcGFyc2VyQ29uZmlndXJhdGlvbjwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmcgPHN0cm9uZz5YU0xDb3JlUGx1Z2luX3BhcnNlckNvbmZpZ3VyYXRpb248L3N0cm9uZz48L2NvZGU+PC9wPjx0YWJsZT48dHI+PHRkPlRPRE86IEFkZCBKYXZhRG9jPC90ZD48L3RyPjwvdGFibGU+PGhyPjxoMj48YSBuYW1lPSJmaWVsZF9YU0xWYWxpZGF0b3JfMSI+WFNMVmFsaWRhdG9yXzE8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nIDxzdHJvbmc+WFNMVmFsaWRhdG9yXzE8L3N0cm9uZz48L2NvZGU+PC9wPjxocj48aDI+PGEgbmFtZT0iZmllbGRfWFNMVmFsaWRhdG9yXzEwIj5YU0xWYWxpZGF0b3JfMTA8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nIDxzdHJvbmc+WFNMVmFsaWRhdG9yXzEwPC9zdHJvbmc+PC9jb2RlPjwvcD48dGFibGU+PHRyPjx0ZD5TdHlsZXNoZWV0IGltcG9ydGluZyBpdHNlbGY8L3RkPjwvdHI+PC90YWJsZT48aHI+PGgyPjxhIG5hbWU9ImZpZWxkX1hTTFZhbGlkYXRvcl8xMSI+WFNMVmFsaWRhdG9yXzExPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIHN0YXRpYyAgamF2YS5sYW5nLlN0cmluZyA8c3Ryb25nPlhTTFZhbGlkYXRvcl8xMTwvc3Ryb25nPjwvY29kZT48L3A+PHRhYmxlPjx0cj48dGQ+VGVtcGxhdGUgY29uZmxpY3QgKGludGVybmFsKTwvdGQ+PC90cj48L3RhYmxlPjxocj48aDI+PGEgbmFtZT0iZmllbGRfWFNMVmFsaWRhdG9yXzEyIj5YU0xWYWxpZGF0b3JfMTI8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nIDxzdHJvbmc+WFNMVmFsaWRhdG9yXzEyPC9zdHJvbmc+PC9jb2RlPjwvcD48dGFibGU+PHRyPjx0ZD5UZW1wbGF0ZSBjb25mbGljdCAoaW5jbHVkZWQpPC90ZD48L3RyPjwvdGFibGU+PGhyPjxoMj48YSBuYW1lPSJmaWVsZF9YU0xWYWxpZGF0b3JfMTMiPlhTTFZhbGlkYXRvcl8xMzwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmcgPHN0cm9uZz5YU0xWYWxpZGF0b3JfMTM8L3N0cm9uZz48L2NvZGU+PC9wPjx0YWJsZT48dHI+PHRkPlRlbXBsYXRlIGNvbmZsaWN0IChleHRlcm5hbCk8L3RkPjwvdHI+PC90YWJsZT48aHI+PGgyPjxhIG5hbWU9ImZpZWxkX1hTTFZhbGlkYXRvcl8xNCI+WFNMVmFsaWRhdG9yXzE0PC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIHN0YXRpYyAgamF2YS5sYW5nLlN0cmluZyA8c3Ryb25nPlhTTFZhbGlkYXRvcl8xNDwvc3Ryb25nPjwvY29kZT48L3A+PHRhYmxlPjx0cj48dGQ+UGFyYW1ldGVyIG1pc3NpbmcgbmFtZSBhdHRyaWJ1dGU8L3RkPjwvdHI+PC90YWJsZT48aHI+PGgyPjxhIG5hbWU9ImZpZWxkX1hTTFZhbGlkYXRvcl8xNSI+WFNMVmFsaWRhdG9yXzE1PC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIHN0YXRpYyAgamF2YS5sYW5nLlN0cmluZyA8c3Ryb25nPlhTTFZhbGlkYXRvcl8xNTwvc3Ryb25nPjwvY29kZT48L3A+PHRhYmxlPjx0cj48dGQ+UGFyYW1ldGVyIHdpdGggZW1wdHkgbmFtZSBhdHRyaWJ1dGU8L3RkPjwvdHI+PC90YWJsZT48aHI+PGgyPjxhIG5hbWU9ImZpZWxkX1hTTFZhbGlkYXRvcl8xNiI+WFNMVmFsaWRhdG9yXzE2PC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIHN0YXRpYyAgamF2YS5sYW5nLlN0cmluZyA8c3Ryb25nPlhTTFZhbGlkYXRvcl8xNjwvc3Ryb25nPjwvY29kZT48L3A+PHRhYmxlPjx0cj48dGQ+RHVwbGljYXRlIHBhcmFtZXRlcjwvdGQ+PC90cj48L3RhYmxlPjxocj48aDI+PGEgbmFtZT0iZmllbGRfWFNMVmFsaWRhdG9yXzE4Ij5YU0xWYWxpZGF0b3JfMTg8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nIDxzdHJvbmc+WFNMVmFsaWRhdG9yXzE4PC9zdHJvbmc+PC9jb2RlPjwvcD48dGFibGU+PHRyPjx0ZD5VbnJlc29sdmVkIG5hbWVkIHRlbXBsYXRlPC90ZD48L3RyPjwvdGFibGU+PGhyPjxoMj48YSBuYW1lPSJmaWVsZF9YU0xWYWxpZGF0b3JfMiI+WFNMVmFsaWRhdG9yXzI8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nIDxzdHJvbmc+WFNMVmFsaWRhdG9yXzI8L3N0cm9uZz48L2NvZGU+PC9wPjx0YWJsZT48dHI+PHRkPkNpcmN1bGFyIHJlZmVyZW5jZTwvdGQ+PC90cj48L3RhYmxlPjxocj48aDI+PGEgbmFtZT0iZmllbGRfWFNMVmFsaWRhdG9yXzIwIj5YU0xWYWxpZGF0b3JfMjA8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nIDxzdHJvbmc+WFNMVmFsaWRhdG9yXzIwPC9zdHJvbmc+PC9jb2RlPjwvcD48dGFibGU+PHRyPjx0ZD5QYXJhbWV0ZXIgd2l0aG91dCBkZWZhdWx0IHZhbHVlPC90ZD48L3RyPjwvdGFibGU+PGhyPjxoMj48YSBuYW1lPSJmaWVsZF9YU0xWYWxpZGF0b3JfMjIiPlhTTFZhbGlkYXRvcl8yMjwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmcgPHN0cm9uZz5YU0xWYWxpZGF0b3JfMjI8L3N0cm9uZz48L2NvZGU+PC9wPjx0YWJsZT48dHI+PHRkPlBhcmFtZXRlciBkb2VzIG5vdCBleGlzdDwvdGQ+PC90cj48L3RhYmxlPjxocj48aDI+PGEgbmFtZT0iZmllbGRfWFNMVmFsaWRhdG9yXzIzIj5YU0xWYWxpZGF0b3JfMjM8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nIDxzdHJvbmc+WFNMVmFsaWRhdG9yXzIzPC9zdHJvbmc+PC9jb2RlPjwvcD48dGFibGU+PHRyPjx0ZD5ocmVmIGF0dHJpYnV0ZSBpcyByZXF1aXJlZDwvdGQ+PC90cj48L3RhYmxlPjxocj48aDI+PGEgbmFtZT0iZmllbGRfWFNMVmFsaWRhdG9yXzMiPlhTTFZhbGlkYXRvcl8zPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIHN0YXRpYyAgamF2YS5sYW5nLlN0cmluZyA8c3Ryb25nPlhTTFZhbGlkYXRvcl8zPC9zdHJvbmc+PC9jb2RlPjwvcD48dGFibGU+PHRyPjx0ZD5NaXNzaW5nIHBhcmFtZXRlcjwvdGQ+PC90cj48L3RhYmxlPjxocj48aDI+PGEgbmFtZT0iZmllbGRfWFNMVmFsaWRhdG9yXzQiPlhTTFZhbGlkYXRvcl80PC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIHN0YXRpYyAgamF2YS5sYW5nLlN0cmluZyA8c3Ryb25nPlhTTFZhbGlkYXRvcl80PC9zdHJvbmc+PC9jb2RlPjwvcD48dGFibGU+PHRyPjx0ZD5VbnJlc29sdmVkIGluY2x1ZGU8L3RkPjwvdHI+PC90YWJsZT48aHI+PGgyPjxhIG5hbWU9ImZpZWxkX1hTTFZhbGlkYXRvcl82Ij5YU0xWYWxpZGF0b3JfNjwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmcgPHN0cm9uZz5YU0xWYWxpZGF0b3JfNjwvc3Ryb25nPjwvY29kZT48L3A+PHRhYmxlPjx0cj48dGQ+U3R5bGVzaGVldCBpbmNsdWRlcyBpdHNlbGY8L3RkPjwvdHI+PC90YWJsZT48aHI+PGgyPjxhIG5hbWU9ImZpZWxkX1hTTFZhbGlkYXRvcl84Ij5YU0xWYWxpZGF0b3JfODwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmcgPHN0cm9uZz5YU0xWYWxpZGF0b3JfODwvc3Ryb25nPjwvY29kZT48L3A+PHRhYmxlPjx0cj48dGQ+VW5yZXNvbHZlZCBpbXBvcnQ8L3RkPjwvdHI+PC90YWJsZT48aHI+PHRhYmxlIGNvbHM9IjIiIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiPjx0ciBjb2xzcGFuPSIyIiB3aWR0aD0iMTAwJSIgYmdjb2xvcj0iI0NDQ0NGRiIgYWxpZ249ImxlZnQiPjx0ZD48aDI+Ci0gICAgICAgICAgICAgICAgICBDb25zdHJ1Y3RvciBEZXRhaWwKLSAgICAgICAgICAgICAgIDwvaDI+PC90ZD48L3RyPjwvdGFibGU+PGgyPjxhIG5hbWU9ImNvbl9NZXNzYWdlcyI+TWVzc2FnZXM8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgPHN0cm9uZz5NZXNzYWdlczwvc3Ryb25nPigpPC9jb2RlPjwvcD48cD48L3A+PGhyPjx0YWJsZSBjb2xzPSIyIiB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIj48dHIgY29sc3Bhbj0iMiIgd2lkdGg9IjEwMCUiIGJnY29sb3I9IiNDQ0NDRkYiIGFsaWduPSJsZWZ0Ij48dGQ+PGgyPgotICAgICAgICAgICAgICAgICAgTWV0aG9kcyBEZXRhaWwKLSAgICAgICAgICAgICAgIDwvaDI+PC90ZD48L3RyPjwvdGFibGU+PGgyPjxhIG5hbWU9Im1ldGhvZF9yZWxvYWRNZXNzYWdlcyI+cmVsb2FkTWVzc2FnZXM8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgdm9pZCA8c3Ryb25nPnJlbG9hZE1lc3NhZ2VzPC9zdHJvbmc+KCk8L2NvZGU+PC9wPjxwPlRPRE86IEFkZCBKYXZhRG9jPC9wPjxocj48L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi9kb2MvaHRtbC9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuVmFsaWRhdGlvblByZWZlcmVuY2VzLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuc2RrLmRvY3VtZW50YXRpb24vZG9jL2h0bWwvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLlZhbGlkYXRpb25QcmVmZXJlbmNlcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTZhYTgzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi9kb2MvaHRtbC9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuVmFsaWRhdGlvblByZWZlcmVuY2VzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi08aHRtbD48Ym9keT48cD48Zm9udCBzaXplPSIrMSI+PHN0cm9uZz5QYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuY29yZTwvc3Ryb25nPjwvZm9udD48L3A+PGhyPjxoMj48Zm9udCBzaXplPSItMSI+PHN0cm9uZz5vcmcuZWNsaXBzZS53c3QueHNsLmNvcmU8L3N0cm9uZz48L2ZvbnQ+PGJyPgotICAgICAgICAgICAgICAgQ2xhc3MgVmFsaWRhdGlvblByZWZlcmVuY2VzPC9oMj48YnI+PGhyPjxwcmU+cHVibGljIGNsYXNzIDxzdHJvbmc+VmFsaWRhdGlvblByZWZlcmVuY2VzPC9zdHJvbmc+Ci1leHRlbmRzIGphdmEubGFuZy5PYmplY3Q8L3ByZT5QcmVmZXJlbmNlIGNvbnN0YW50cyBzcGVjaWZpYyB0byB0aGUgWFNMIHZhbGlkYXRvci48cD48L3A+PHA+PC9wPjxocj48dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSI+PHRyIGNvbHM9IjIiIGJnY29sb3I9IiNDQ0NDRkYiPjx0ZCBjb2xzcGFuPSIyIiB3aWR0aD0iMTAwJSI+PGgyPkZpZWxkIFN1bW1hcnk8L2gyPjwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmc8L2NvZGU+PC90ZD48dGQgd2lkdGg9IjgwJSIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNmaWVsZF9DQUxMX1RFTVBMQVRFUyI+Q0FMTF9URU1QTEFURVM8L2E+PC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgVGhlIGxldmVsIGF0IHdoaWNoIGFuIHVucmVzb2x2ZWQgY2FsbGVkIHRlbXBsYXRlIGlzIHJlcG9ydGVkLiAKLSAmbHQ7cCZndDsKLSBWYWx1ZSBpcyBvbmUgb2YgJmx0O2NvZGUmZ3Q7SU1hcmtlci5TRVZFUklUWV9FUlJPUiwgSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HLCBJTWFya2VyLlNFVkVSSVRZX0lORk8mbHQ7L2NvZGUmZ3Q7Ci0gJmx0Oy9wJmd0OzwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmc8L2NvZGU+PC90ZD48dGQgd2lkdGg9IjgwJSIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNmaWVsZF9DSVJDVUxBUl9SRUYiPkNJUkNVTEFSX1JFRjwvYT48L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICBUaGUgbGV2ZWwgYXQgd2hpY2ggYW4gaW5jbHVkZS9pbXBvcnQgY2lyY3VsYXIgcmVmZXJlbmNlcyBpcyByZXBvcnRlZC4KLSAmbHQ7cCZndDsKLSBWYWx1ZSBpcyBvbmUgb2YgJmx0O2NvZGUmZ3Q7SU1hcmtlci5TRVZFUklUWV9FUlJPUiwgSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HLCBJTWFya2VyLlNFVkVSSVRZX0lORk8mbHQ7L2NvZGUmZ3Q7Ci0gJmx0Oy9wJmd0OzwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmc8L2NvZGU+PC90ZD48dGQgd2lkdGg9IjgwJSIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNmaWVsZF9EVVBMSUNBVEVfUEFSQU1FVEVSIj5EVVBMSUNBVEVfUEFSQU1FVEVSPC9hPjwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIFRoZSBsZXZlbCBhdCB3aGljaCBhIGR1cGxpY2F0ZSBwYXJhbWV0ZXIgaXMgcmVwb3J0ZWQuCi0gJmx0O3AmZ3Q7Ci0gVmFsdWUgaXMgb25lIG9mICZsdDtjb2RlJmd0O0lNYXJrZXIuU0VWRVJJVFlfRVJST1IsIElNYXJrZXIuU0VWRVJJVFlfV0FSTklORywgSU1hcmtlci5TRVZFUklUWV9JTkZPJmx0Oy9jb2RlJmd0OwotICZsdDsvcCZndDs8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSI4MCUiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjZmllbGRfRU1QVFlfUEFSQU0iPkVNUFRZX1BBUkFNPC9hPjwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIFRoZSBsZXZlbCBhdCB3aGljaCBhIHBhcmFtZXRlciB0aGF0IGRvZXMgbm90IGhhdmUgYSBkZWZhdWx0IHZhbHVlIGFuZCBkb2VzIG5vdCBzcGVjaWZ5IGEgdmFsdWUgaXMgcmVwb3J0ZWQuCi0gJmx0O3AmZ3Q7Ci0gVmFsdWUgaXMgb25lIG9mICZsdDtjb2RlJmd0O0lNYXJrZXIuU0VWRVJJVFlfRVJST1IsIElNYXJrZXIuU0VWRVJJVFlfV0FSTklORywgSU1hcmtlci5TRVZFUklUWV9JTkZPJmx0Oy9jb2RlJmd0OwotICZsdDsvcCZndDs8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSI4MCUiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjZmllbGRfTUFYX0VSUk9SUyI+TUFYX0VSUk9SUzwvYT48L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICBUaGUgbWF4aW11bSBudW1iZXIgb2YgZXJyb3JzIGFsbG93ZWQgcGVyIFhTTCBmaWxlLgotICZsdDtwJmd0OwotIFZhbHVlIGlzIG9mIHR5cGUgJmx0O2NvZGUmZ3Q7SW50ZWdlciZsdDsvY29kZSZndDsuCi0gJmx0Oy9wJmd0OzwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmc8L2NvZGU+PC90ZD48dGQgd2lkdGg9IjgwJSIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNmaWVsZF9NSVNTSU5HX0lOQ0xVREUiPk1JU1NJTkdfSU5DTFVERTwvYT48L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICBUaGUgbGV2ZWwgYXQgd2hpY2ggYW4gdW5yZXNvbHZlZCBpbXBvcnQgb3IgaW5jbHVkZWQgaXMgcmVwb3J0ZWQuCi0gJmx0O3AmZ3Q7Ci0gVmFsdWUgaXMgb25lIG9mICZsdDtjb2RlJmd0O0lNYXJrZXIuU0VWRVJJVFlfRVJST1IsIElNYXJrZXIuU0VWRVJJVFlfV0FSTklORywgSU1hcmtlci5TRVZFUklUWV9JTkZPJmx0Oy9jb2RlJmd0OwotICZsdDsvcCZndDs8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSI4MCUiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjZmllbGRfTUlTU0lOR19QQVJBTSI+TUlTU0lOR19QQVJBTTwvYT48L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICBUaGUgbGV2ZWwgYXQgd2hpY2ggYSBtaXNzaW5nIHBhcmFtZXRlciBpcyByZXBvcnRlZC4KLSAmbHQ7cCZndDsKLSBWYWx1ZSBpcyBvbmUgb2YgJmx0O2NvZGUmZ3Q7SU1hcmtlci5TRVZFUklUWV9FUlJPUiwgSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HLCBJTWFya2VyLlNFVkVSSVRZX0lORk8mbHQ7L2NvZGUmZ3Q7Ci0gJmx0Oy9wJmd0OzwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmc8L2NvZGU+PC90ZD48dGQgd2lkdGg9IjgwJSIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNmaWVsZF9OQU1FX0FUVFJJQlVURV9FTVBUWSI+TkFNRV9BVFRSSUJVVEVfRU1QVFk8L2E+PC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgVGhlIGxldmVsIGF0IHdoaWNoIGEgcGFyYW1ldGVyIHdpdGggYW4gZW1wdHkgbmFtZSBhdHRyaWJ1dGUgaXMgcmVwb3J0ZWQuCi0gJmx0O3AmZ3Q7Ci0gVmFsdWUgaXMgb25lIG9mICZsdDtjb2RlJmd0O0lNYXJrZXIuU0VWRVJJVFlfRVJST1IsIElNYXJrZXIuU0VWRVJJVFlfV0FSTklORywgSU1hcmtlci5TRVZFUklUWV9JTkZPJmx0Oy9jb2RlJmd0OwotICZsdDsvcCZndDs8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSI4MCUiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjZmllbGRfTkFNRV9BVFRSSUJVVEVfTUlTU0lORyI+TkFNRV9BVFRSSUJVVEVfTUlTU0lORzwvYT48L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICBUaGUgbGV2ZWwgYXQgd2hpY2ggYSBwYXJhbWV0ZXIgd2l0aG91dCBhIG5hbWUgYXR0cmlidXRlIGlzIHJlcG9ydGVkLgotICZsdDtwJmd0OwotIFZhbHVlIGlzIG9uZSBvZiAmbHQ7Y29kZSZndDtJTWFya2VyLlNFVkVSSVRZX0VSUk9SLCBJTWFya2VyLlNFVkVSSVRZX1dBUk5JTkcsIElNYXJrZXIuU0VWRVJJVFlfSU5GTyZsdDsvY29kZSZndDsKLSAmbHQ7L3AmZ3Q7PC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIHN0YXRpYyAgamF2YS5sYW5nLlN0cmluZzwvY29kZT48L3RkPjx0ZCB3aWR0aD0iODAlIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI2ZpZWxkX1RFTVBMQVRFX0NPTkZMSUNUIj5URU1QTEFURV9DT05GTElDVDwvYT48L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICBUaGUgbGV2ZWwgYXQgd2hpY2ggYSB0ZW1wbGF0ZSBjb25mbGljdCBpcyByZXBvcnRlZC4KLSAmbHQ7cCZndDsKLSBWYWx1ZSBpcyBvbmUgb2YgJmx0O2NvZGUmZ3Q7SU1hcmtlci5TRVZFUklUWV9FUlJPUiwgSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HLCBJTWFya2VyLlNFVkVSSVRZX0lORk8mbHQ7L2NvZGUmZ3Q7Ci0gJmx0Oy9wJmd0OzwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmc8L2NvZGU+PC90ZD48dGQgd2lkdGg9IjgwJSIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNmaWVsZF9YUEFUSFMiPlhQQVRIUzwvYT48L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICBUaGUgbGV2ZWwgYXQgd2hpY2ggYW4gaW52YWxpZCBYUGF0aCBpcyByZXBvcnRlZC4KLSAmbHQ7cCZndDsKLSBWYWx1ZSBpcyBvbmUgb2YgJmx0O2NvZGUmZ3Q7SU1hcmtlci5TRVZFUklUWV9FUlJPUiwgSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HLCBJTWFya2VyLlNFVkVSSVRZX0lORk8mbHQ7L2NvZGUmZ3Q7Ci0gJmx0Oy9wJmd0OzwvdGQ+PC90cj48L3RhYmxlPjxicj48dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSI+PHRyIGJnY29sb3I9IiNDQ0NDRkYiPjx0ZCB3aWR0aD0iMTAwJSI+PGgyPkNvbnN0cnVjdG9yIFN1bW1hcnk8L2gyPjwvdGQ+PC90cj48dHI+PHRkPjxjb2RlPjxzdHJvbmc+PGEgaHJlZj0iI2Nvbl9WYWxpZGF0aW9uUHJlZmVyZW5jZXMiPlZhbGlkYXRpb25QcmVmZXJlbmNlczwvYT48L3N0cm9uZz4oKTwvY29kZT48L3RkPjwvdHI+PC90YWJsZT48YnI+PHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiPjx0ciBjb2xzPSIyIiBiZ2NvbG9yPSIjQ0NDQ0ZGIj48dGQgY29sc3Bhbj0iMiIgd2lkdGg9IjEwMCUiPjxoMj5NZXRob2QgU3VtbWFyeTwvaDI+PC90ZD48L3RyPjwvdGFibGU+PGhyPjx0YWJsZSBjb2xzPSIyIiB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIj48dHIgY29sc3Bhbj0iMiIgd2lkdGg9IjEwMCUiIGJnY29sb3I9IiNDQ0NDRkYiIGFsaWduPSJsZWZ0Ij48dGQ+PGgyPgotICAgICAgICAgICAgICAgICAgRmllbGQgRGV0YWlsCi0gICAgICAgICAgICAgICA8L2gyPjwvdGQ+PC90cj48L3RhYmxlPjxoMj48YSBuYW1lPSJmaWVsZF9DQUxMX1RFTVBMQVRFUyI+Q0FMTF9URU1QTEFURVM8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nIDxzdHJvbmc+Q0FMTF9URU1QTEFURVM8L3N0cm9uZz48L2NvZGU+PC9wPjx0YWJsZT48dHI+PHRkPlRoZSBsZXZlbCBhdCB3aGljaCBhbiB1bnJlc29sdmVkIGNhbGxlZCB0ZW1wbGF0ZSBpcyByZXBvcnRlZC4gCi0gPHA+Ci0gVmFsdWUgaXMgb25lIG9mIDxjb2RlPklNYXJrZXIuU0VWRVJJVFlfRVJST1IsIElNYXJrZXIuU0VWRVJJVFlfV0FSTklORywgSU1hcmtlci5TRVZFUklUWV9JTkZPPC9jb2RlPgotIDwvcD48L3RkPjwvdHI+PC90YWJsZT48aHI+PGgyPjxhIG5hbWU9ImZpZWxkX0NJUkNVTEFSX1JFRiI+Q0lSQ1VMQVJfUkVGPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIHN0YXRpYyAgamF2YS5sYW5nLlN0cmluZyA8c3Ryb25nPkNJUkNVTEFSX1JFRjwvc3Ryb25nPjwvY29kZT48L3A+PHRhYmxlPjx0cj48dGQ+VGhlIGxldmVsIGF0IHdoaWNoIGFuIGluY2x1ZGUvaW1wb3J0IGNpcmN1bGFyIHJlZmVyZW5jZXMgaXMgcmVwb3J0ZWQuCi0gPHA+Ci0gVmFsdWUgaXMgb25lIG9mIDxjb2RlPklNYXJrZXIuU0VWRVJJVFlfRVJST1IsIElNYXJrZXIuU0VWRVJJVFlfV0FSTklORywgSU1hcmtlci5TRVZFUklUWV9JTkZPPC9jb2RlPgotIDwvcD48L3RkPjwvdHI+PC90YWJsZT48aHI+PGgyPjxhIG5hbWU9ImZpZWxkX0RVUExJQ0FURV9QQVJBTUVURVIiPkRVUExJQ0FURV9QQVJBTUVURVI8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nIDxzdHJvbmc+RFVQTElDQVRFX1BBUkFNRVRFUjwvc3Ryb25nPjwvY29kZT48L3A+PHRhYmxlPjx0cj48dGQ+VGhlIGxldmVsIGF0IHdoaWNoIGEgZHVwbGljYXRlIHBhcmFtZXRlciBpcyByZXBvcnRlZC4KLSA8cD4KLSBWYWx1ZSBpcyBvbmUgb2YgPGNvZGU+SU1hcmtlci5TRVZFUklUWV9FUlJPUiwgSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HLCBJTWFya2VyLlNFVkVSSVRZX0lORk88L2NvZGU+Ci0gPC9wPjwvdGQ+PC90cj48L3RhYmxlPjxocj48aDI+PGEgbmFtZT0iZmllbGRfRU1QVFlfUEFSQU0iPkVNUFRZX1BBUkFNPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIHN0YXRpYyAgamF2YS5sYW5nLlN0cmluZyA8c3Ryb25nPkVNUFRZX1BBUkFNPC9zdHJvbmc+PC9jb2RlPjwvcD48dGFibGU+PHRyPjx0ZD5UaGUgbGV2ZWwgYXQgd2hpY2ggYSBwYXJhbWV0ZXIgdGhhdCBkb2VzIG5vdCBoYXZlIGEgZGVmYXVsdCB2YWx1ZSBhbmQgZG9lcyBub3Qgc3BlY2lmeSBhIHZhbHVlIGlzIHJlcG9ydGVkLgotIDxwPgotIFZhbHVlIGlzIG9uZSBvZiA8Y29kZT5JTWFya2VyLlNFVkVSSVRZX0VSUk9SLCBJTWFya2VyLlNFVkVSSVRZX1dBUk5JTkcsIElNYXJrZXIuU0VWRVJJVFlfSU5GTzwvY29kZT4KLSA8L3A+PC90ZD48L3RyPjwvdGFibGU+PGhyPjxoMj48YSBuYW1lPSJmaWVsZF9NQVhfRVJST1JTIj5NQVhfRVJST1JTPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIHN0YXRpYyAgamF2YS5sYW5nLlN0cmluZyA8c3Ryb25nPk1BWF9FUlJPUlM8L3N0cm9uZz48L2NvZGU+PC9wPjx0YWJsZT48dHI+PHRkPlRoZSBtYXhpbXVtIG51bWJlciBvZiBlcnJvcnMgYWxsb3dlZCBwZXIgWFNMIGZpbGUuCi0gPHA+Ci0gVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5JbnRlZ2VyPC9jb2RlPi4KLSA8L3A+PC90ZD48L3RyPjwvdGFibGU+PGhyPjxoMj48YSBuYW1lPSJmaWVsZF9NSVNTSU5HX0lOQ0xVREUiPk1JU1NJTkdfSU5DTFVERTwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmcgPHN0cm9uZz5NSVNTSU5HX0lOQ0xVREU8L3N0cm9uZz48L2NvZGU+PC9wPjx0YWJsZT48dHI+PHRkPlRoZSBsZXZlbCBhdCB3aGljaCBhbiB1bnJlc29sdmVkIGltcG9ydCBvciBpbmNsdWRlZCBpcyByZXBvcnRlZC4KLSA8cD4KLSBWYWx1ZSBpcyBvbmUgb2YgPGNvZGU+SU1hcmtlci5TRVZFUklUWV9FUlJPUiwgSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HLCBJTWFya2VyLlNFVkVSSVRZX0lORk88L2NvZGU+Ci0gPC9wPjwvdGQ+PC90cj48L3RhYmxlPjxocj48aDI+PGEgbmFtZT0iZmllbGRfTUlTU0lOR19QQVJBTSI+TUlTU0lOR19QQVJBTTwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmcgPHN0cm9uZz5NSVNTSU5HX1BBUkFNPC9zdHJvbmc+PC9jb2RlPjwvcD48dGFibGU+PHRyPjx0ZD5UaGUgbGV2ZWwgYXQgd2hpY2ggYSBtaXNzaW5nIHBhcmFtZXRlciBpcyByZXBvcnRlZC4KLSA8cD4KLSBWYWx1ZSBpcyBvbmUgb2YgPGNvZGU+SU1hcmtlci5TRVZFUklUWV9FUlJPUiwgSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HLCBJTWFya2VyLlNFVkVSSVRZX0lORk88L2NvZGU+Ci0gPC9wPjwvdGQ+PC90cj48L3RhYmxlPjxocj48aDI+PGEgbmFtZT0iZmllbGRfTkFNRV9BVFRSSUJVVEVfRU1QVFkiPk5BTUVfQVRUUklCVVRFX0VNUFRZPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIHN0YXRpYyAgamF2YS5sYW5nLlN0cmluZyA8c3Ryb25nPk5BTUVfQVRUUklCVVRFX0VNUFRZPC9zdHJvbmc+PC9jb2RlPjwvcD48dGFibGU+PHRyPjx0ZD5UaGUgbGV2ZWwgYXQgd2hpY2ggYSBwYXJhbWV0ZXIgd2l0aCBhbiBlbXB0eSBuYW1lIGF0dHJpYnV0ZSBpcyByZXBvcnRlZC4KLSA8cD4KLSBWYWx1ZSBpcyBvbmUgb2YgPGNvZGU+SU1hcmtlci5TRVZFUklUWV9FUlJPUiwgSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HLCBJTWFya2VyLlNFVkVSSVRZX0lORk88L2NvZGU+Ci0gPC9wPjwvdGQ+PC90cj48L3RhYmxlPjxocj48aDI+PGEgbmFtZT0iZmllbGRfTkFNRV9BVFRSSUJVVEVfTUlTU0lORyI+TkFNRV9BVFRSSUJVVEVfTUlTU0lORzwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmcgPHN0cm9uZz5OQU1FX0FUVFJJQlVURV9NSVNTSU5HPC9zdHJvbmc+PC9jb2RlPjwvcD48dGFibGU+PHRyPjx0ZD5UaGUgbGV2ZWwgYXQgd2hpY2ggYSBwYXJhbWV0ZXIgd2l0aG91dCBhIG5hbWUgYXR0cmlidXRlIGlzIHJlcG9ydGVkLgotIDxwPgotIFZhbHVlIGlzIG9uZSBvZiA8Y29kZT5JTWFya2VyLlNFVkVSSVRZX0VSUk9SLCBJTWFya2VyLlNFVkVSSVRZX1dBUk5JTkcsIElNYXJrZXIuU0VWRVJJVFlfSU5GTzwvY29kZT4KLSA8L3A+PC90ZD48L3RyPjwvdGFibGU+PGhyPjxoMj48YSBuYW1lPSJmaWVsZF9URU1QTEFURV9DT05GTElDVCI+VEVNUExBVEVfQ09ORkxJQ1Q8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nIDxzdHJvbmc+VEVNUExBVEVfQ09ORkxJQ1Q8L3N0cm9uZz48L2NvZGU+PC9wPjx0YWJsZT48dHI+PHRkPlRoZSBsZXZlbCBhdCB3aGljaCBhIHRlbXBsYXRlIGNvbmZsaWN0IGlzIHJlcG9ydGVkLgotIDxwPgotIFZhbHVlIGlzIG9uZSBvZiA8Y29kZT5JTWFya2VyLlNFVkVSSVRZX0VSUk9SLCBJTWFya2VyLlNFVkVSSVRZX1dBUk5JTkcsIElNYXJrZXIuU0VWRVJJVFlfSU5GTzwvY29kZT4KLSA8L3A+PC90ZD48L3RyPjwvdGFibGU+PGhyPjxoMj48YSBuYW1lPSJmaWVsZF9YUEFUSFMiPlhQQVRIUzwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmcgPHN0cm9uZz5YUEFUSFM8L3N0cm9uZz48L2NvZGU+PC9wPjx0YWJsZT48dHI+PHRkPlRoZSBsZXZlbCBhdCB3aGljaCBhbiBpbnZhbGlkIFhQYXRoIGlzIHJlcG9ydGVkLgotIDxwPgotIFZhbHVlIGlzIG9uZSBvZiA8Y29kZT5JTWFya2VyLlNFVkVSSVRZX0VSUk9SLCBJTWFya2VyLlNFVkVSSVRZX1dBUk5JTkcsIElNYXJrZXIuU0VWRVJJVFlfSU5GTzwvY29kZT4KLSA8L3A+PC90ZD48L3RyPjwvdGFibGU+PGhyPjx0YWJsZSBjb2xzPSIyIiB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIj48dHIgY29sc3Bhbj0iMiIgd2lkdGg9IjEwMCUiIGJnY29sb3I9IiNDQ0NDRkYiIGFsaWduPSJsZWZ0Ij48dGQ+PGgyPgotICAgICAgICAgICAgICAgICAgQ29uc3RydWN0b3IgRGV0YWlsCi0gICAgICAgICAgICAgICA8L2gyPjwvdGQ+PC90cj48L3RhYmxlPjxoMj48YSBuYW1lPSJjb25fVmFsaWRhdGlvblByZWZlcmVuY2VzIj5WYWxpZGF0aW9uUHJlZmVyZW5jZXM8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgPHN0cm9uZz5WYWxpZGF0aW9uUHJlZmVyZW5jZXM8L3N0cm9uZz4oKTwvY29kZT48L3A+PHA+PC9wPjxocj48L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi9kb2MvaHRtbC9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuWFNMQ29yZS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uL2RvYy9odG1sL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS5YU0xDb3JlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMDZjNmEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uL2RvYy9odG1sL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS5YU0xDb3JlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08aHRtbD48Ym9keT48cD48Zm9udCBzaXplPSIrMSI+PHN0cm9uZz5QYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuY29yZTwvc3Ryb25nPjwvZm9udD48L3A+PGhyPjxoMj48Zm9udCBzaXplPSItMSI+PHN0cm9uZz5vcmcuZWNsaXBzZS53c3QueHNsLmNvcmU8L3N0cm9uZz48L2ZvbnQ+PGJyPgotICAgICAgICAgICAgICAgQ2xhc3MgWFNMQ29yZTwvaDI+PGJyPjxocj48cHJlPnB1YmxpYyBjbGFzcyA8c3Ryb25nPlhTTENvcmU8L3N0cm9uZz4KLWV4dGVuZHMgamF2YS5sYW5nLk9iamVjdDwvcHJlPlRoZSBpbnRlcmZhY2UgdG8gYWxsIGFzcGVjdHMgb2YgdGhlIFhTTCBjb3JlIGZ1bmN0aW9uYWxpdHkuCi0gPHA+Ci0gVGhpcyBpcyByZXNwb25zaWJsZSBmb3IgYnVpbGRpbmcgYW5kIG1haW50YWluaW5nIHRoZSBjYWNoZSBvZiBidWlsdCBYU0wgbW9kZWxzLgotIDwvcD48cD48L3A+PGhyPjx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIj48dHIgY29scz0iMiIgYmdjb2xvcj0iI0NDQ0NGRiI+PHRkIGNvbHNwYW49IjIiIHdpZHRoPSIxMDAlIj48aDI+RmllbGQgU3VtbWFyeTwvaDI+PC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIHN0YXRpYyAgamF2YS5sYW5nLlN0cmluZzwvY29kZT48L3RkPjx0ZCB3aWR0aD0iODAlIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI2ZpZWxkX1hTTF9DT05URU5UX1RZUEUiPlhTTF9DT05URU5UX1RZUEU8L2E+PC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgVGhlIFhTTCBjb250ZW50IHR5cGUgKD0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhzbHNvdXJjZSk8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSI4MCUiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjZmllbGRfWFNMX05BTUVTUEFDRV9VUkkiPlhTTF9OQU1FU1BBQ0VfVVJJPC9hPjwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIFRoZSBYU0wgbmFtZXNwYWNlIFVSSSAoPSBodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0pPC90ZD48L3RyPjwvdGFibGU+PGJyPjx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIj48dHIgY29scz0iMiIgYmdjb2xvcj0iI0NDQ0NGRiI+PHRkIGNvbHNwYW49IjIiIHdpZHRoPSIxMDAlIj48aDI+TWV0aG9kIFN1bW1hcnk8L2gyPjwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyBTdHlsZXNoZWV0TW9kZWw8L2NvZGU+PC90ZD48dGQgd2lkdGg9IiIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNtZXRob2RfYnVpbGRTdHlsZXNoZWV0Ij5idWlsZFN0eWxlc2hlZXQ8L2E+KElGaWxlIGZpbGUpPC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgQ29tcGxldGVseSByZWJ1aWxkIHRoZSBzb3VyY2UgZmlsZSBmcm9tIGl0cyBET008L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgdm9pZDwvY29kZT48L3RkPjx0ZCB3aWR0aD0iIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI21ldGhvZF9jbGVhbiI+Y2xlYW48L2E+KElQcm9qZWN0IHByb2plY3QKLSAgICAgICAgICwKLSAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik8L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICBDbGVhbiBhbGwgb2YgdGhlIHN0eWxlc2hlZXRzIGZyb20gdGhlIGdpdmVuIHByb2plY3QuPC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIHN0YXRpYyBvcmcudzNjLmRvbS5BdHRyPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSIiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjbWV0aG9kX2dldEN1cnJlbnRBdHRyTm9kZSI+Z2V0Q3VycmVudEF0dHJOb2RlPC9hPihvcmcudzNjLmRvbS5Ob2RlIG5vZGUKLSAgICAgICAgICwKLSAgICAgIGludCBvZmZzZXQpPC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgUmV0dXJucyBhbiBBdHRyIG5vZGUgZm9yIHRoZSBjdXJyZW50IE5vZGUgaWYgb25lIGV4aXRzIGF0IHRoZSBzcGVjaWZpZWQgb2Zmc2V0LjwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyBzdGF0aWMgb3JnLnczYy5kb20uTm9kZTwvY29kZT48L3RkPjx0ZCB3aWR0aD0iIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI21ldGhvZF9nZXRDdXJyZW50Tm9kZSI+Z2V0Q3VycmVudE5vZGU8L2E+KElEb2N1bWVudCBkb2N1bWVudAotICAgICAgICAgLAotICAgICAgaW50IG9mZnNldCk8L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICBSZXR1cm5zIHRoZSBjdXJyZW50IE5vZGUgYXQgdGhlIHNwZWNpZmllZCBvZmZzZXQuPC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIHN0YXRpYyBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuWFNMQ29yZTwvY29kZT48L3RkPjx0ZCB3aWR0aD0iIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI21ldGhvZF9nZXRJbnN0YW5jZSI+Z2V0SW5zdGFuY2U8L2E+KCk8L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICBHZXQgdGhlIHNpbmdsZXRvbiA8Y29kZT5YU0xDb3JlPC9jb2RlPiBpbnN0YW5jZS48L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgU3R5bGVzaGVldE1vZGVsPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSIiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjbWV0aG9kX2dldFN0eWxlc2hlZXQiPmdldFN0eWxlc2hlZXQ8L2E+KElGaWxlIGZpbGUpPC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgR2V0IHRoZSBjYWNoZWQgc3R5bGVzaGVldCwgb3IgYnVpbGQgaXQgaWYgaXQgaGFzIG5vdCB5ZXQgYmVlbiBidWlsdC48L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgc3RhdGljIGJvb2xlYW48L2NvZGU+PC90ZD48dGQgd2lkdGg9IiIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNtZXRob2RfaXNYTUxGaWxlIj5pc1hNTEZpbGU8L2E+KElGaWxlIGZpbGUpPC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGdpdmVuIGZpbGUgaXMgYW4gWE1MIGZpbGUgYnkgaW5zcGVjdGluZyBpdHMgY29udGVudCB0eXBlcy48L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgc3RhdGljIGJvb2xlYW48L2NvZGU+PC90ZD48dGQgd2lkdGg9IiIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNtZXRob2RfaXNYU0xGaWxlIj5pc1hTTEZpbGU8L2E+KElGaWxlIGZpbGUpPC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGdpdmVuIGZpbGUgaXMgYW4gWFNMIGZpbGUgYnkgaW5zcGVjdGluZyBpdHMgY29udGVudCB0eXBlcy48L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgc3RhdGljIGJvb2xlYW48L2NvZGU+PC90ZD48dGQgd2lkdGg9IiIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNtZXRob2RfaXNYU0xOYW1lc3BhY2UiPmlzWFNMTmFtZXNwYWNlPC9hPihJRE9NTm9kZSBub2RlKTwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIFRha2VzIGEgZ2l2ZW4gPGNvZGU+SURPTU5vZGU8L2NvZGU+IGFuZCByZXR1cm5zIHdoZXRoZXIgaXQgCi0gaXMgcGFydCBvZiB0aGUgdGhlIFhTTFQgTmFtZXNwYWNlLjwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyBzdGF0aWMgSUZpbGU8L2NvZGU+PC90ZD48dGQgd2lkdGg9IiIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNtZXRob2RfcmVzb2x2ZUZpbGUiPnJlc29sdmVGaWxlPC9hPihJRmlsZSBjdXJyZW50RmlsZQotICAgICAgICAgLAotICAgICAgamF2YS5sYW5nLlN0cmluZyB1cmkpPC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgTG9jYXRlcyBhIGZpbGUgZm9yIHRoZSBnaXZlbiBjdXJyZW50IGZpbGUgYW5kIFVSSS48L3RkPjwvdHI+PC90YWJsZT48aHI+PHRhYmxlIGNvbHM9IjIiIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiPjx0ciBjb2xzcGFuPSIyIiB3aWR0aD0iMTAwJSIgYmdjb2xvcj0iI0NDQ0NGRiIgYWxpZ249ImxlZnQiPjx0ZD48aDI+Ci0gICAgICAgICAgICAgICAgICBGaWVsZCBEZXRhaWwKLSAgICAgICAgICAgICAgIDwvaDI+PC90ZD48L3RyPjwvdGFibGU+PGgyPjxhIG5hbWU9ImZpZWxkX1hTTF9DT05URU5UX1RZUEUiPlhTTF9DT05URU5UX1RZUEU8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgc3RhdGljICBqYXZhLmxhbmcuU3RyaW5nIDxzdHJvbmc+WFNMX0NPTlRFTlRfVFlQRTwvc3Ryb25nPjwvY29kZT48L3A+PHRhYmxlPjx0cj48dGQ+VGhlIFhTTCBjb250ZW50IHR5cGUgKD0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhzbHNvdXJjZSk8L3RkPjwvdHI+PC90YWJsZT48aHI+PGgyPjxhIG5hbWU9ImZpZWxkX1hTTF9OQU1FU1BBQ0VfVVJJIj5YU0xfTkFNRVNQQUNFX1VSSTwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyBzdGF0aWMgIGphdmEubGFuZy5TdHJpbmcgPHN0cm9uZz5YU0xfTkFNRVNQQUNFX1VSSTwvc3Ryb25nPjwvY29kZT48L3A+PHRhYmxlPjx0cj48dGQ+VGhlIFhTTCBuYW1lc3BhY2UgVVJJICg9IGh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSk8L3RkPjwvdHI+PC90YWJsZT48aHI+PHRhYmxlIGNvbHM9IjIiIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiPjx0ciBjb2xzcGFuPSIyIiB3aWR0aD0iMTAwJSIgYmdjb2xvcj0iI0NDQ0NGRiIgYWxpZ249ImxlZnQiPjx0ZD48aDI+Ci0gICAgICAgICAgICAgICAgICBNZXRob2RzIERldGFpbAotICAgICAgICAgICAgICAgPC9oMj48L3RkPjwvdHI+PC90YWJsZT48aDI+PGEgbmFtZT0ibWV0aG9kX2J1aWxkU3R5bGVzaGVldCI+YnVpbGRTdHlsZXNoZWV0PC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIFN0eWxlc2hlZXRNb2RlbCA8c3Ryb25nPmJ1aWxkU3R5bGVzaGVldDwvc3Ryb25nPihJRmlsZSBmaWxlKTwvY29kZT48L3A+PHA+Q29tcGxldGVseSByZWJ1aWxkIHRoZSBzb3VyY2UgZmlsZSBmcm9tIGl0cyBET008L3A+PGgzPlBhcmFtZXRlcnM8L2gzPjxwPjxjb2RlPmZpbGU8L2NvZGU+PC9wPjxoMz5SZXR1cm5zPC9oMz48cD48Y29kZT5TdHlsZXNoZWV0TW9kZWw8L2NvZGU+IC0gdGhlIHN0eWxlc2hlZXQgbW9kZWwsIG9yIG51bGwgaWYgaXQgY291bGQgbm90IGJlIGNyZWF0ZWQuPC9wPjxocj48aDI+PGEgbmFtZT0ibWV0aG9kX2NsZWFuIj5jbGVhbjwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyB2b2lkIDxzdHJvbmc+Y2xlYW48L3N0cm9uZz4oSVByb2plY3QgcHJvamVjdAotICAgICAgICAgLAotICAgICAgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTwvY29kZT48L3A+PHA+Q2xlYW4gYWxsIG9mIHRoZSBzdHlsZXNoZWV0cyBmcm9tIHRoZSBnaXZlbiBwcm9qZWN0LjwvcD48aDM+UGFyYW1ldGVyczwvaDM+PHA+PGNvZGU+cHJvamVjdDwvY29kZT4gLSB0aGUgcHJvamVjdCB0byBiZSBjbGVhbmVkPC9wPjxwPjxjb2RlPm1vbml0b3I8L2NvZGU+IC0gYSBwcm9ncmVzcyBtb25pdG9yIHRvIHRyYWNrIHRoZSBjbGVhbiBwcm9ncmVzczwvcD48aHI+PGgyPjxhIG5hbWU9Im1ldGhvZF9nZXRDdXJyZW50QXR0ck5vZGUiPmdldEN1cnJlbnRBdHRyTm9kZTwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyBvcmcudzNjLmRvbS5BdHRyIDxzdHJvbmc+Z2V0Q3VycmVudEF0dHJOb2RlPC9zdHJvbmc+KG9yZy53M2MuZG9tLk5vZGUgbm9kZQotICAgICAgICAgLAotICAgICAgaW50IG9mZnNldCk8L2NvZGU+PC9wPjxwPlJldHVybnMgYW4gQXR0ciBub2RlIGZvciB0aGUgY3VycmVudCBOb2RlIGlmIG9uZSBleGl0cyBhdCB0aGUgc3BlY2lmaWVkIG9mZnNldC48L3A+PGgzPlBhcmFtZXRlcnM8L2gzPjxwPjxjb2RlPm5vZGU8L2NvZGU+PC9wPjxwPjxjb2RlPm9mZnNldDwvY29kZT48L3A+PGgzPlJldHVybnM8L2gzPjxwPjxjb2RlPm9yZy53M2MuZG9tLkF0dHI8L2NvZGU+IC0gQSB3M2MuZG9tLkF0dHI8L3A+PGhyPjxoMj48YSBuYW1lPSJtZXRob2RfZ2V0Q3VycmVudE5vZGUiPmdldEN1cnJlbnROb2RlPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIG9yZy53M2MuZG9tLk5vZGUgPHN0cm9uZz5nZXRDdXJyZW50Tm9kZTwvc3Ryb25nPihJRG9jdW1lbnQgZG9jdW1lbnQKLSAgICAgICAgICwKLSAgICAgIGludCBvZmZzZXQpPC9jb2RlPjwvcD48cD5SZXR1cm5zIHRoZSBjdXJyZW50IE5vZGUgYXQgdGhlIHNwZWNpZmllZCBvZmZzZXQuPC9wPjxoMz5QYXJhbWV0ZXJzPC9oMz48cD48Y29kZT5kb2N1bWVudDwvY29kZT48L3A+PHA+PGNvZGU+b2Zmc2V0PC9jb2RlPjwvcD48aDM+UmV0dXJuczwvaDM+PHA+PGNvZGU+b3JnLnczYy5kb20uTm9kZTwvY29kZT4gLSBhbiB3M2MuZG9tLk5vZGU8L3A+PGhyPjxoMj48YSBuYW1lPSJtZXRob2RfZ2V0SW5zdGFuY2UiPmdldEluc3RhbmNlPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5YU0xDb3JlIDxzdHJvbmc+Z2V0SW5zdGFuY2U8L3N0cm9uZz4oKTwvY29kZT48L3A+PHA+R2V0IHRoZSBzaW5nbGV0b24gPGNvZGU+WFNMQ29yZTwvY29kZT4gaW5zdGFuY2UuPC9wPjxoMz5SZXR1cm5zPC9oMz48cD48Y29kZT5vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuWFNMQ29yZTwvY29kZT4gLSB0aGUgPGNvZGU+WFNMQ29yZTwvY29kZT4gaW5zdGFuY2U8L3A+PGhyPjxoMj48YSBuYW1lPSJtZXRob2RfZ2V0U3R5bGVzaGVldCI+Z2V0U3R5bGVzaGVldDwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyBTdHlsZXNoZWV0TW9kZWwgPHN0cm9uZz5nZXRTdHlsZXNoZWV0PC9zdHJvbmc+KElGaWxlIGZpbGUpPC9jb2RlPjwvcD48cD5HZXQgdGhlIGNhY2hlZCBzdHlsZXNoZWV0LCBvciBidWlsZCBpdCBpZiBpdCBoYXMgbm90IHlldCBiZWVuIGJ1aWx0LjwvcD48aDM+UGFyYW1ldGVyczwvaDM+PHA+PGNvZGU+ZmlsZTwvY29kZT48L3A+PGgzPlJldHVybnM8L2gzPjxwPjxjb2RlPlN0eWxlc2hlZXRNb2RlbDwvY29kZT4gLSBzb3VyY2UgZmlsZSwgb3IgbnVsbCBpZiBjb3VsZCBub3QgYmUgYnVpbHQ8L3A+PGhyPjxoMj48YSBuYW1lPSJtZXRob2RfaXNYTUxGaWxlIj5pc1hNTEZpbGU8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgYm9vbGVhbiA8c3Ryb25nPmlzWE1MRmlsZTwvc3Ryb25nPihJRmlsZSBmaWxlKTwvY29kZT48L3A+PHA+RGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGdpdmVuIGZpbGUgaXMgYW4gWE1MIGZpbGUgYnkgaW5zcGVjdGluZyBpdHMgY29udGVudCB0eXBlcy48L3A+PGgzPlBhcmFtZXRlcnM8L2gzPjxwPjxjb2RlPmZpbGU8L2NvZGU+IC0gdGhlIGZpbGUgdG8gaW5zcGVjdDwvcD48aDM+UmV0dXJuczwvaDM+PHA+PGNvZGU+Ym9vbGVhbjwvY29kZT4gLSB0cnVlIGlmIHRoaXMgZmlsZSBpcyBhbiBYTUwgZmlsZTwvcD48aHI+PGgyPjxhIG5hbWU9Im1ldGhvZF9pc1hTTEZpbGUiPmlzWFNMRmlsZTwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyBib29sZWFuIDxzdHJvbmc+aXNYU0xGaWxlPC9zdHJvbmc+KElGaWxlIGZpbGUpPC9jb2RlPjwvcD48cD5EZXRlcm1pbmUgd2hldGhlciB0aGUgZ2l2ZW4gZmlsZSBpcyBhbiBYU0wgZmlsZSBieSBpbnNwZWN0aW5nIGl0cyBjb250ZW50IHR5cGVzLjwvcD48aDM+UGFyYW1ldGVyczwvaDM+PHA+PGNvZGU+ZmlsZTwvY29kZT4gLSB0aGUgZmlsZSB0byBpbnNwZWN0PC9wPjxoMz5SZXR1cm5zPC9oMz48cD48Y29kZT5ib29sZWFuPC9jb2RlPiAtIHRydWUgaWYgdGhpcyBmaWxlIGlzIGFuIFhTTCBmaWxlPC9wPjxocj48aDI+PGEgbmFtZT0ibWV0aG9kX2lzWFNMTmFtZXNwYWNlIj5pc1hTTE5hbWVzcGFjZTwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyBib29sZWFuIDxzdHJvbmc+aXNYU0xOYW1lc3BhY2U8L3N0cm9uZz4oSURPTU5vZGUgbm9kZSk8L2NvZGU+PC9wPjxwPlRha2VzIGEgZ2l2ZW4gPGNvZGU+SURPTU5vZGU8L2NvZGU+IGFuZCByZXR1cm5zIHdoZXRoZXIgaXQgCi0gaXMgcGFydCBvZiB0aGUgdGhlIFhTTFQgTmFtZXNwYWNlLjwvcD48aDM+UGFyYW1ldGVyczwvaDM+PHA+PGNvZGU+bm9kZTwvY29kZT4gLSBUaGUgSURPTU5vZGUgdG8gYmUgY2hlY2tlZC48L3A+PGgzPlJldHVybnM8L2gzPjxwPjxjb2RlPmJvb2xlYW48L2NvZGU+IC0gVHJ1ZSBpZiBwYXJ0IG9mIHRoZSBYU0xUIG5hbWVzcGFjZSwgZmFsc2Ugb3RoZXJ3aXNlLjwvcD48aHI+PGgyPjxhIG5hbWU9Im1ldGhvZF9yZXNvbHZlRmlsZSI+cmVzb2x2ZUZpbGU8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgSUZpbGUgPHN0cm9uZz5yZXNvbHZlRmlsZTwvc3Ryb25nPihJRmlsZSBjdXJyZW50RmlsZQotICAgICAgICAgLAotICAgICAgamF2YS5sYW5nLlN0cmluZyB1cmkpPC9jb2RlPjwvcD48cD5Mb2NhdGVzIGEgZmlsZSBmb3IgdGhlIGdpdmVuIGN1cnJlbnQgZmlsZSBhbmQgVVJJLjwvcD48aDM+UGFyYW1ldGVyczwvaDM+PHA+PGNvZGU+Y3VycmVudEZpbGU8L2NvZGU+IC0gdGhlIGZpbGUgdG8gcmVzb2x2ZSByZWxhdGl2ZSB0bzwvcD48cD48Y29kZT51cmk8L2NvZGU+IC0gdGhlIHJlbGF0aXZlIFVSSTwvcD48aDM+UmV0dXJuczwvaDM+PHA+PGNvZGU+SUZpbGU8L2NvZGU+IC0gdGhlIGZpbGUgYXQgdGhlIFVSSSByZWxhdGl2ZSB0byB0aGlzIDxjb2RlPmN1cnJlbnRGaWxlPC9jb2RlPjwvcD48aHI+PC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuc2RrLmRvY3VtZW50YXRpb24vZG9jL2h0bWwvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLnJlc29sdmVyLlJlc29sdmVyRXh0ZW5zaW9uLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuc2RrLmRvY3VtZW50YXRpb24vZG9jL2h0bWwvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLnJlc29sdmVyLlJlc29sdmVyRXh0ZW5zaW9uLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NjhjOGEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uL2RvYy9odG1sL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS5yZXNvbHZlci5SZXNvbHZlckV4dGVuc2lvbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPGh0bWw+PGJvZHk+PHA+PGZvbnQgc2l6ZT0iKzEiPjxzdHJvbmc+UGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUucmVzb2x2ZXI8L3N0cm9uZz48L2ZvbnQ+PC9wPjxocj48aDI+PGZvbnQgc2l6ZT0iLTEiPjxzdHJvbmc+b3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLnJlc29sdmVyPC9zdHJvbmc+PC9mb250Pjxicj4KLSAgICAgICAgICAgICAgIENsYXNzIFJlc29sdmVyRXh0ZW5zaW9uPC9oMj48YnI+PGhyPjxwcmU+cHVibGljIGNsYXNzIDxzdHJvbmc+UmVzb2x2ZXJFeHRlbnNpb248L3N0cm9uZz4KLWV4dGVuZHMgamF2YS5sYW5nLk9iamVjdDwvcHJlPlRPRE86IEphdmFkb2M8cD48L3A+PGhyPjx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIj48dHIgYmdjb2xvcj0iI0NDQ0NGRiI+PHRkIHdpZHRoPSIxMDAlIj48aDI+Q29uc3RydWN0b3IgU3VtbWFyeTwvaDI+PC90ZD48L3RyPjx0cj48dGQ+PGNvZGU+PHN0cm9uZz48YSBocmVmPSIjY29uX1Jlc29sdmVyRXh0ZW5zaW9uIj5SZXNvbHZlckV4dGVuc2lvbjwvYT48L3N0cm9uZz4oKTwvY29kZT48L3RkPjwvdHI+PC90YWJsZT48YnI+PHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiPjx0ciBjb2xzPSIyIiBiZ2NvbG9yPSIjQ0NDQ0ZGIj48dGQgY29sc3Bhbj0iMiIgd2lkdGg9IjEwMCUiPjxoMj5NZXRob2QgU3VtbWFyeTwvaDI+PC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIGphdmEubGFuZy5TdHJpbmc8L2NvZGU+PC90ZD48dGQgd2lkdGg9IiIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNtZXRob2RfcmVzb2x2ZSI+cmVzb2x2ZTwvYT4oSUZpbGUgZmlsZQotICAgICAgICAgLAotICAgICAgamF2YS5sYW5nLlN0cmluZyBiYXNlTG9jYXRpb24KLSAgICAgICAgICwKLSAgICAgIGphdmEubGFuZy5TdHJpbmcgcHVibGljSWQKLSAgICAgICAgICwKLSAgICAgIGphdmEubGFuZy5TdHJpbmcgc3lzdGVtSWQpPC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgPC90ZD48L3RyPjwvdGFibGU+PGhyPjx0YWJsZSBjb2xzPSIyIiB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIj48dHIgY29sc3Bhbj0iMiIgd2lkdGg9IjEwMCUiIGJnY29sb3I9IiNDQ0NDRkYiIGFsaWduPSJsZWZ0Ij48dGQ+PGgyPgotICAgICAgICAgICAgICAgICAgQ29uc3RydWN0b3IgRGV0YWlsCi0gICAgICAgICAgICAgICA8L2gyPjwvdGQ+PC90cj48L3RhYmxlPjxoMj48YSBuYW1lPSJjb25fUmVzb2x2ZXJFeHRlbnNpb24iPlJlc29sdmVyRXh0ZW5zaW9uPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIDxzdHJvbmc+UmVzb2x2ZXJFeHRlbnNpb248L3N0cm9uZz4oKTwvY29kZT48L3A+PHA+PC9wPjxocj48dGFibGUgY29scz0iMiIgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSI+PHRyIGNvbHNwYW49IjIiIHdpZHRoPSIxMDAlIiBiZ2NvbG9yPSIjQ0NDQ0ZGIiBhbGlnbj0ibGVmdCI+PHRkPjxoMj4KLSAgICAgICAgICAgICAgICAgIE1ldGhvZHMgRGV0YWlsCi0gICAgICAgICAgICAgICA8L2gyPjwvdGQ+PC90cj48L3RhYmxlPjxoMj48YSBuYW1lPSJtZXRob2RfcmVzb2x2ZSI+cmVzb2x2ZTwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIDxzdHJvbmc+cmVzb2x2ZTwvc3Ryb25nPihJRmlsZSBmaWxlCi0gICAgICAgICAsCi0gICAgICBqYXZhLmxhbmcuU3RyaW5nIGJhc2VMb2NhdGlvbgotICAgICAgICAgLAotICAgICAgamF2YS5sYW5nLlN0cmluZyBwdWJsaWNJZAotICAgICAgICAgLAotICAgICAgamF2YS5sYW5nLlN0cmluZyBzeXN0ZW1JZCk8L2NvZGU+PC9wPjxwPjwvcD48aDM+UGFyYW1ldGVyczwvaDM+PHA+PGNvZGU+ZmlsZTwvY29kZT48L3A+PHA+PGNvZGU+YmFzZUxvY2F0aW9uPC9jb2RlPjwvcD48cD48Y29kZT5wdWJsaWNJZDwvY29kZT48L3A+PHA+PGNvZGU+c3lzdGVtSWQ8L2NvZGU+PC9wPjxoMz5SZXR1cm5zPC9oMz48cD48Y29kZT5qYXZhLmxhbmcuU3RyaW5nPC9jb2RlPjwvcD48aHI+PC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuc2RrLmRvY3VtZW50YXRpb24vZG9jL2h0bWwvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLnJlc29sdmVyLlhTTFZlcnNpb25IYW5kbGVyLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuc2RrLmRvY3VtZW50YXRpb24vZG9jL2h0bWwvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLnJlc29sdmVyLlhTTFZlcnNpb25IYW5kbGVyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMGYzMWEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uL2RvYy9odG1sL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS5yZXNvbHZlci5YU0xWZXJzaW9uSGFuZGxlci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotPGh0bWw+PGJvZHk+PHA+PGZvbnQgc2l6ZT0iKzEiPjxzdHJvbmc+UGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUucmVzb2x2ZXI8L3N0cm9uZz48L2ZvbnQ+PC9wPjxocj48aDI+PGZvbnQgc2l6ZT0iLTEiPjxzdHJvbmc+b3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLnJlc29sdmVyPC9zdHJvbmc+PC9mb250Pjxicj4KLSAgICAgICAgICAgICAgIENsYXNzIFhTTFZlcnNpb25IYW5kbGVyPC9oMj48YnI+PGhyPjxwcmU+cHVibGljIGNsYXNzIDxzdHJvbmc+WFNMVmVyc2lvbkhhbmRsZXI8L3N0cm9uZz4KLWV4dGVuZHMgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjwvcHJlPkEgc2ltcGxlIFhNTCBwYXJzZXIgdG8gZmluZCB0aGUgWFNMIHZlcnNpb24gb2YgYSBnaXZlbiBYTUwgZmlsZSwgZXhwZWN0ZWRseSBhIFhTTFQgc3R5bGVzaGVldC48aHI+PHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiPjx0ciBiZ2NvbG9yPSIjQ0NDQ0ZGIj48dGQgd2lkdGg9IjEwMCUiPjxoMj5Db25zdHJ1Y3RvciBTdW1tYXJ5PC9oMj48L3RkPjwvdHI+PHRyPjx0ZD48Y29kZT48c3Ryb25nPjxhIGhyZWY9IiNjb25fWFNMVmVyc2lvbkhhbmRsZXIiPlhTTFZlcnNpb25IYW5kbGVyPC9hPjwvc3Ryb25nPigpPC9jb2RlPjwvdGQ+PC90cj48L3RhYmxlPjxicj48dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSI+PHRyIGNvbHM9IjIiIGJnY29sb3I9IiNDQ0NDRkYiPjx0ZCBjb2xzcGFuPSIyIiB3aWR0aD0iMTAwJSI+PGgyPk1ldGhvZCBTdW1tYXJ5PC9oMj48L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgdm9pZDwvY29kZT48L3RkPjx0ZCB3aWR0aD0iIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI21ldGhvZF9jb21tZW50Ij5jb21tZW50PC9hPihjaGFyW10gY2gKLSAgICAgICAgICwKLSAgICAgIGludCBzdGFydAotICAgICAgICAgLAotICAgICAgaW50IGxlbmd0aCk8L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICA8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgdm9pZDwvY29kZT48L3RkPjx0ZCB3aWR0aD0iIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI21ldGhvZF9lbmRDREFUQSI+ZW5kQ0RBVEE8L2E+KCk8L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICA8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgdm9pZDwvY29kZT48L3RkPjx0ZCB3aWR0aD0iIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI21ldGhvZF9lbmREVEQiPmVuZERURDwvYT4oKTwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyB2b2lkPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSIiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjbWV0aG9kX2VuZEVudGl0eSI+ZW5kRW50aXR5PC9hPihqYXZhLmxhbmcuU3RyaW5nIG5hbWUpPC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgPC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIHZvaWQ8L2NvZGU+PC90ZD48dGQgd2lkdGg9IiIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNtZXRob2RfZXJyb3IiPmVycm9yPC9hPihvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbiBlKTwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyB2b2lkPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSIiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjbWV0aG9kX2ZhdGFsRXJyb3IiPmZhdGFsRXJyb3I8L2E+KG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uIGUpPC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgPC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIGphdmEubGFuZy5TdHJpbmc8L2NvZGU+PC90ZD48dGQgd2lkdGg9IiIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNtZXRob2RfZ2V0VmVyc2lvbkF0dHJpYnV0ZSI+Z2V0VmVyc2lvbkF0dHJpYnV0ZTwvYT4oKTwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIFRPRE86IEFkZCBKYXZhZG9jPC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIGJvb2xlYW48L2NvZGU+PC90ZD48dGQgd2lkdGg9IiIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNtZXRob2RfcGFyc2VDb250ZW50cyI+cGFyc2VDb250ZW50czwvYT4ob3JnLnhtbC5zYXguSW5wdXRTb3VyY2UgY29udGVudHMpPC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgVE9ETzogQWRkIEphdmFkb2M8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U8L2NvZGU+PC90ZD48dGQgd2lkdGg9IiIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNtZXRob2RfcmVzb2x2ZUVudGl0eSI+cmVzb2x2ZUVudGl0eTwvYT4oamF2YS5sYW5nLlN0cmluZyBwdWJsaWNJZAotICAgICAgICAgLAotICAgICAgamF2YS5sYW5nLlN0cmluZyBzeXN0ZW1JZCk8L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICA8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgdm9pZDwvY29kZT48L3RkPjx0ZCB3aWR0aD0iIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI21ldGhvZF9zdGFydENEQVRBIj5zdGFydENEQVRBPC9hPigpPC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgPC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIHZvaWQ8L2NvZGU+PC90ZD48dGQgd2lkdGg9IiIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNtZXRob2Rfc3RhcnREVEQiPnN0YXJ0RFREPC9hPihqYXZhLmxhbmcuU3RyaW5nIG5hbWUKLSAgICAgICAgICwKLSAgICAgIGphdmEubGFuZy5TdHJpbmcgcHVibGljSWQKLSAgICAgICAgICwKLSAgICAgIGphdmEubGFuZy5TdHJpbmcgc3lzdGVtSWQpPC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgPC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIHZvaWQ8L2NvZGU+PC90ZD48dGQgd2lkdGg9IiIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNtZXRob2Rfc3RhcnRFbGVtZW50Ij5zdGFydEVsZW1lbnQ8L2E+KGphdmEubGFuZy5TdHJpbmcgdXJpCi0gICAgICAgICAsCi0gICAgICBqYXZhLmxhbmcuU3RyaW5nIGVsZW1lbnROYW1lCi0gICAgICAgICAsCi0gICAgICBqYXZhLmxhbmcuU3RyaW5nIHF1YWxpZmllZE5hbWUKLSAgICAgICAgICwKLSAgICAgIG9yZy54bWwuc2F4LkF0dHJpYnV0ZXMgYXR0cmlidXRlcyk8L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICA8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgdm9pZDwvY29kZT48L3RkPjx0ZCB3aWR0aD0iIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI21ldGhvZF9zdGFydEVudGl0eSI+c3RhcnRFbnRpdHk8L2E+KGphdmEubGFuZy5TdHJpbmcgbmFtZSk8L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICA8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgdm9pZDwvY29kZT48L3RkPjx0ZCB3aWR0aD0iIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI21ldGhvZF93YXJuaW5nIj53YXJuaW5nPC9hPihvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbiBlKTwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48L3RhYmxlPjxocj48dGFibGUgY29scz0iMiIgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSI+PHRyIGNvbHNwYW49IjIiIHdpZHRoPSIxMDAlIiBiZ2NvbG9yPSIjQ0NDQ0ZGIiBhbGlnbj0ibGVmdCI+PHRkPjxoMj4KLSAgICAgICAgICAgICAgICAgIENvbnN0cnVjdG9yIERldGFpbAotICAgICAgICAgICAgICAgPC9oMj48L3RkPjwvdHI+PC90YWJsZT48aDI+PGEgbmFtZT0iY29uX1hTTFZlcnNpb25IYW5kbGVyIj5YU0xWZXJzaW9uSGFuZGxlcjwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyA8c3Ryb25nPlhTTFZlcnNpb25IYW5kbGVyPC9zdHJvbmc+KCk8L2NvZGU+PC9wPjxwPlRPRE86IEFkZCBKYXZhZG9jPC9wPjxocj48dGFibGUgY29scz0iMiIgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSI+PHRyIGNvbHNwYW49IjIiIHdpZHRoPSIxMDAlIiBiZ2NvbG9yPSIjQ0NDQ0ZGIiBhbGlnbj0ibGVmdCI+PHRkPjxoMj4KLSAgICAgICAgICAgICAgICAgIE1ldGhvZHMgRGV0YWlsCi0gICAgICAgICAgICAgICA8L2gyPjwvdGQ+PC90cj48L3RhYmxlPjxoMj48YSBuYW1lPSJtZXRob2RfY29tbWVudCI+Y29tbWVudDwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyB2b2lkIDxzdHJvbmc+Y29tbWVudDwvc3Ryb25nPihjaGFyW10gY2gKLSAgICAgICAgICwKLSAgICAgIGludCBzdGFydAotICAgICAgICAgLAotICAgICAgaW50IGxlbmd0aCk8L2NvZGU+PC9wPjxwPjwvcD48aDM+UGFyYW1ldGVyczwvaDM+PHA+PGNvZGU+Y2g8L2NvZGU+PC9wPjxwPjxjb2RlPnN0YXJ0PC9jb2RlPjwvcD48cD48Y29kZT5sZW5ndGg8L2NvZGU+PC9wPjxocj48aDI+PGEgbmFtZT0ibWV0aG9kX2VuZENEQVRBIj5lbmRDREFUQTwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyB2b2lkIDxzdHJvbmc+ZW5kQ0RBVEE8L3N0cm9uZz4oKTwvY29kZT48L3A+PHA+PC9wPjxocj48aDI+PGEgbmFtZT0ibWV0aG9kX2VuZERURCI+ZW5kRFREPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIHZvaWQgPHN0cm9uZz5lbmREVEQ8L3N0cm9uZz4oKTwvY29kZT48L3A+PHA+PC9wPjxocj48aDI+PGEgbmFtZT0ibWV0aG9kX2VuZEVudGl0eSI+ZW5kRW50aXR5PC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIHZvaWQgPHN0cm9uZz5lbmRFbnRpdHk8L3N0cm9uZz4oamF2YS5sYW5nLlN0cmluZyBuYW1lKTwvY29kZT48L3A+PHA+PC9wPjxoMz5QYXJhbWV0ZXJzPC9oMz48cD48Y29kZT5uYW1lPC9jb2RlPjwvcD48aHI+PGgyPjxhIG5hbWU9Im1ldGhvZF9lcnJvciI+ZXJyb3I8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgdm9pZCA8c3Ryb25nPmVycm9yPC9zdHJvbmc+KG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uIGUpPC9jb2RlPjwvcD48cD48L3A+PGgzPlBhcmFtZXRlcnM8L2gzPjxwPjxjb2RlPmU8L2NvZGU+PC9wPjxoMz5UaHJvd3M6PC9oMz48cD48Y29kZT5vcmcueG1sLnNheC5TQVhFeGNlcHRpb248L2NvZGU+PC9wPjxocj48aDI+PGEgbmFtZT0ibWV0aG9kX2ZhdGFsRXJyb3IiPmZhdGFsRXJyb3I8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgdm9pZCA8c3Ryb25nPmZhdGFsRXJyb3I8L3N0cm9uZz4ob3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb24gZSk8L2NvZGU+PC9wPjxwPjwvcD48aDM+UGFyYW1ldGVyczwvaDM+PHA+PGNvZGU+ZTwvY29kZT48L3A+PGgzPlRocm93czo8L2gzPjxwPjxjb2RlPm9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjwvY29kZT48L3A+PGhyPjxoMj48YSBuYW1lPSJtZXRob2RfZ2V0VmVyc2lvbkF0dHJpYnV0ZSI+Z2V0VmVyc2lvbkF0dHJpYnV0ZTwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIDxzdHJvbmc+Z2V0VmVyc2lvbkF0dHJpYnV0ZTwvc3Ryb25nPigpPC9jb2RlPjwvcD48cD5UT0RPOiBBZGQgSmF2YWRvYzwvcD48aDM+UmV0dXJuczwvaDM+PHA+PGNvZGU+amF2YS5sYW5nLlN0cmluZzwvY29kZT48L3A+PGhyPjxoMj48YSBuYW1lPSJtZXRob2RfcGFyc2VDb250ZW50cyI+cGFyc2VDb250ZW50czwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyBib29sZWFuIDxzdHJvbmc+cGFyc2VDb250ZW50czwvc3Ryb25nPihvcmcueG1sLnNheC5JbnB1dFNvdXJjZSBjb250ZW50cyk8L2NvZGU+PC9wPjxwPlRPRE86IEFkZCBKYXZhZG9jPC9wPjxoMz5QYXJhbWV0ZXJzPC9oMz48cD48Y29kZT5jb250ZW50czwvY29kZT48L3A+PGgzPlJldHVybnM8L2gzPjxwPjxjb2RlPmJvb2xlYW48L2NvZGU+PC9wPjxoMz5UaHJvd3M6PC9oMz48cD48Y29kZT5qYXZhLmlvLklPRXhjZXB0aW9uPC9jb2RlPjwvcD48cD48Y29kZT5qYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uPC9jb2RlPjwvcD48cD48Y29kZT5vcmcueG1sLnNheC5TQVhFeGNlcHRpb248L2NvZGU+PC9wPjxocj48aDI+PGEgbmFtZT0ibWV0aG9kX3Jlc29sdmVFbnRpdHkiPnJlc29sdmVFbnRpdHk8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2UgPHN0cm9uZz5yZXNvbHZlRW50aXR5PC9zdHJvbmc+KGphdmEubGFuZy5TdHJpbmcgcHVibGljSWQKLSAgICAgICAgICwKLSAgICAgIGphdmEubGFuZy5TdHJpbmcgc3lzdGVtSWQpPC9jb2RlPjwvcD48cD48L3A+PGgzPlBhcmFtZXRlcnM8L2gzPjxwPjxjb2RlPnB1YmxpY0lkPC9jb2RlPjwvcD48cD48Y29kZT5zeXN0ZW1JZDwvY29kZT48L3A+PGgzPlJldHVybnM8L2gzPjxwPjxjb2RlPm9yZy54bWwuc2F4LklucHV0U291cmNlPC9jb2RlPjwvcD48aDM+VGhyb3dzOjwvaDM+PHA+PGNvZGU+b3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uPC9jb2RlPjwvcD48aHI+PGgyPjxhIG5hbWU9Im1ldGhvZF9zdGFydENEQVRBIj5zdGFydENEQVRBPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIHZvaWQgPHN0cm9uZz5zdGFydENEQVRBPC9zdHJvbmc+KCk8L2NvZGU+PC9wPjxwPjwvcD48aHI+PGgyPjxhIG5hbWU9Im1ldGhvZF9zdGFydERURCI+c3RhcnREVEQ8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgdm9pZCA8c3Ryb25nPnN0YXJ0RFREPC9zdHJvbmc+KGphdmEubGFuZy5TdHJpbmcgbmFtZQotICAgICAgICAgLAotICAgICAgamF2YS5sYW5nLlN0cmluZyBwdWJsaWNJZAotICAgICAgICAgLAotICAgICAgamF2YS5sYW5nLlN0cmluZyBzeXN0ZW1JZCk8L2NvZGU+PC9wPjxwPjwvcD48aDM+UGFyYW1ldGVyczwvaDM+PHA+PGNvZGU+bmFtZTwvY29kZT48L3A+PHA+PGNvZGU+cHVibGljSWQ8L2NvZGU+PC9wPjxwPjxjb2RlPnN5c3RlbUlkPC9jb2RlPjwvcD48aDM+VGhyb3dzOjwvaDM+PHA+PGNvZGU+b3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uPC9jb2RlPjwvcD48aHI+PGgyPjxhIG5hbWU9Im1ldGhvZF9zdGFydEVsZW1lbnQiPnN0YXJ0RWxlbWVudDwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyB2b2lkIDxzdHJvbmc+c3RhcnRFbGVtZW50PC9zdHJvbmc+KGphdmEubGFuZy5TdHJpbmcgdXJpCi0gICAgICAgICAsCi0gICAgICBqYXZhLmxhbmcuU3RyaW5nIGVsZW1lbnROYW1lCi0gICAgICAgICAsCi0gICAgICBqYXZhLmxhbmcuU3RyaW5nIHF1YWxpZmllZE5hbWUKLSAgICAgICAgICwKLSAgICAgIG9yZy54bWwuc2F4LkF0dHJpYnV0ZXMgYXR0cmlidXRlcyk8L2NvZGU+PC9wPjxwPjwvcD48aDM+UGFyYW1ldGVyczwvaDM+PHA+PGNvZGU+dXJpPC9jb2RlPjwvcD48cD48Y29kZT5lbGVtZW50TmFtZTwvY29kZT48L3A+PHA+PGNvZGU+cXVhbGlmaWVkTmFtZTwvY29kZT48L3A+PHA+PGNvZGU+YXR0cmlidXRlczwvY29kZT48L3A+PGgzPlRocm93czo8L2gzPjxwPjxjb2RlPm9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjwvY29kZT48L3A+PGhyPjxoMj48YSBuYW1lPSJtZXRob2Rfc3RhcnRFbnRpdHkiPnN0YXJ0RW50aXR5PC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIHZvaWQgPHN0cm9uZz5zdGFydEVudGl0eTwvc3Ryb25nPihqYXZhLmxhbmcuU3RyaW5nIG5hbWUpPC9jb2RlPjwvcD48cD48L3A+PGgzPlBhcmFtZXRlcnM8L2gzPjxwPjxjb2RlPm5hbWU8L2NvZGU+PC9wPjxocj48aDI+PGEgbmFtZT0ibWV0aG9kX3dhcm5pbmciPndhcm5pbmc8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgdm9pZCA8c3Ryb25nPndhcm5pbmc8L3N0cm9uZz4ob3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb24gZSk8L2NvZGU+PC9wPjxwPjwvcD48aDM+UGFyYW1ldGVyczwvaDM+PHA+PGNvZGU+ZTwvY29kZT48L3A+PGgzPlRocm93czo8L2gzPjxwPjxjb2RlPm9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjwvY29kZT48L3A+PGhyPjwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uL2RvYy9odG1sL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4uZGVidWdnZXIuWGFsYW5EZWJ1Z2dlci5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uL2RvYy9odG1sL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4uZGVidWdnZXIuWGFsYW5EZWJ1Z2dlci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWIxNWI2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi9kb2MvaHRtbC9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLmRlYnVnZ2VyLlhhbGFuRGVidWdnZXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTxodG1sPjxib2R5PjxwPjxmb250IHNpemU9IisxIj48c3Ryb25nPlBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi5kZWJ1Z2dlcjwvc3Ryb25nPjwvZm9udD48L3A+PGhyPjxoMj48Zm9udCBzaXplPSItMSI+PHN0cm9uZz5vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLmRlYnVnZ2VyPC9zdHJvbmc+PC9mb250Pjxicj4KLSAgICAgICAgICAgICAgIENsYXNzIFhhbGFuRGVidWdnZXI8L2gyPjxicj48aHI+PHByZT5wdWJsaWMgY2xhc3MgPHN0cm9uZz5YYWxhbkRlYnVnZ2VyPC9zdHJvbmc+Ci1leHRlbmRzIEFic3RyYWN0RGVidWdnZXI8L3ByZT48aHI+PHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiPjx0ciBiZ2NvbG9yPSIjQ0NDQ0ZGIj48dGQgd2lkdGg9IjEwMCUiPjxoMj5Db25zdHJ1Y3RvciBTdW1tYXJ5PC9oMj48L3RkPjwvdHI+PHRyPjx0ZD48Y29kZT48c3Ryb25nPjxhIGhyZWY9IiNjb25fWGFsYW5EZWJ1Z2dlciI+WGFsYW5EZWJ1Z2dlcjwvYT48L3N0cm9uZz4oKTwvY29kZT48L3RkPjwvdHI+PC90YWJsZT48YnI+PHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiPjx0ciBjb2xzPSIyIiBiZ2NvbG9yPSIjQ0NDQ0ZGIj48dGQgY29sc3Bhbj0iMiIgd2lkdGg9IjEwMCUiPjxoMj5NZXRob2QgU3VtbWFyeTwvaDI+PC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIHZvaWQ8L2NvZGU+PC90ZD48dGQgd2lkdGg9IiIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNtZXRob2RfYWRkVHJhbnNmb3JtZXIiPmFkZFRyYW5zZm9ybWVyPC9hPihqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyKTwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyB2b2lkPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSIiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjbWV0aG9kX2RlYnVnZ2VyU3VzcGVuZGVkIj5kZWJ1Z2dlclN1c3BlbmRlZDwvYT4oQnJlYWtQb2ludCBicmVha3BvaW50KTwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyBWYXJpYWJsZTwvY29kZT48L3RkPjx0ZCB3aWR0aD0iIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI21ldGhvZF9nZXRWYXJpYWJsZSI+Z2V0VmFyaWFibGU8L2E+KGludCBpZCk8L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICBHZXRzIGEgdmFyaWFibGUgYnkgSUQ8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wYWNrYWdlLXByaXZhdGUgdm9pZDwvY29kZT48L3RkPjx0ZCB3aWR0aD0iIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI21ldGhvZF9zZXRDdXJyZW50VHJhY2VMaXN0ZW5lciI+c2V0Q3VycmVudFRyYWNlTGlzdGVuZXI8L2E+KG9yZy5lY2xpcHNlLndzdC54c2wueGFsYW4uZGVidWdnZXIuWGFsYW5UcmFjZUxpc3RlbmVyIGN1cnJlbnRUcmFjZUxpc3RlbmVyKTwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyB2b2lkPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSIiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjbWV0aG9kX3NldFRyYW5zZm9ybWVyRmFjdG9yeSI+c2V0VHJhbnNmb3JtZXJGYWN0b3J5PC9hPihqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeSBmYWN0b3J5KTwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48L3RhYmxlPjxocj48dGFibGUgY29scz0iMiIgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSI+PHRyIGNvbHNwYW49IjIiIHdpZHRoPSIxMDAlIiBiZ2NvbG9yPSIjQ0NDQ0ZGIiBhbGlnbj0ibGVmdCI+PHRkPjxoMj4KLSAgICAgICAgICAgICAgICAgIENvbnN0cnVjdG9yIERldGFpbAotICAgICAgICAgICAgICAgPC9oMj48L3RkPjwvdHI+PC90YWJsZT48aDI+PGEgbmFtZT0iY29uX1hhbGFuRGVidWdnZXIiPlhhbGFuRGVidWdnZXI8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgPHN0cm9uZz5YYWxhbkRlYnVnZ2VyPC9zdHJvbmc+KCk8L2NvZGU+PC9wPjxwPjwvcD48aHI+PHRhYmxlIGNvbHM9IjIiIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiPjx0ciBjb2xzcGFuPSIyIiB3aWR0aD0iMTAwJSIgYmdjb2xvcj0iI0NDQ0NGRiIgYWxpZ249ImxlZnQiPjx0ZD48aDI+Ci0gICAgICAgICAgICAgICAgICBNZXRob2RzIERldGFpbAotICAgICAgICAgICAgICAgPC9oMj48L3RkPjwvdHI+PC90YWJsZT48aDI+PGEgbmFtZT0ibWV0aG9kX2FkZFRyYW5zZm9ybWVyIj5hZGRUcmFuc2Zvcm1lcjwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyB2b2lkIDxzdHJvbmc+YWRkVHJhbnNmb3JtZXI8L3N0cm9uZz4oamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lcik8L2NvZGU+PC9wPjxwPjwvcD48aDM+UGFyYW1ldGVyczwvaDM+PHA+PGNvZGU+dHJhbnNmb3JtZXI8L2NvZGU+PC9wPjxocj48aDI+PGEgbmFtZT0ibWV0aG9kX2RlYnVnZ2VyU3VzcGVuZGVkIj5kZWJ1Z2dlclN1c3BlbmRlZDwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyB2b2lkIDxzdHJvbmc+ZGVidWdnZXJTdXNwZW5kZWQ8L3N0cm9uZz4oQnJlYWtQb2ludCBicmVha3BvaW50KTwvY29kZT48L3A+PHA+PC9wPjxoMz5QYXJhbWV0ZXJzPC9oMz48cD48Y29kZT5icmVha3BvaW50PC9jb2RlPjwvcD48aHI+PGgyPjxhIG5hbWU9Im1ldGhvZF9nZXRWYXJpYWJsZSI+Z2V0VmFyaWFibGU8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgVmFyaWFibGUgPHN0cm9uZz5nZXRWYXJpYWJsZTwvc3Ryb25nPihpbnQgaWQpPC9jb2RlPjwvcD48cD5HZXRzIGEgdmFyaWFibGUgYnkgSUQ8L3A+PGgzPlBhcmFtZXRlcnM8L2gzPjxwPjxjb2RlPmlkPC9jb2RlPjwvcD48aDM+UmV0dXJuczwvaDM+PHA+PGNvZGU+VmFyaWFibGU8L2NvZGU+PC9wPjxocj48aDI+PGEgbmFtZT0ibWV0aG9kX3NldEN1cnJlbnRUcmFjZUxpc3RlbmVyIj5zZXRDdXJyZW50VHJhY2VMaXN0ZW5lcjwvYT48L2gyPjxwPjxjb2RlPnBhY2thZ2UtcHJpdmF0ZSB2b2lkIDxzdHJvbmc+c2V0Q3VycmVudFRyYWNlTGlzdGVuZXI8L3N0cm9uZz4ob3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi5kZWJ1Z2dlci5YYWxhblRyYWNlTGlzdGVuZXIgY3VycmVudFRyYWNlTGlzdGVuZXIpPC9jb2RlPjwvcD48cD48L3A+PGgzPlBhcmFtZXRlcnM8L2gzPjxwPjxjb2RlPmN1cnJlbnRUcmFjZUxpc3RlbmVyPC9jb2RlPjwvcD48aHI+PGgyPjxhIG5hbWU9Im1ldGhvZF9zZXRUcmFuc2Zvcm1lckZhY3RvcnkiPnNldFRyYW5zZm9ybWVyRmFjdG9yeTwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyB2b2lkIDxzdHJvbmc+c2V0VHJhbnNmb3JtZXJGYWN0b3J5PC9zdHJvbmc+KGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5IGZhY3RvcnkpPC9jb2RlPjwvcD48cD48L3A+PGgzPlBhcmFtZXRlcnM8L2gzPjxwPjxjb2RlPmZhY3Rvcnk8L2NvZGU+PC9wPjxocj48L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi9kb2MvaHRtbC9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLmRlYnVnZ2VyLlhhbGFuUHJpbnRUcmFjZUxpc3RlbmVyLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuc2RrLmRvY3VtZW50YXRpb24vZG9jL2h0bWwvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi5kZWJ1Z2dlci5YYWxhblByaW50VHJhY2VMaXN0ZW5lci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTZmNDExLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi9kb2MvaHRtbC9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLmRlYnVnZ2VyLlhhbGFuUHJpbnRUcmFjZUxpc3RlbmVyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08aHRtbD48Ym9keT48cD48Zm9udCBzaXplPSIrMSI+PHN0cm9uZz5QYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wueGFsYW4uZGVidWdnZXI8L3N0cm9uZz48L2ZvbnQ+PC9wPjxocj48aDI+PGZvbnQgc2l6ZT0iLTEiPjxzdHJvbmc+b3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi5kZWJ1Z2dlcjwvc3Ryb25nPjwvZm9udD48YnI+Ci0gICAgICAgICAgICAgICBDbGFzcyBYYWxhblByaW50VHJhY2VMaXN0ZW5lcjwvaDI+PGJyPjxocj48cHJlPnB1YmxpYyBjbGFzcyA8c3Ryb25nPlhhbGFuUHJpbnRUcmFjZUxpc3RlbmVyPC9zdHJvbmc+Ci1leHRlbmRzIFByaW50VHJhY2VMaXN0ZW5lcjwvcHJlPjxocj48dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSI+PHRyIGJnY29sb3I9IiNDQ0NDRkYiPjx0ZCB3aWR0aD0iMTAwJSI+PGgyPkNvbnN0cnVjdG9yIFN1bW1hcnk8L2gyPjwvdGQ+PC90cj48dHI+PHRkPjxjb2RlPjxzdHJvbmc+PGEgaHJlZj0iI2Nvbl9YYWxhblByaW50VHJhY2VMaXN0ZW5lciI+WGFsYW5QcmludFRyYWNlTGlzdGVuZXI8L2E+PC9zdHJvbmc+KGphdmEuaW8uUHJpbnRXcml0ZXIgcHcpPC9jb2RlPjwvdGQ+PC90cj48L3RhYmxlPjxicj48dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSI+PHRyIGNvbHM9IjIiIGJnY29sb3I9IiNDQ0NDRkYiPjx0ZCBjb2xzcGFuPSIyIiB3aWR0aD0iMTAwJSI+PGgyPk1ldGhvZCBTdW1tYXJ5PC9oMj48L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgdm9pZDwvY29kZT48L3RkPjx0ZCB3aWR0aD0iIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI21ldGhvZF9fdHJhY2UiPl90cmFjZTwvYT4oVHJhY2VyRXZlbnQgZXYpPC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgPC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIHZvaWQ8L2NvZGU+PC90ZD48dGQgd2lkdGg9IiIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNtZXRob2Rfc2VsZWN0ZWQiPnNlbGVjdGVkPC9hPihTZWxlY3Rpb25FdmVudCBldik8L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICA8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgdm9pZDwvY29kZT48L3RkPjx0ZCB3aWR0aD0iIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI21ldGhvZF9zZWxlY3RFbmQiPnNlbGVjdEVuZDwvYT4oRW5kU2VsZWN0aW9uRXZlbnQgZXYpPC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgPC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIHZvaWQ8L2NvZGU+PC90ZD48dGQgd2lkdGg9IiIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNtZXRob2RfdHJhY2UiPnRyYWNlPC9hPihUcmFjZXJFdmVudCBldik8L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICA8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgdm9pZDwvY29kZT48L3RkPjx0ZCB3aWR0aD0iIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI21ldGhvZF90cmFjZUVuZCI+dHJhY2VFbmQ8L2E+KFRyYWNlckV2ZW50IGV2KTwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48L3RhYmxlPjxocj48dGFibGUgY29scz0iMiIgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSI+PHRyIGNvbHNwYW49IjIiIHdpZHRoPSIxMDAlIiBiZ2NvbG9yPSIjQ0NDQ0ZGIiBhbGlnbj0ibGVmdCI+PHRkPjxoMj4KLSAgICAgICAgICAgICAgICAgIENvbnN0cnVjdG9yIERldGFpbAotICAgICAgICAgICAgICAgPC9oMj48L3RkPjwvdHI+PC90YWJsZT48aDI+PGEgbmFtZT0iY29uX1hhbGFuUHJpbnRUcmFjZUxpc3RlbmVyIj5YYWxhblByaW50VHJhY2VMaXN0ZW5lcjwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyA8c3Ryb25nPlhhbGFuUHJpbnRUcmFjZUxpc3RlbmVyPC9zdHJvbmc+KGphdmEuaW8uUHJpbnRXcml0ZXIgcHcpPC9jb2RlPjwvcD48cD48L3A+PGhyPjx0YWJsZSBjb2xzPSIyIiB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIj48dHIgY29sc3Bhbj0iMiIgd2lkdGg9IjEwMCUiIGJnY29sb3I9IiNDQ0NDRkYiIGFsaWduPSJsZWZ0Ij48dGQ+PGgyPgotICAgICAgICAgICAgICAgICAgTWV0aG9kcyBEZXRhaWwKLSAgICAgICAgICAgICAgIDwvaDI+PC90ZD48L3RyPjwvdGFibGU+PGgyPjxhIG5hbWU9Im1ldGhvZF9fdHJhY2UiPl90cmFjZTwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyB2b2lkIDxzdHJvbmc+X3RyYWNlPC9zdHJvbmc+KFRyYWNlckV2ZW50IGV2KTwvY29kZT48L3A+PHA+PC9wPjxoMz5QYXJhbWV0ZXJzPC9oMz48cD48Y29kZT5ldjwvY29kZT48L3A+PGhyPjxoMj48YSBuYW1lPSJtZXRob2Rfc2VsZWN0ZWQiPnNlbGVjdGVkPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIHZvaWQgPHN0cm9uZz5zZWxlY3RlZDwvc3Ryb25nPihTZWxlY3Rpb25FdmVudCBldik8L2NvZGU+PC9wPjxwPjwvcD48aDM+UGFyYW1ldGVyczwvaDM+PHA+PGNvZGU+ZXY8L2NvZGU+PC9wPjxoMz5UaHJvd3M6PC9oMz48cD48Y29kZT5qYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uPC9jb2RlPjwvcD48aHI+PGgyPjxhIG5hbWU9Im1ldGhvZF9zZWxlY3RFbmQiPnNlbGVjdEVuZDwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyB2b2lkIDxzdHJvbmc+c2VsZWN0RW5kPC9zdHJvbmc+KEVuZFNlbGVjdGlvbkV2ZW50IGV2KTwvY29kZT48L3A+PHA+PC9wPjxoMz5QYXJhbWV0ZXJzPC9oMz48cD48Y29kZT5ldjwvY29kZT48L3A+PGgzPlRocm93czo8L2gzPjxwPjxjb2RlPmphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb248L2NvZGU+PC9wPjxocj48aDI+PGEgbmFtZT0ibWV0aG9kX3RyYWNlIj50cmFjZTwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyB2b2lkIDxzdHJvbmc+dHJhY2U8L3N0cm9uZz4oVHJhY2VyRXZlbnQgZXYpPC9jb2RlPjwvcD48cD48L3A+PGgzPlBhcmFtZXRlcnM8L2gzPjxwPjxjb2RlPmV2PC9jb2RlPjwvcD48aHI+PGgyPjxhIG5hbWU9Im1ldGhvZF90cmFjZUVuZCI+dHJhY2VFbmQ8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgdm9pZCA8c3Ryb25nPnRyYWNlRW5kPC9zdHJvbmc+KFRyYWNlckV2ZW50IGV2KTwvY29kZT48L3A+PHA+PC9wPjxoMz5QYXJhbWV0ZXJzPC9oMz48cD48Y29kZT5ldjwvY29kZT48L3A+PGhyPjwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uL2RvYy9odG1sL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4uZGVidWdnZXIuWGFsYW5Sb290U3R5bGVGcmFtZS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uL2RvYy9odG1sL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4uZGVidWdnZXIuWGFsYW5Sb290U3R5bGVGcmFtZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTM4MDBkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi9kb2MvaHRtbC9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLmRlYnVnZ2VyLlhhbGFuUm9vdFN0eWxlRnJhbWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTxodG1sPjxib2R5PjxwPjxmb250IHNpemU9IisxIj48c3Ryb25nPlBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi5kZWJ1Z2dlcjwvc3Ryb25nPjwvZm9udD48L3A+PGhyPjxoMj48Zm9udCBzaXplPSItMSI+PHN0cm9uZz5vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLmRlYnVnZ2VyPC9zdHJvbmc+PC9mb250Pjxicj4KLSAgICAgICAgICAgICAgIENsYXNzIFhhbGFuUm9vdFN0eWxlRnJhbWU8L2gyPjxicj48aHI+PHByZT5wdWJsaWMgY2xhc3MgPHN0cm9uZz5YYWxhblJvb3RTdHlsZUZyYW1lPC9zdHJvbmc+Ci1leHRlbmRzIG9yZy5lY2xpcHNlLndzdC54c2wueGFsYW4uZGVidWdnZXIuWGFsYW5TdHlsZUZyYW1lPC9wcmU+PGhyPjx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIj48dHIgYmdjb2xvcj0iI0NDQ0NGRiI+PHRkIHdpZHRoPSIxMDAlIj48aDI+Q29uc3RydWN0b3IgU3VtbWFyeTwvaDI+PC90ZD48L3RyPjx0cj48dGQ+PGNvZGU+PHN0cm9uZz48YSBocmVmPSIjY29uX1hhbGFuUm9vdFN0eWxlRnJhbWUiPlhhbGFuUm9vdFN0eWxlRnJhbWU8L2E+PC9zdHJvbmc+KFRyYWNlckV2ZW50IGV2ZW50KTwvY29kZT48L3RkPjwvdHI+PC90YWJsZT48YnI+PHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiPjx0ciBjb2xzPSIyIiBiZ2NvbG9yPSIjQ0NDQ0ZGIj48dGQgY29sc3Bhbj0iMiIgd2lkdGg9IjEwMCUiPjxoMj5NZXRob2QgU3VtbWFyeTwvaDI+PC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIHZvaWQ8L2NvZGU+PC90ZD48dGQgd2lkdGg9IiIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNtZXRob2RfYWRkVmFyaWFibGUiPmFkZFZhcmlhYmxlPC9hPihvcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLmRlYnVnZ2VyLlhhbGFuVmFyaWFibGUgeHZhcik8L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICA8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wcm90ZWN0ZWQgamF2YS51dGlsLkxpc3Q8L2NvZGU+PC90ZD48dGQgd2lkdGg9IiIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNtZXRob2RfZ2V0R2xvYmFscyI+Z2V0R2xvYmFsczwvYT4oKTwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyBWYXJpYWJsZTwvY29kZT48L3RkPjx0ZCB3aWR0aD0iIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI21ldGhvZF9nZXRWYXJpYWJsZSI+Z2V0VmFyaWFibGU8L2E+KGludCBpZCk8L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICBHZXRzIGEgVmFyaWFibGUgYnkgSUQ8L3RkPjwvdHI+PC90YWJsZT48aHI+PHRhYmxlIGNvbHM9IjIiIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiPjx0ciBjb2xzcGFuPSIyIiB3aWR0aD0iMTAwJSIgYmdjb2xvcj0iI0NDQ0NGRiIgYWxpZ249ImxlZnQiPjx0ZD48aDI+Ci0gICAgICAgICAgICAgICAgICBDb25zdHJ1Y3RvciBEZXRhaWwKLSAgICAgICAgICAgICAgIDwvaDI+PC90ZD48L3RyPjwvdGFibGU+PGgyPjxhIG5hbWU9ImNvbl9YYWxhblJvb3RTdHlsZUZyYW1lIj5YYWxhblJvb3RTdHlsZUZyYW1lPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIDxzdHJvbmc+WGFsYW5Sb290U3R5bGVGcmFtZTwvc3Ryb25nPihUcmFjZXJFdmVudCBldmVudCk8L2NvZGU+PC9wPjxwPjwvcD48aHI+PHRhYmxlIGNvbHM9IjIiIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiPjx0ciBjb2xzcGFuPSIyIiB3aWR0aD0iMTAwJSIgYmdjb2xvcj0iI0NDQ0NGRiIgYWxpZ249ImxlZnQiPjx0ZD48aDI+Ci0gICAgICAgICAgICAgICAgICBNZXRob2RzIERldGFpbAotICAgICAgICAgICAgICAgPC9oMj48L3RkPjwvdHI+PC90YWJsZT48aDI+PGEgbmFtZT0ibWV0aG9kX2FkZFZhcmlhYmxlIj5hZGRWYXJpYWJsZTwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyB2b2lkIDxzdHJvbmc+YWRkVmFyaWFibGU8L3N0cm9uZz4ob3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi5kZWJ1Z2dlci5YYWxhblZhcmlhYmxlIHh2YXIpPC9jb2RlPjwvcD48cD48L3A+PGgzPlBhcmFtZXRlcnM8L2gzPjxwPjxjb2RlPnh2YXI8L2NvZGU+PC9wPjxocj48aDI+PGEgbmFtZT0ibWV0aG9kX2dldEdsb2JhbHMiPmdldEdsb2JhbHM8L2E+PC9oMj48cD48Y29kZT5wcm90ZWN0ZWQgamF2YS51dGlsLkxpc3QgPHN0cm9uZz5nZXRHbG9iYWxzPC9zdHJvbmc+KCk8L2NvZGU+PC9wPjxwPjwvcD48aDM+UmV0dXJuczwvaDM+PHA+PGNvZGU+amF2YS51dGlsLkxpc3Q8L2NvZGU+PC9wPjxocj48aDI+PGEgbmFtZT0ibWV0aG9kX2dldFZhcmlhYmxlIj5nZXRWYXJpYWJsZTwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyBWYXJpYWJsZSA8c3Ryb25nPmdldFZhcmlhYmxlPC9zdHJvbmc+KGludCBpZCk8L2NvZGU+PC9wPjxwPkdldHMgYSBWYXJpYWJsZSBieSBJRDwvcD48aDM+UGFyYW1ldGVyczwvaDM+PHA+PGNvZGU+aWQ8L2NvZGU+PC9wPjxoMz5SZXR1cm5zPC9oMz48cD48Y29kZT5WYXJpYWJsZTwvY29kZT48L3A+PGhyPjwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uL2RvYy9odG1sL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4uZGVidWdnZXIuWGFsYW5TdHlsZUZyYW1lLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuc2RrLmRvY3VtZW50YXRpb24vZG9jL2h0bWwvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi5kZWJ1Z2dlci5YYWxhblN0eWxlRnJhbWUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc1NmQzZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuc2RrLmRvY3VtZW50YXRpb24vZG9jL2h0bWwvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi5kZWJ1Z2dlci5YYWxhblN0eWxlRnJhbWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTxodG1sPjxib2R5PjxwPjxmb250IHNpemU9IisxIj48c3Ryb25nPlBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi5kZWJ1Z2dlcjwvc3Ryb25nPjwvZm9udD48L3A+PGhyPjxoMj48Zm9udCBzaXplPSItMSI+PHN0cm9uZz5vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLmRlYnVnZ2VyPC9zdHJvbmc+PC9mb250Pjxicj4KLSAgICAgICAgICAgICAgIENsYXNzIFhhbGFuU3R5bGVGcmFtZTwvaDI+PGJyPjxocj48cHJlPnB1YmxpYyBjbGFzcyA8c3Ryb25nPlhhbGFuU3R5bGVGcmFtZTwvc3Ryb25nPgotZXh0ZW5kcyBTdHlsZUZyYW1lPC9wcmU+PGhyPjx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIj48dHIgY29scz0iMiIgYmdjb2xvcj0iI0NDQ0NGRiI+PHRkIGNvbHNwYW49IjIiIHdpZHRoPSIxMDAlIj48aDI+RmllbGQgU3VtbWFyeTwvaDI+PC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cGFja2FnZS1wcml2YXRlIFRyYWNlckV2ZW50PC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSI4MCUiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjZmllbGRfZXZlbnQiPmV2ZW50PC9hPjwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48L3RhYmxlPjxicj48dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSI+PHRyIGJnY29sb3I9IiNDQ0NDRkYiPjx0ZCB3aWR0aD0iMTAwJSI+PGgyPkNvbnN0cnVjdG9yIFN1bW1hcnk8L2gyPjwvdGQ+PC90cj48dHI+PHRkPjxjb2RlPjxzdHJvbmc+PGEgaHJlZj0iI2Nvbl9YYWxhblN0eWxlRnJhbWUiPlhhbGFuU3R5bGVGcmFtZTwvYT48L3N0cm9uZz4oU3R5bGVGcmFtZSBwYXJlbnQKLSAgICAgICAgICwKLSAgICAgIFRyYWNlckV2ZW50IGV2ZW50KTwvY29kZT48L3RkPjwvdHI+PC90YWJsZT48YnI+PHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiPjx0ciBjb2xzPSIyIiBiZ2NvbG9yPSIjQ0NDQ0ZGIj48dGQgY29sc3Bhbj0iMiIgd2lkdGg9IjEwMCUiPjxoMj5NZXRob2QgU3VtbWFyeTwvaDI+PC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIGludDwvY29kZT48L3RkPjx0ZCB3aWR0aD0iIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI21ldGhvZF9nZXRDdXJyZW50TGluZSI+Z2V0Q3VycmVudExpbmU8L2E+KCk8L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICA8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgamF2YS5sYW5nLlN0cmluZzwvY29kZT48L3RkPjx0ZCB3aWR0aD0iIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI21ldGhvZF9nZXRGaWxlbmFtZSI+Z2V0RmlsZW5hbWU8L2E+KCk8L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICA8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wcm90ZWN0ZWQgamF2YS51dGlsLkxpc3Q8L2NvZGU+PC90ZD48dGQgd2lkdGg9IiIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNtZXRob2RfZ2V0R2xvYmFscyI+Z2V0R2xvYmFsczwvYT4oKTwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSIiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjbWV0aG9kX2dldE5hbWUiPmdldE5hbWU8L2E+KCk8L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICA8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgaW50PC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSIiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjbWV0aG9kX2dldFNvdXJjZUN1cnJlbnRMaW5lIj5nZXRTb3VyY2VDdXJyZW50TGluZTwvYT4oKTwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSIiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjbWV0aG9kX2dldFNvdXJjZUZpbGVuYW1lIj5nZXRTb3VyY2VGaWxlbmFtZTwvYT4oKTwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyBqYXZhLnV0aWwuTGlzdDwvY29kZT48L3RkPjx0ZCB3aWR0aD0iIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI21ldGhvZF9nZXRWYXJpYWJsZVN0YWNrIj5nZXRWYXJpYWJsZVN0YWNrPC9hPigpPC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgPC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIFRyYWNlckV2ZW50PC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSIiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjbWV0aG9kX3BlZWtFbGVtZW50Ij5wZWVrRWxlbWVudDwvYT4oKTwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyBUcmFjZXJFdmVudDwvY29kZT48L3RkPjx0ZCB3aWR0aD0iIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI21ldGhvZF9wb3BFbGVtZW50Ij5wb3BFbGVtZW50PC9hPigpPC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgPC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIHZvaWQ8L2NvZGU+PC90ZD48dGQgd2lkdGg9IiIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNtZXRob2RfcHVzaEVsZW1lbnQiPnB1c2hFbGVtZW50PC9hPihUcmFjZXJFdmVudCBlKTwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48L3RhYmxlPjxocj48dGFibGUgY29scz0iMiIgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSI+PHRyIGNvbHNwYW49IjIiIHdpZHRoPSIxMDAlIiBiZ2NvbG9yPSIjQ0NDQ0ZGIiBhbGlnbj0ibGVmdCI+PHRkPjxoMj4KLSAgICAgICAgICAgICAgICAgIEZpZWxkIERldGFpbAotICAgICAgICAgICAgICAgPC9oMj48L3RkPjwvdHI+PC90YWJsZT48aDI+PGEgbmFtZT0iZmllbGRfZXZlbnQiPmV2ZW50PC9hPjwvaDI+PHA+PGNvZGU+cGFja2FnZS1wcml2YXRlIFRyYWNlckV2ZW50IDxzdHJvbmc+ZXZlbnQ8L3N0cm9uZz48L2NvZGU+PC9wPjxocj48dGFibGUgY29scz0iMiIgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSI+PHRyIGNvbHNwYW49IjIiIHdpZHRoPSIxMDAlIiBiZ2NvbG9yPSIjQ0NDQ0ZGIiBhbGlnbj0ibGVmdCI+PHRkPjxoMj4KLSAgICAgICAgICAgICAgICAgIENvbnN0cnVjdG9yIERldGFpbAotICAgICAgICAgICAgICAgPC9oMj48L3RkPjwvdHI+PC90YWJsZT48aDI+PGEgbmFtZT0iY29uX1hhbGFuU3R5bGVGcmFtZSI+WGFsYW5TdHlsZUZyYW1lPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIDxzdHJvbmc+WGFsYW5TdHlsZUZyYW1lPC9zdHJvbmc+KFN0eWxlRnJhbWUgcGFyZW50Ci0gICAgICAgICAsCi0gICAgICBUcmFjZXJFdmVudCBldmVudCk8L2NvZGU+PC9wPjxwPjwvcD48aHI+PHRhYmxlIGNvbHM9IjIiIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiPjx0ciBjb2xzcGFuPSIyIiB3aWR0aD0iMTAwJSIgYmdjb2xvcj0iI0NDQ0NGRiIgYWxpZ249ImxlZnQiPjx0ZD48aDI+Ci0gICAgICAgICAgICAgICAgICBNZXRob2RzIERldGFpbAotICAgICAgICAgICAgICAgPC9oMj48L3RkPjwvdHI+PC90YWJsZT48aDI+PGEgbmFtZT0ibWV0aG9kX2dldEN1cnJlbnRMaW5lIj5nZXRDdXJyZW50TGluZTwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyBpbnQgPHN0cm9uZz5nZXRDdXJyZW50TGluZTwvc3Ryb25nPigpPC9jb2RlPjwvcD48cD48L3A+PGgzPlJldHVybnM8L2gzPjxwPjxjb2RlPmludDwvY29kZT48L3A+PGhyPjxoMj48YSBuYW1lPSJtZXRob2RfZ2V0RmlsZW5hbWUiPmdldEZpbGVuYW1lPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIGphdmEubGFuZy5TdHJpbmcgPHN0cm9uZz5nZXRGaWxlbmFtZTwvc3Ryb25nPigpPC9jb2RlPjwvcD48cD48L3A+PGgzPlJldHVybnM8L2gzPjxwPjxjb2RlPmphdmEubGFuZy5TdHJpbmc8L2NvZGU+PC9wPjxocj48aDI+PGEgbmFtZT0ibWV0aG9kX2dldEdsb2JhbHMiPmdldEdsb2JhbHM8L2E+PC9oMj48cD48Y29kZT5wcm90ZWN0ZWQgamF2YS51dGlsLkxpc3QgPHN0cm9uZz5nZXRHbG9iYWxzPC9zdHJvbmc+KCk8L2NvZGU+PC9wPjxwPjwvcD48aDM+UmV0dXJuczwvaDM+PHA+PGNvZGU+amF2YS51dGlsLkxpc3Q8L2NvZGU+PC9wPjxocj48aDI+PGEgbmFtZT0ibWV0aG9kX2dldE5hbWUiPmdldE5hbWU8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgamF2YS5sYW5nLlN0cmluZyA8c3Ryb25nPmdldE5hbWU8L3N0cm9uZz4oKTwvY29kZT48L3A+PHA+PC9wPjxoMz5SZXR1cm5zPC9oMz48cD48Y29kZT5qYXZhLmxhbmcuU3RyaW5nPC9jb2RlPjwvcD48aHI+PGgyPjxhIG5hbWU9Im1ldGhvZF9nZXRTb3VyY2VDdXJyZW50TGluZSI+Z2V0U291cmNlQ3VycmVudExpbmU8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgaW50IDxzdHJvbmc+Z2V0U291cmNlQ3VycmVudExpbmU8L3N0cm9uZz4oKTwvY29kZT48L3A+PHA+PC9wPjxoMz5SZXR1cm5zPC9oMz48cD48Y29kZT5pbnQ8L2NvZGU+PC9wPjxocj48aDI+PGEgbmFtZT0ibWV0aG9kX2dldFNvdXJjZUZpbGVuYW1lIj5nZXRTb3VyY2VGaWxlbmFtZTwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIDxzdHJvbmc+Z2V0U291cmNlRmlsZW5hbWU8L3N0cm9uZz4oKTwvY29kZT48L3A+PHA+PC9wPjxoMz5SZXR1cm5zPC9oMz48cD48Y29kZT5qYXZhLmxhbmcuU3RyaW5nPC9jb2RlPjwvcD48aHI+PGgyPjxhIG5hbWU9Im1ldGhvZF9nZXRWYXJpYWJsZVN0YWNrIj5nZXRWYXJpYWJsZVN0YWNrPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIGphdmEudXRpbC5MaXN0IDxzdHJvbmc+Z2V0VmFyaWFibGVTdGFjazwvc3Ryb25nPigpPC9jb2RlPjwvcD48cD48L3A+PGgzPlJldHVybnM8L2gzPjxwPjxjb2RlPmphdmEudXRpbC5MaXN0PC9jb2RlPjwvcD48aHI+PGgyPjxhIG5hbWU9Im1ldGhvZF9wZWVrRWxlbWVudCI+cGVla0VsZW1lbnQ8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgVHJhY2VyRXZlbnQgPHN0cm9uZz5wZWVrRWxlbWVudDwvc3Ryb25nPigpPC9jb2RlPjwvcD48cD48L3A+PGgzPlJldHVybnM8L2gzPjxwPjxjb2RlPlRyYWNlckV2ZW50PC9jb2RlPjwvcD48aHI+PGgyPjxhIG5hbWU9Im1ldGhvZF9wb3BFbGVtZW50Ij5wb3BFbGVtZW50PC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIFRyYWNlckV2ZW50IDxzdHJvbmc+cG9wRWxlbWVudDwvc3Ryb25nPigpPC9jb2RlPjwvcD48cD48L3A+PGgzPlJldHVybnM8L2gzPjxwPjxjb2RlPlRyYWNlckV2ZW50PC9jb2RlPjwvcD48aHI+PGgyPjxhIG5hbWU9Im1ldGhvZF9wdXNoRWxlbWVudCI+cHVzaEVsZW1lbnQ8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgdm9pZCA8c3Ryb25nPnB1c2hFbGVtZW50PC9zdHJvbmc+KFRyYWNlckV2ZW50IGUpPC9jb2RlPjwvcD48cD48L3A+PGgzPlBhcmFtZXRlcnM8L2gzPjxwPjxjb2RlPmU8L2NvZGU+PC9wPjxocj48L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi9kb2MvaHRtbC9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLmRlYnVnZ2VyLlhhbGFuVHJhY2VMaXN0ZW5lci5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uL2RvYy9odG1sL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4uZGVidWdnZXIuWGFsYW5UcmFjZUxpc3RlbmVyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNWJiMjYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uL2RvYy9odG1sL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4uZGVidWdnZXIuWGFsYW5UcmFjZUxpc3RlbmVyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08aHRtbD48Ym9keT48cD48Zm9udCBzaXplPSIrMSI+PHN0cm9uZz5QYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wueGFsYW4uZGVidWdnZXI8L3N0cm9uZz48L2ZvbnQ+PC9wPjxocj48aDI+PGZvbnQgc2l6ZT0iLTEiPjxzdHJvbmc+b3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi5kZWJ1Z2dlcjwvc3Ryb25nPjwvZm9udD48YnI+Ci0gICAgICAgICAgICAgICBDbGFzcyBYYWxhblRyYWNlTGlzdGVuZXI8L2gyPjxicj48aHI+PHByZT5wdWJsaWMgY2xhc3MgPHN0cm9uZz5YYWxhblRyYWNlTGlzdGVuZXI8L3N0cm9uZz4KLWV4dGVuZHMgamF2YS5sYW5nLk9iamVjdDwvcHJlPjxocj48dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSI+PHRyIGJnY29sb3I9IiNDQ0NDRkYiPjx0ZCB3aWR0aD0iMTAwJSI+PGgyPkNvbnN0cnVjdG9yIFN1bW1hcnk8L2gyPjwvdGQ+PC90cj48dHI+PHRkPjxjb2RlPjxzdHJvbmc+PGEgaHJlZj0iI2Nvbl9YYWxhblRyYWNlTGlzdGVuZXIiPlhhbGFuVHJhY2VMaXN0ZW5lcjwvYT48L3N0cm9uZz4ob3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi5kZWJ1Z2dlci5YYWxhbkRlYnVnZ2VyIGRlYnVnZ2VyKTwvY29kZT48L3RkPjwvdHI+PC90YWJsZT48YnI+PHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiPjx0ciBjb2xzPSIyIiBiZ2NvbG9yPSIjQ0NDQ0ZGIj48dGQgY29sc3Bhbj0iMiIgd2lkdGg9IjEwMCUiPjxoMj5NZXRob2QgU3VtbWFyeTwvaDI+PC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIHZvaWQ8L2NvZGU+PC90ZD48dGQgd2lkdGg9IiIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNtZXRob2RfZXh0ZW5zaW9uIj5leHRlbnNpb248L2E+KEV4dGVuc2lvbkV2ZW50IGVlKTwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyB2b2lkPC9jb2RlPjwvdGQ+PHRkIHdpZHRoPSIiIGFsaWduPSJsZWZ0Ij48Y29kZT48YSBocmVmPSIjbWV0aG9kX2V4dGVuc2lvbkVuZCI+ZXh0ZW5zaW9uRW5kPC9hPihFeHRlbnNpb25FdmVudCBlZSk8L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICA8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgdm9pZDwvY29kZT48L3RkPjx0ZCB3aWR0aD0iIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI21ldGhvZF9nZW5lcmF0ZWQiPmdlbmVyYXRlZDwvYT4oR2VuZXJhdGVFdmVudCBldik8L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICA8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgVmFyaWFibGU8L2NvZGU+PC90ZD48dGQgd2lkdGg9IiIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNtZXRob2RfZ2V0VmFyaWFibGUiPmdldFZhcmlhYmxlPC9hPihpbnQgaWQpPC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgPC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIHZvaWQ8L2NvZGU+PC90ZD48dGQgd2lkdGg9IiIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNtZXRob2Rfc2VsZWN0ZWQiPnNlbGVjdGVkPC9hPihTZWxlY3Rpb25FdmVudCBldik8L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICA8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgdm9pZDwvY29kZT48L3RkPjx0ZCB3aWR0aD0iIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI21ldGhvZF9zZWxlY3RFbmQiPnNlbGVjdEVuZDwvYT4oRW5kU2VsZWN0aW9uRXZlbnQgZXYpPC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgPC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIHZvaWQ8L2NvZGU+PC90ZD48dGQgd2lkdGg9IiIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNtZXRob2RfdHJhY2UiPnRyYWNlPC9hPihUcmFjZXJFdmVudCBldik8L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICA8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgdm9pZDwvY29kZT48L3RkPjx0ZCB3aWR0aD0iIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI21ldGhvZF90cmFjZUVuZCI+dHJhY2VFbmQ8L2E+KFRyYWNlckV2ZW50IGV2KTwvY29kZT48YnI+Ci0gICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgICAgIDwvdGQ+PC90cj48L3RhYmxlPjxocj48dGFibGUgY29scz0iMiIgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSI+PHRyIGNvbHNwYW49IjIiIHdpZHRoPSIxMDAlIiBiZ2NvbG9yPSIjQ0NDQ0ZGIiBhbGlnbj0ibGVmdCI+PHRkPjxoMj4KLSAgICAgICAgICAgICAgICAgIENvbnN0cnVjdG9yIERldGFpbAotICAgICAgICAgICAgICAgPC9oMj48L3RkPjwvdHI+PC90YWJsZT48aDI+PGEgbmFtZT0iY29uX1hhbGFuVHJhY2VMaXN0ZW5lciI+WGFsYW5UcmFjZUxpc3RlbmVyPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIDxzdHJvbmc+WGFsYW5UcmFjZUxpc3RlbmVyPC9zdHJvbmc+KG9yZy5lY2xpcHNlLndzdC54c2wueGFsYW4uZGVidWdnZXIuWGFsYW5EZWJ1Z2dlciBkZWJ1Z2dlcik8L2NvZGU+PC9wPjxwPjwvcD48aHI+PHRhYmxlIGNvbHM9IjIiIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiPjx0ciBjb2xzcGFuPSIyIiB3aWR0aD0iMTAwJSIgYmdjb2xvcj0iI0NDQ0NGRiIgYWxpZ249ImxlZnQiPjx0ZD48aDI+Ci0gICAgICAgICAgICAgICAgICBNZXRob2RzIERldGFpbAotICAgICAgICAgICAgICAgPC9oMj48L3RkPjwvdHI+PC90YWJsZT48aDI+PGEgbmFtZT0ibWV0aG9kX2V4dGVuc2lvbiI+ZXh0ZW5zaW9uPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIHZvaWQgPHN0cm9uZz5leHRlbnNpb248L3N0cm9uZz4oRXh0ZW5zaW9uRXZlbnQgZWUpPC9jb2RlPjwvcD48cD48L3A+PGgzPlBhcmFtZXRlcnM8L2gzPjxwPjxjb2RlPmVlPC9jb2RlPjwvcD48aHI+PGgyPjxhIG5hbWU9Im1ldGhvZF9leHRlbnNpb25FbmQiPmV4dGVuc2lvbkVuZDwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyB2b2lkIDxzdHJvbmc+ZXh0ZW5zaW9uRW5kPC9zdHJvbmc+KEV4dGVuc2lvbkV2ZW50IGVlKTwvY29kZT48L3A+PHA+PC9wPjxoMz5QYXJhbWV0ZXJzPC9oMz48cD48Y29kZT5lZTwvY29kZT48L3A+PGhyPjxoMj48YSBuYW1lPSJtZXRob2RfZ2VuZXJhdGVkIj5nZW5lcmF0ZWQ8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgdm9pZCA8c3Ryb25nPmdlbmVyYXRlZDwvc3Ryb25nPihHZW5lcmF0ZUV2ZW50IGV2KTwvY29kZT48L3A+PHA+PC9wPjxoMz5QYXJhbWV0ZXJzPC9oMz48cD48Y29kZT5ldjwvY29kZT48L3A+PGhyPjxoMj48YSBuYW1lPSJtZXRob2RfZ2V0VmFyaWFibGUiPmdldFZhcmlhYmxlPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIFZhcmlhYmxlIDxzdHJvbmc+Z2V0VmFyaWFibGU8L3N0cm9uZz4oaW50IGlkKTwvY29kZT48L3A+PHA+PC9wPjxoMz5QYXJhbWV0ZXJzPC9oMz48cD48Y29kZT5pZDwvY29kZT48L3A+PGgzPlJldHVybnM8L2gzPjxwPjxjb2RlPlZhcmlhYmxlPC9jb2RlPjwvcD48aHI+PGgyPjxhIG5hbWU9Im1ldGhvZF9zZWxlY3RlZCI+c2VsZWN0ZWQ8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgdm9pZCA8c3Ryb25nPnNlbGVjdGVkPC9zdHJvbmc+KFNlbGVjdGlvbkV2ZW50IGV2KTwvY29kZT48L3A+PHA+PC9wPjxoMz5QYXJhbWV0ZXJzPC9oMz48cD48Y29kZT5ldjwvY29kZT48L3A+PGgzPlRocm93czo8L2gzPjxwPjxjb2RlPmphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb248L2NvZGU+PC9wPjxocj48aDI+PGEgbmFtZT0ibWV0aG9kX3NlbGVjdEVuZCI+c2VsZWN0RW5kPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIHZvaWQgPHN0cm9uZz5zZWxlY3RFbmQ8L3N0cm9uZz4oRW5kU2VsZWN0aW9uRXZlbnQgZXYpPC9jb2RlPjwvcD48cD48L3A+PGgzPlBhcmFtZXRlcnM8L2gzPjxwPjxjb2RlPmV2PC9jb2RlPjwvcD48aDM+VGhyb3dzOjwvaDM+PHA+PGNvZGU+amF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjwvY29kZT48L3A+PGhyPjxoMj48YSBuYW1lPSJtZXRob2RfdHJhY2UiPnRyYWNlPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIHZvaWQgPHN0cm9uZz50cmFjZTwvc3Ryb25nPihUcmFjZXJFdmVudCBldik8L2NvZGU+PC9wPjxwPjwvcD48aDM+UGFyYW1ldGVyczwvaDM+PHA+PGNvZGU+ZXY8L2NvZGU+PC9wPjxocj48aDI+PGEgbmFtZT0ibWV0aG9kX3RyYWNlRW5kIj50cmFjZUVuZDwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyB2b2lkIDxzdHJvbmc+dHJhY2VFbmQ8L3N0cm9uZz4oVHJhY2VyRXZlbnQgZXYpPC9jb2RlPjwvcD48cD48L3A+PGgzPlBhcmFtZXRlcnM8L2gzPjxwPjxjb2RlPmV2PC9jb2RlPjwvcD48aHI+PC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuc2RrLmRvY3VtZW50YXRpb24vZG9jL2h0bWwvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi5kZWJ1Z2dlci5YYWxhblZhcmlhYmxlLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuc2RrLmRvY3VtZW50YXRpb24vZG9jL2h0bWwvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi5kZWJ1Z2dlci5YYWxhblZhcmlhYmxlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NmE4MTguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uL2RvYy9odG1sL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4uZGVidWdnZXIuWGFsYW5WYXJpYWJsZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPGh0bWw+PGJvZHk+PHA+PGZvbnQgc2l6ZT0iKzEiPjxzdHJvbmc+UGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLmRlYnVnZ2VyPC9zdHJvbmc+PC9mb250PjwvcD48aHI+PGgyPjxmb250IHNpemU9Ii0xIj48c3Ryb25nPm9yZy5lY2xpcHNlLndzdC54c2wueGFsYW4uZGVidWdnZXI8L3N0cm9uZz48L2ZvbnQ+PGJyPgotICAgICAgICAgICAgICAgQ2xhc3MgWGFsYW5WYXJpYWJsZTwvaDI+PGJyPjxocj48cHJlPnB1YmxpYyBjbGFzcyA8c3Ryb25nPlhhbGFuVmFyaWFibGU8L3N0cm9uZz4KLWV4dGVuZHMgVmFyaWFibGU8L3ByZT48aHI+PHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiPjx0ciBiZ2NvbG9yPSIjQ0NDQ0ZGIj48dGQgd2lkdGg9IjEwMCUiPjxoMj5Db25zdHJ1Y3RvciBTdW1tYXJ5PC9oMj48L3RkPjwvdHI+PHRyPjx0ZD48Y29kZT48c3Ryb25nPjxhIGhyZWY9IiNjb25fWGFsYW5WYXJpYWJsZSI+WGFsYW5WYXJpYWJsZTwvYT48L3N0cm9uZz4ob3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi5kZWJ1Z2dlci5YYWxhblN0eWxlRnJhbWUgeGFsYW5TdHlsZUZyYW1lCi0gICAgICAgICAsCi0gICAgICBWYXJpYWJsZVN0YWNrIHZhclN0YWNrCi0gICAgICAgICAsCi0gICAgICBqYXZhLmxhbmcuU3RyaW5nIHNjb3BlCi0gICAgICAgICAsCi0gICAgICBpbnQgc2xvdE51bWJlcgotICAgICAgICAgLAotICAgICAgRWxlbVZhcmlhYmxlIGVsZW1WYXJpYWJsZSk8L2NvZGU+PC90ZD48L3RyPjwvdGFibGU+PGJyPjx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIj48dHIgY29scz0iMiIgYmdjb2xvcj0iI0NDQ0NGRiI+PHRkIGNvbHNwYW49IjIiIHdpZHRoPSIxMDAlIj48aDI+TWV0aG9kIFN1bW1hcnk8L2gyPjwvdGQ+PC90cj48dHIgdmFsaWduPSJ0b3AiPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPjxjb2RlPnB1YmxpYyBpbnQ8L2NvZGU+PC90ZD48dGQgd2lkdGg9IiIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNtZXRob2RfY29tcGFyZVRvIj5jb21wYXJlVG88L2E+KGphdmEubGFuZy5PYmplY3QgYXJnMCk8L2NvZGU+PGJyPgotICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICAgICA8L3RkPjwvdHI+PHRyIHZhbGlnbj0idG9wIj48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij48Y29kZT5wdWJsaWMgamF2YS5sYW5nLlN0cmluZzwvY29kZT48L3RkPjx0ZCB3aWR0aD0iIiBhbGlnbj0ibGVmdCI+PGNvZGU+PGEgaHJlZj0iI21ldGhvZF9nZXRUeXBlIj5nZXRUeXBlPC9hPigpPC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgPC90ZD48L3RyPjx0ciB2YWxpZ249InRvcCI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+PGNvZGU+cHVibGljIGphdmEubGFuZy5TdHJpbmc8L2NvZGU+PC90ZD48dGQgd2lkdGg9IiIgYWxpZ249ImxlZnQiPjxjb2RlPjxhIGhyZWY9IiNtZXRob2RfZ2V0VmFsdWUiPmdldFZhbHVlPC9hPigpPC9jb2RlPjxicj4KLSAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICAgICAgICAgICAgICAgPC90ZD48L3RyPjwvdGFibGU+PGhyPjx0YWJsZSBjb2xzPSIyIiB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIj48dHIgY29sc3Bhbj0iMiIgd2lkdGg9IjEwMCUiIGJnY29sb3I9IiNDQ0NDRkYiIGFsaWduPSJsZWZ0Ij48dGQ+PGgyPgotICAgICAgICAgICAgICAgICAgQ29uc3RydWN0b3IgRGV0YWlsCi0gICAgICAgICAgICAgICA8L2gyPjwvdGQ+PC90cj48L3RhYmxlPjxoMj48YSBuYW1lPSJjb25fWGFsYW5WYXJpYWJsZSI+WGFsYW5WYXJpYWJsZTwvYT48L2gyPjxwPjxjb2RlPnB1YmxpYyA8c3Ryb25nPlhhbGFuVmFyaWFibGU8L3N0cm9uZz4ob3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi5kZWJ1Z2dlci5YYWxhblN0eWxlRnJhbWUgeGFsYW5TdHlsZUZyYW1lCi0gICAgICAgICAsCi0gICAgICBWYXJpYWJsZVN0YWNrIHZhclN0YWNrCi0gICAgICAgICAsCi0gICAgICBqYXZhLmxhbmcuU3RyaW5nIHNjb3BlCi0gICAgICAgICAsCi0gICAgICBpbnQgc2xvdE51bWJlcgotICAgICAgICAgLAotICAgICAgRWxlbVZhcmlhYmxlIGVsZW1WYXJpYWJsZSk8L2NvZGU+PC9wPjxwPjwvcD48aHI+PHRhYmxlIGNvbHM9IjIiIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiPjx0ciBjb2xzcGFuPSIyIiB3aWR0aD0iMTAwJSIgYmdjb2xvcj0iI0NDQ0NGRiIgYWxpZ249ImxlZnQiPjx0ZD48aDI+Ci0gICAgICAgICAgICAgICAgICBNZXRob2RzIERldGFpbAotICAgICAgICAgICAgICAgPC9oMj48L3RkPjwvdHI+PC90YWJsZT48aDI+PGEgbmFtZT0ibWV0aG9kX2NvbXBhcmVUbyI+Y29tcGFyZVRvPC9hPjwvaDI+PHA+PGNvZGU+cHVibGljIGludCA8c3Ryb25nPmNvbXBhcmVUbzwvc3Ryb25nPihqYXZhLmxhbmcuT2JqZWN0IGFyZzApPC9jb2RlPjwvcD48cD48L3A+PGgzPlBhcmFtZXRlcnM8L2gzPjxwPjxjb2RlPmFyZzA8L2NvZGU+PC9wPjxoMz5SZXR1cm5zPC9oMz48cD48Y29kZT5pbnQ8L2NvZGU+PC9wPjxocj48aDI+PGEgbmFtZT0ibWV0aG9kX2dldFR5cGUiPmdldFR5cGU8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgamF2YS5sYW5nLlN0cmluZyA8c3Ryb25nPmdldFR5cGU8L3N0cm9uZz4oKTwvY29kZT48L3A+PHA+PC9wPjxoMz5SZXR1cm5zPC9oMz48cD48Y29kZT5qYXZhLmxhbmcuU3RyaW5nPC9jb2RlPjwvcD48aHI+PGgyPjxhIG5hbWU9Im1ldGhvZF9nZXRWYWx1ZSI+Z2V0VmFsdWU8L2E+PC9oMj48cD48Y29kZT5wdWJsaWMgamF2YS5sYW5nLlN0cmluZyA8c3Ryb25nPmdldFZhbHVlPC9zdHJvbmc+KCk8L2NvZGU+PC9wPjxwPjwvcD48aDM+UmV0dXJuczwvaDM+PHA+PGNvZGU+amF2YS5sYW5nLlN0cmluZzwvY29kZT48L3A+PGhyPjwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uL2RvYy9odG1sL3RvYy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uL2RvYy9odG1sL3RvYy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjZmMGE5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi9kb2MvaHRtbC90b2MuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci0KLTxodG1sPgotPGhlYWQ+Ci0JPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0JPHRpdGxlPlRhYmxlIG9mIENvbnRlbnRzPC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDE+VGFibGUgb2YgQ29udGVudHM8L2gxPgotUGxlYXNlIGVudGVyIHlvdXIgdGV4dCBoZXJlLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi9kb2MvamVsdG9odG1sLnhzbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi9kb2MvamVsdG9odG1sLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRhZjAwZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuc2RrLmRvY3VtZW50YXRpb24vZG9jL2plbHRvaHRtbC54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwzOTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRGF2aWQgQ2FydmVyIC0gYnVnIDIzMTQ3MiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAtLT4KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0gICAgICAgICAgICAgICAgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0gICAgICAgICAgICAgICAgeG1sbnM6cmVkaXJlY3Q9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94YWxhbi9yZWRpcmVjdCIKLSAgICAgICAgICAgICAgICBleHRlbnNpb24tZWxlbWVudC1wcmVmaXhlcz0icmVkaXJlY3QiPgotICAgIDx4c2w6b3V0cHV0IGVuY29kaW5nPSJVVEYtOCIgbWV0aG9kPSJodG1sIiBpbmRlbnQ9Im5vIiBvbWl0LXhtbC1kZWNsYXJhdGlvbj0ieWVzIi8+Ci0gICAgCi0gICAgPCEtLSBDcmVhdGUgdGhlIEhUTUwgc3RydWN0dXJlIC0tPgotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgotICAgCQk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii8vamVsY2xhc3MiLz4KLQk8L3hzbDp0ZW1wbGF0ZT4KLSAgIAotICAgIDwhLS0gVGhpcyBpcyB0aGUgbWFpbiB3b3JrIGhvcnNlIHRoYXQgZG9lcyB0aGUgZ2VuZXJhbCBsYXlvdXQgZm9yIHRoZSBjbGFzcyBwYWdlIC0tPgotICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImplbGNsYXNzIj4KLSAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3V0cHV0RmlsZSI+Ci0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAZnVsbHR5cGUiLz4KLSAgICAgICAgPHhzbDp0ZXh0Pi5odG1sPC94c2w6dGV4dD4KLSAgICAgIDwveHNsOnZhcmlhYmxlPgotICAgICAgPHhzbDptZXNzYWdlIHRlcm1pbmF0ZT0ibm8iPgotICAgICAgICAgPHhzbDp0ZXh0PkdlbmVyYXRpbmcgSmF2YURvYyBmb3IgPC94c2w6dGV4dD4KLSAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAZnVsbHR5cGUiLz4KLSAgICAgICAgIDx4c2w6dGV4dD4uPC94c2w6dGV4dD4KLSAgICAgIDwveHNsOm1lc3NhZ2U+Ci0gICAgICA8cmVkaXJlY3Q6d3JpdGUgc2VsZWN0PSIkb3V0cHV0RmlsZSI+Ci0gICAgICAgPGh0bWw+Ci0gICAgICAgICA8Ym9keT4KLSAgICAgICAgICAgIDxwPgotICAgICAgICAgICAgICAgPGZvbnQgc2l6ZT0iKzEiPjxzdHJvbmc+UGFja2FnZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBhY2thZ2UiLz48L3N0cm9uZz48L2ZvbnQ+Ci0gICAgICAgICAgICA8L3A+Ci0gICAgICAgICAgICA8aHIvPgotICAgICAgICAgICAgPGgyPgotICAgICAgICAgICAgICAgPGZvbnQgc2l6ZT0iLTEiPjxzdHJvbmc+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwYWNrYWdlIi8+PC9zdHJvbmc+PC9mb250Pjxici8+Ci0gICAgICAgICAgICAgICBDbGFzcyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz4KLSAgICAgICAgICAgIDwvaDI+Ci0gICAgICAgICAgICA8YnIvPgotICAgICAgICAgICAgPGhyLz4KLSAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJmb3JtYXQtaGVhZGVyIi8+Ci0gICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImNvbW1lbnQvZGVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iY29tbWVudC9hdHRyaWJ1dGUiLz4KLSAgICAgICAgICAgIDxoci8+Ci0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImRlc2NlbmRhbnQ6OmZpZWxkcyI+Ci0gICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSI+Ci0gICAgICAgICAgICAgICAgICA8dHIgYmdjb2xvcj0iI0NDQ0NGRiIgY29scz0iMiI+Ci0gICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjEwMCUiIGNvbHNwYW49IjIiPjxoMj5GaWVsZCBTdW1tYXJ5PC9oMj48L3RkPgotICAgICAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iZmllbGRzL2ZpZWxkIiBtb2RlPSJzdW1tYXJ5Ij4KLSAgICAgICAgICAgICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9IkBuYW1lIiBvcmRlcj0iYXNjZW5kaW5nIi8+Ci0gICAgICAgICAgICAgICAgICA8L3hzbDphcHBseS10ZW1wbGF0ZXM+Ci0gICAgICAgICAgICAgICA8L3RhYmxlPgotICAgICAgICAgICAgICAgPGJyLz4KLSAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJkZXNjZW5kYW50Ojpjb25zdHJ1Y3RvciI+Ci0gICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSI+Ci0gICAgICAgICAgICAgICAgICA8dHIgYmdjb2xvcj0iI0NDQ0NGRiI+Ci0gICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjEwMCUiPjxoMj5Db25zdHJ1Y3RvciBTdW1tYXJ5PC9oMj48L3RkPgotICAgICAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iZGVzY2VuZGFudDo6Y29uc3RydWN0b3IiIG1vZGU9InN1bW1hcnkiPgotICAgICAgICAgICAgICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQG5hbWUiIG9yZGVyPSJhc2NlbmRpbmciLz4KLSAgICAgICAgICAgICAgICAgIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4KLSAgICAgICAgICAgICAgIDwvdGFibGU+Ci0gICAgICAgICAgICAgICA8YnIvPgotICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImRlc2NlbmRhbnQ6Om1ldGhvZHMiPgotICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiPgotICAgICAgICAgICAgICAgICAgPHRyIGJnY29sb3I9IiNDQ0NDRkYiIGNvbHM9IjIiPgotICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIxMDAlIiBjb2xzcGFuPSIyIj48aDI+TWV0aG9kIFN1bW1hcnk8L2gyPjwvdGQ+Ci0gICAgICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJtZXRob2RzL21ldGhvZCIgbW9kZT0ic3VtbWFyeSI+Ci0gICAgICAgICAgICAgICAgICAgICA8eHNsOnNvcnQgc2VsZWN0PSJAbmFtZSIgb3JkZXI9ImFzY2VuZGluZyIvPgotICAgICAgICAgICAgICAgICAgPC94c2w6YXBwbHktdGVtcGxhdGVzPgotICAgICAgICAgICAgICAgPC90YWJsZT4KLSAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgPGhyLz4KLSAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iZmllbGRzIj4KLSAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJmaWVsZERldGFpbCIvPgotICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im1ldGhvZHMvY29uc3RydWN0b3IiPgotICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNvbnN0cnVjdG9yRGV0YWlsIi8+Ci0gICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibWV0aG9kcy9tZXRob2QiPgotICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im1ldGhvZHNEZXRhaWwiLz4KLSAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICA8L2JvZHk+Ci0gICAgICAgICA8L2h0bWw+Ci0gICAgICA8L3JlZGlyZWN0OndyaXRlPgotICAgIDwveHNsOnRlbXBsYXRlPgotICAgIAotICAgIDwhLS0gT3V0cHV0IGFueSBkZXNjcmlwdGlvbiB0aGF0IG1heSBiZSB0aGVyZSBmb3IgY29tbWVudHMuIC0tPgotICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNvbW1lbnQvZGVzY3JpcHRpb24iPgotICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiLz4KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLSAgICAKLSAgICA8IS0tIE91dHB1dCB0aGUgdmFyaW91cyBhdHRyaWJ1dGUgaW5mb3JtYXRpb24gZm9yIHRoZSBjbGFzcyAtLT4KLSAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJjb21tZW50L2F0dHJpYnV0ZSI+Ci0gICAgICAgICA8cD4KLSAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBhdXRob3IiPgotICAgICAgICAgICAgICAgICAgPHN0cm9uZz5BdXRob3I6PC9zdHJvbmc+PGJyLz4KLSAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJkZXNjcmlwdGlvbiIgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIvPiAKLSAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQHNlZSI+Ci0gICAgICAgICAgICAgICAgICA8c3Ryb25nPlNlZSBBbHNvOjwvc3Ryb25nPjxici8+Ci0gICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iZGVzY3JpcHRpb24iIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiLz4KLSAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICA8L3A+Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci0KLQotICAgICAgICA8IS0tIENyZWF0ZSB0aGUgZmllbGQgc3VtbWFyeSByb3dzIC0tPgotICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImZpZWxkIiBtb2RlPSJzdW1tYXJ5Ij4KLSAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0IiB3aWR0aD0iMjAlIj4KLSAgICAgICAgICAgICAgIDxjb2RlPgotICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB2aXNpYmlsaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBzdGF0aWMgPSAndHJ1ZSciPgotICAgICAgICAgICAgICAgICAgICAgPHhzbDp0ZXh0PiBzdGF0aWMgPC94c2w6dGV4dD4KLSAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PgotICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBmdWxsdHlwZSIvPiAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9jb2RlPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9IjgwJSI+Ci0gICAgICAgICAgICAgICA8Y29kZT4KLSAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiNmaWVsZF97QG5hbWV9Ij4KLSAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgICAgICAgPC9hPgotICAgICAgICAgICAgICAgPC9jb2RlPgotICAgICAgICAgICAgICAgPGJyLz4KLSAgICAgICAgICAgICAgICYjMTYwOyYjMTYwOyYjMTYwOyYjMTYwOwotICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvbW1lbnQvZGVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICA8L3RyPgotICAgIDwveHNsOnRlbXBsYXRlPgotICAgIAotICAgIAotICAgIDwhLS0gQ3JlYXRlIHRoZSBjb25zdHJ1Y3RvcnMgcm93cyAtLT4KLSAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJjb25zdHJ1Y3RvciIgbW9kZT0ic3VtbWFyeSI+Ci0gICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICA8Y29kZT4KLSAgICAgICAgICAgICAgICAgIDxzdHJvbmc+Ci0gICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiNjb25fe0BuYW1lfSI+Ci0gICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgPC9hPgotICAgICAgICAgICAgICAgICAgPC9zdHJvbmc+ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICA8eHNsOnRleHQ+KDwveHNsOnRleHQ+Ci0gICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBhcmFtcyI+Ci0gICAgICAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9InBhcmFtcy9wYXJhbSIvPgotICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICA8eHNsOnRleHQ+KTwveHNsOnRleHQ+Ci0gICAgICAgICAgICAgICA8L2NvZGU+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgPC90cj4KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLSAgICAKLSAgICAKLSAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJwYXJhbSI+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGZ1bGx0eXBlIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpICE9IGxhc3QoKSI+Ci0gICAgICAgICAsCi0gICAgICA8L3hzbDppZj4KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLSAgICAKLSAgICA8IS0tIENyZWF0ZSB0aGUgbWV0aG9kIHN1bW1hcnkgcm93cyAtLT4KLSAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJtZXRob2QiIG1vZGU9InN1bW1hcnkiPgotICAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiIHdpZHRoPSIyMCUiPgotICAgICAgICAgICAgICAgPGNvZGU+Ci0gICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHZpc2liaWxpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQHN0YXRpYyA9ICd0cnVlJyI+Ci0gICAgICAgICAgICAgICAgICAgICA8eHNsOnRleHQ+IHN0YXRpYzwveHNsOnRleHQ+Ci0gICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4gPC94c2w6dGV4dD4KLSAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAZnVsbHR5cGUiLz4gICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvY29kZT4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8dGQgYWxpZ249ImxlZnQiIHdpZHRoPSIiPgotICAgICAgICAgICAgICAgPGNvZGU+Ci0gICAgICAgICAgICAgICAgICA8YSBocmVmPSIjbWV0aG9kX3tAbmFtZX0iPgotICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8L2E+Ci0gICAgICAgICAgICAgICAgICA8eHNsOnRleHQ+KDwveHNsOnRleHQ+Ci0gICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBhcmFtcyI+Ci0gICAgICAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9InBhcmFtcy9wYXJhbSIvPgotICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICA8eHNsOnRleHQ+KTwveHNsOnRleHQ+Ci0gICAgICAgICAgICAgICA8L2NvZGU+Ci0gICAgICAgICAgICAgICA8YnIvPgotICAgICAgICAgICAgICAgJiMxNjA7JiMxNjA7JiMxNjA7JiMxNjA7Ci0gICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImNvbW1lbnQvZGVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICA8L3RyPgotICAgIDwveHNsOnRlbXBsYXRlPgotICAgIAotICAgIAotICAgIDx4c2w6dGVtcGxhdGUgbmFtZT0iZm9ybWF0LWhlYWRlciI+Ci0gICAgICAgICA8cHJlPgotPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB2aXNpYmlsaXR5Ii8+IGNsYXNzIDxzdHJvbmc+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PC9zdHJvbmc+Ci1leHRlbmRzIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAc3VwZXJjbGFzc2Z1bGx0eXBlIi8+Ci0gICAgICAgICA8L3ByZT4KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLSAgICAKLSAgICA8eHNsOnRlbXBsYXRlIG5hbWU9ImZpZWxkRGV0YWlsIj4KLSAgICAgIDx0YWJsZSBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBjb2xzPSIyIj4KLSAgICAgICAgIDx0ciBhbGlnbj0ibGVmdCIgYmdjb2xvcj0iI0NDQ0NGRiIgd2lkdGg9IjEwMCUiIGNvbHNwYW49IjIiPgotICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgPGgyPgotICAgICAgICAgICAgICAgICAgRmllbGQgRGV0YWlsCi0gICAgICAgICAgICAgICA8L2gyPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgIDwvdHI+Ci0gICAgICA8L3RhYmxlPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJmaWVsZHMvZmllbGQiIG1vZGU9ImRldGFpbCI+Ci0gICAgICAgICA8eHNsOnNvcnQgc2VsZWN0PSJAbmFtZSIgb3JkZXI9ImFzY2VuZGluZyIvPgotICAgICAgPC94c2w6YXBwbHktdGVtcGxhdGVzPgotICAgIDwveHNsOnRlbXBsYXRlPgotICAgIAotICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImZpZWxkcy9maWVsZCIgbW9kZT0iZGV0YWlsIj4KLSAgICAgIDxoMj4KLSAgICAgICAgIDxhIG5hbWU9ImZpZWxkX3tAbmFtZX0iPgotICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICA8L2E+Ci0gICAgICA8L2gyPgotICAgICAgPHA+Ci0gICAgICAgICA8Y29kZT4KLSAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdmlzaWJpbGl0eSIvPgotICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJAc3RhdGljID0gJ3RydWUnIj4KLSAgICAgICAgICAgICAgIDx4c2w6dGV4dD4gc3RhdGljIDwveHNsOnRleHQ+Ci0gICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgIDx4c2w6dGV4dD4gPC94c2w6dGV4dD4KLSAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAZnVsbHR5cGUiLz4KLSAgICAgICAgICAgIDx4c2w6dGV4dD4gPC94c2w6dGV4dD4KLSAgICAgICAgICAgIDxzdHJvbmc+Ci0gICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgIDwvc3Ryb25nPiAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgIDwvY29kZT4KLSAgICAgIDwvcD4KLSAgICAgIDx4c2w6aWYgdGVzdD0iY29tbWVudCI+Ci0gICAgICAgICA8dGFibGU+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iY29tbWVudC9kZXNjcmlwdGlvbiIvPgotICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgIDwvdGFibGU+Ci0gICAgICA8L3hzbDppZj4KLSAgICAgIDxoci8+Ci0gICAgICAKLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLSAgICAKLSAgICA8eHNsOnRlbXBsYXRlIG5hbWU9ImNvbnN0cnVjdG9yRGV0YWlsIj4KLSAgICAgIDx0YWJsZSBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBjb2xzPSIyIj4KLSAgICAgICAgIDx0ciBhbGlnbj0ibGVmdCIgYmdjb2xvcj0iI0NDQ0NGRiIgd2lkdGg9IjEwMCUiIGNvbHNwYW49IjIiPgotICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgPGgyPgotICAgICAgICAgICAgICAgICAgQ29uc3RydWN0b3IgRGV0YWlsCi0gICAgICAgICAgICAgICA8L2gyPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgIDwvdHI+Ci0gICAgICA8L3RhYmxlPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJtZXRob2RzL2NvbnN0cnVjdG9yIiBtb2RlPSJkZXRhaWwiPgotICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQG5hbWUiIG9yZGVyPSJhc2NlbmRpbmciLz4KLSAgICAgIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLSAgICAKLSAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJtZXRob2RzL2NvbnN0cnVjdG9yIiBtb2RlPSJkZXRhaWwiPgotICAgICAgPGgyPgotICAgICAgICAgPGEgbmFtZT0iY29uX3tAbmFtZX0iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvYT4KLSAgICAgIDwvaDI+Ci0gICAgICA8cD4KLSAgICAgICAgIDxjb2RlPgotICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB2aXNpYmlsaXR5Ii8+Ci0gICAgICAgICAgICA8eHNsOnRleHQ+IDwveHNsOnRleHQ+Ci0gICAgICAgICAgICA8c3Ryb25nPgotICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICA8L3N0cm9uZz4KLSAgICAgICAgICAgIDx4c2w6dGV4dD4oPC94c2w6dGV4dD4KLSAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0icGFyYW1zIj4KLSAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0icGFyYW1zL3BhcmFtIi8+Ci0gICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgIDx4c2w6dGV4dD4pPC94c2w6dGV4dD4KLSAgICAgICAgIDwvY29kZT4KLSAgICAgIDwvcD4KLSAgICAgIDxwPgotICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJjb21tZW50L2Rlc2NyaXB0aW9uIi8+Ci0gICAgICA8L3A+Ci0gICAgICA8aHIvPgotICAgICAgCi0gICAgPC94c2w6dGVtcGxhdGU+Ci0gICAgCi0gICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJtZXRob2RzRGV0YWlsIj4KLSAgICAgIDx0YWJsZSBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBjb2xzPSIyIj4KLSAgICAgICAgIDx0ciBhbGlnbj0ibGVmdCIgYmdjb2xvcj0iI0NDQ0NGRiIgd2lkdGg9IjEwMCUiIGNvbHNwYW49IjIiPgotICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgPGgyPgotICAgICAgICAgICAgICAgICAgTWV0aG9kcyBEZXRhaWwKLSAgICAgICAgICAgICAgIDwvaDI+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgPC90cj4KLSAgICAgIDwvdGFibGU+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Im1ldGhvZHMvbWV0aG9kIiBtb2RlPSJkZXRhaWwiPgotICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQG5hbWUiIG9yZGVyPSJhc2NlbmRpbmciLz4KLSAgICAgIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLSAgICAKLSAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJtZXRob2RzL21ldGhvZCIgbW9kZT0iZGV0YWlsIj4KLSAgICAgIDxoMj4KLSAgICAgICAgIDxhIG5hbWU9Im1ldGhvZF97QG5hbWV9Ij4KLSAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgPC9hPgotICAgICAgPC9oMj4KLSAgICAgIDxwPgotICAgICAgICAgPGNvZGU+Ci0gICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHZpc2liaWxpdHkiLz4KLSAgICAgICAgICAgIDx4c2w6dGV4dD4gPC94c2w6dGV4dD4KLSAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAZnVsbHR5cGUiLz4KLSAgICAgICAgICAgIDx4c2w6dGV4dD4gPC94c2w6dGV4dD4KLSAgICAgICAgICAgIDxzdHJvbmc+Ci0gICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgIDwvc3Ryb25nPgotICAgICAgICAgICAgPHhzbDp0ZXh0Pig8L3hzbDp0ZXh0PgotICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJwYXJhbXMiPgotICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJwYXJhbXMvcGFyYW0iLz4KLSAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgPHhzbDp0ZXh0Pik8L3hzbDp0ZXh0PgotICAgICAgICAgPC9jb2RlPgotICAgICAgPC9wPgotICAgICAgPHA+Ci0gICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImNvbW1lbnQvZGVzY3JpcHRpb24iLz4KLSAgICAgIDwvcD4KLSAgICAgIDx4c2w6aWYgdGVzdD0icGFyYW1zIj4KLSAgICAgICAgIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLSAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0icGFyYW1zL3BhcmFtIiBtb2RlPSJkZXRhaWwiLz4KLSAgICAgIDwveHNsOmlmPgotICAgICAgPHhzbDppZiB0ZXN0PSJAdHlwZSAhPSAndm9pZCciPgotICAgICAgICAgPGgzPlJldHVybnM8L2gzPgotICAgICAgICAgICAgPHA+Ci0gICAgICAgICAgICAgICA8Y29kZT4KLSAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAZnVsbHR5cGUiLz4KLSAgICAgICAgICAgICAgIDwvY29kZT4KLSAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ic3RyaW5nLWxlbmd0aChAcmV0dXJuY29tbWVudCkgPiAwIj4KLSAgICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4gLSA8L3hzbDp0ZXh0PgotICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkByZXR1cm5jb21tZW50IiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIi8+Ci0gICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgIDwvcD4KLSAgICAgIDwveHNsOmlmPgotICAgICAgPHhzbDppZiB0ZXN0PSJleGNlcHRpb25zIj4KLSAgICAgICAgIDxoMz5UaHJvd3M6PC9oMz4KLSAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iZXhjZXB0aW9ucy9leGNlcHRpb24iIG1vZGU9ImRldGFpbCIvPgotICAgICAgPC94c2w6aWY+Ci0gICAgICA8aHIvPgotICAgICAgCi0gICAgPC94c2w6dGVtcGxhdGU+Ci0gICAgCi0gICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0icGFyYW0iIG1vZGU9ImRldGFpbCI+Ci0gICAgICAgICA8cD4KLSAgICAgICAgICAgIDxjb2RlPgotICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICA8L2NvZGU+Ci0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InN0cmluZy1sZW5ndGgoQGNvbW1lbnQpID4gMCI+Ci0gICAgICAgICAgICAgICA8eHNsOnRleHQ+IC0gPC94c2w6dGV4dD4KLSAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAY29tbWVudCIgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIvPgotICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICA8L3A+Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci0gICAgCi0gICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZXhjZXB0aW9uIiBtb2RlPSJkZXRhaWwiPgotICAgICAgPHA+Ci0gICAgICAgICA8Y29kZT4KLSAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAZnVsbHR5cGUiLz4KLSAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ic3RyaW5nLWxlbmd0aChAY29tbWVudCkgPiAwIj4KLSAgICAgICAgICAgICAgIDx4c2w6dGV4dD4gLSA8L3hzbDp0ZXh0PgotICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBjb21tZW50IiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIi8+Ci0gICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgIDwvY29kZT4KLSAgICAgIDwvcD4KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLSAgICAgICAKLTwveHNsOnN0eWxlc2hlZXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uL2RvYy9qZWx0b3RvYy54c2wgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuc2RrLmRvY3VtZW50YXRpb24vZG9jL2plbHRvdG9jLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhmNTA4Mi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuc2RrLmRvY3VtZW50YXRpb24vZG9jL2plbHRvdG9jLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERhdmlkIENhcnZlciAtIGJ1ZyAyMzE0NzIgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIC0tPgotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0gICB4bWxuczpzZXQ9Imh0dHA6Ly9leHNsdC5vcmcvc2V0cyIKLSAgIHhtbG5zOnhhbGFuPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveGFsYW4iCi0gICAgZXhjbHVkZS1yZXN1bHQtcHJlZml4ZXM9InNldCB4YWxhbiIKLT4KLSAgIDx4c2w6cGFyYW0gbmFtZT0ic2RrbmFtZSI+U29tZSBOYW1lPC94c2w6cGFyYW0+Ci0gICA8eHNsOnBhcmFtIG5hbWU9ImRpciI+ZG9jL2h0bWw8L3hzbDpwYXJhbT4gICAKLSAgIDx4c2w6b3V0cHV0IGluZGVudD0ieWVzIiBlbmNvZGluZz0iVVRGLTgiIHhhbGFuOmluZGVudC1hbW91bnQ9IjMiLz4KLSAgIDx4c2w6a2V5IG5hbWU9ImFsbFBhY2thZ2VzIiBtYXRjaD0iamVsY2xhc3MiIHVzZT0iQHBhY2thZ2UiLz4KLSAgICAgCi0gICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvamVsIj4KLSAgICAgIDx0b2MgbGFiZWw9Inskc2RrbmFtZX0iPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJSZWZlcmVuY2UiPgotICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InNldDpkaXN0aW5jdChqZWxjbGFzcy9AcGFja2FnZSkiPgotICAgICAgICAgICAgICAgPHRvcGljIGxhYmVsPSJ7Ln0iPgotICAgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJrZXkoJ2FsbFBhY2thZ2VzJywgLikiLz4KLSAgICAgICAgICAgICAgIDwvdG9waWM+Ci0gICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgIDwvdG9waWM+Ci0gICAgICA8L3RvYz4KLSAgIDwveHNsOnRlbXBsYXRlPgotICAgCi0gICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJqZWxjbGFzcyI+Ci0gICAgICA8dG9waWMgbGFiZWw9IntAZnVsbHR5cGV9IiBocmVmPSJ7JGRpcn0ve0BmdWxsdHlwZX0uaHRtbCIvPgotICAgPC94c2w6dGVtcGxhdGU+Ci0gICAKLTwveHNsOnN0eWxlc2hlZXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uL2RvYy9zY2hlbWEuY3NzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uL2RvYy9zY2hlbWEuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjIwMjhkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi9kb2Mvc2NoZW1hLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLUg2LlNjaGVtYUhlYWRlciB7Ci0JZm9udC1zaXplOjE2cHg7IAotCWRpc3BsYXk6aW5saW5lCi19Ci0KLVAuU2NoZW1hQ29weXJpZ2h0IHsKLQlmb250LXNpemU6IHNtYWxsZXI7IAotCWZvbnQtc3R5bGU6IG5vcm1hbDsKLQljb2xvcjogIzMzNjY5OTsgCi0JZGlzcGxheTppbmxpbmU7Ci0JbWFyZ2luLXRvcDogMy4wMDAwMDBwdDsKLQltYXJnaW4tYm90dG9tOiAxMS4wMDAwMDBwdDsKLQltYXJnaW4tcmlnaHQ6IDAuMDAwMDAwcHQ7Ci0JbWFyZ2luLWxlZnQ6IDAuMDAwMDAwcHQ7Ci19Ci0KLVAuU2NoZW1hRHRkIHsKLQljb2xvcjogIzgwMDAwMDsgCi0JbWFyZ2luLXRvcDogMC4wMDAwMDBwdDsKLQltYXJnaW4tYm90dG9tOiAwLjAwMDAwMHB0OwotCW1hcmdpbi1yaWdodDogMC4wMDAwMDBwdDsKLQltYXJnaW4tbGVmdDogMTAuMDAwMDAwcHQ7Ci19Ci0KLVAuU2NoZW1hRHRkQXR0bGlzdCB7Ci0JY29sb3I6ICM4MDAwMDA7IAotCW1hcmdpbi10b3A6IDAuMDAwMDAwcHQ7Ci0JbWFyZ2luLWJvdHRvbTogMC4wMDAwMDBwdDsKLQltYXJnaW4tcmlnaHQ6IDAuMDAwMDAwcHQ7Ci0JbWFyZ2luLWxlZnQ6IDIwLjAwMDAwMHB0OwotfQotCi1zcGFuLlNjaGVtYVRhZyB7Ci0JY29sb3I6ICMwMDAwODA7Ci19Ci0KLXNwYW4uU2NoZW1hQ3N0cmluZyB7Ci0JY29sb3I6ICMwMDgwMDA7Ci19Ci0KLXByZS5FeGFtcGxlIHsKLQltYXJnaW4tdG9wOiAwLjAwMDAwMHB0OwotfQotCi0uQ29uZmlnTWFya3VwRWxlbWVudERlc2MgewotCWNvbG9yOiBibGFjazsKLQltYXJnaW4tdG9wOiAwLjAwMDAwMHB0OwotCW1hcmdpbi1ib3R0b206IDAuMDAwMDAwcHQ7Ci0JbWFyZ2luLXJpZ2h0OiAwLjAwMDAwMHB0OwotCW1hcmdpbi1sZWZ0OiAxMC4wMDAwMDBwdDsKLX0KLQotLkNvbmZpZ01hcmt1cEF0dGxpc3REZXNjIHsKLQljb2xvcjogYmxhY2s7Ci0JbWFyZ2luLXRvcDogMC4wMDAwMDBwdDsKLQltYXJnaW4tYm90dG9tOiAwLjAwMDAwMHB0OwotCW1hcmdpbi1yaWdodDogMC4wMDAwMDBwdDsKLQltYXJnaW4tbGVmdDogMzIuMDAwMDAwcHQ7Ci19Ci0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi9saWIvLmN2c2lnbm9yZSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi9saWIvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM4ZjVkYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuc2RrLmRvY3VtZW50YXRpb24vbGliLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWplbGRvY2xldC5qYXIKLWRvY2NoZWNrLmphcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGE2YTQ3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsIGFuZCBvdGhlcnMKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgRGF2aWQgQ2FydmVyIC0gU1RBUiAtIGJ1ZyAyMTUxMjYsIDIxMzg1MwotIyAgICAgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotcGx1Z2luTmFtZT1YU0wgU0RLIERvY3VtZW50YXRpb24gKEluY3ViYXRpbmcpCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuc2RrLmRvY3VtZW50YXRpb24vcGx1Z2luLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDI3OTEyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI+Ci0gICAgICA8dG9jCi0gICAgICAgICAgICBmaWxlPSJ0b2MueG1sIgotICAgICAgICAgICAgcHJpbWFyeT0idHJ1ZSI+Ci0gICAgICA8L3RvYz4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9zZGsvZG9jdW1lbnRhdGlvbi9BY3RpdmF0b3IuamF2YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9zZGsvZG9jdW1lbnRhdGlvbi9BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg0ZTQxMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuc2RrLmRvY3VtZW50YXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvc2RrL2RvY3VtZW50YXRpb24vQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuc2RrLmRvY3VtZW50YXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGV4dGVuZHMgUGx1Z2luIHsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC54c2wuc2RrLmRvY3VtZW50YXRpb24iOwotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIEFjdGl2YXRvciBwbHVnaW47Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEFjdGl2YXRvcigpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW5zI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKgotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQWN0aXZhdG9yIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuc2RrLmRvY3VtZW50YXRpb24vdG9jLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi90b2MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmU4OWQzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi90b2MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48dG9jIGxhYmVsPSJYU0wgVG9vbHMgU0RLIERvY3VtZW50YXRpb24iPgotICAgPHRvcGljIGxhYmVsPSJSZWZlcmVuY2UiPgotICAgICAgPHRvcGljIGxhYmVsPSJvcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLmNvcmUiPgotICAgICAgICAgPHRvcGljIGhyZWY9ImRvYy9odG1sL29yZy5lY2xpcHNlLndzdC54bWwueHBhdGguY29yZS5YUGF0aENvcmVQbHVnaW4uaHRtbCIgbGFiZWw9Im9yZy5lY2xpcHNlLndzdC54bWwueHBhdGguY29yZS5YUGF0aENvcmVQbHVnaW4iLz4KLSAgICAgIDwvdG9waWM+Ci0gICAgICA8dG9waWMgbGFiZWw9Im9yZy5lY2xpcHNlLndzdC54bWwueHBhdGguY29yZS51dGlsIj4KLSAgICAgICAgIDx0b3BpYyBocmVmPSJkb2MvaHRtbC9vcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLmNvcmUudXRpbC5YU0xUWFBhdGhIZWxwZXIuaHRtbCIgbGFiZWw9Im9yZy5lY2xpcHNlLndzdC54bWwueHBhdGguY29yZS51dGlsLlhTTFRYUGF0aEhlbHBlciIvPgotICAgICAgPC90b3BpYz4KLSAgICAgIDx0b3BpYyBsYWJlbD0ib3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aSI+Ci0gICAgICAgICA8dG9waWMgaHJlZj0iZG9jL2h0bWwvb3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aS5YUGF0aFVJTWVzc2FnZXMuaHRtbCIgbGFiZWw9Im9yZy5lY2xpcHNlLndzdC54bWwueHBhdGgudWkuWFBhdGhVSU1lc3NhZ2VzIi8+Ci0gICAgICA8L3RvcGljPgotICAgICAgPHRvcGljIGxhYmVsPSJvcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLnVpLnZpZXdzIj4KLSAgICAgICAgIDx0b3BpYyBocmVmPSJkb2MvaHRtbC9vcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLnVpLnZpZXdzLkRPTU5vZGVMYWJlbFByb3ZpZGVyLmh0bWwiIGxhYmVsPSJvcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLnVpLnZpZXdzLkRPTU5vZGVMYWJlbFByb3ZpZGVyIi8+Ci0gICAgICAgICA8dG9waWMgaHJlZj0iZG9jL2h0bWwvb3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aS52aWV3cy5ET01UcmVlQ29udGVudFByb3ZpZGVyLmh0bWwiIGxhYmVsPSJvcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLnVpLnZpZXdzLkRPTVRyZWVDb250ZW50UHJvdmlkZXIiLz4KLSAgICAgICAgIDx0b3BpYyBocmVmPSJkb2MvaHRtbC9vcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLnVpLnZpZXdzLkRPTVZpZXdlckZpbHRlci5odG1sIiBsYWJlbD0ib3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aS52aWV3cy5ET01WaWV3ZXJGaWx0ZXIiLz4KLSAgICAgICAgIDx0b3BpYyBocmVmPSJkb2MvaHRtbC9vcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLnVpLnZpZXdzLkVkaXROYW1lc3BhY2VQcmVmaXhEaWFsb2cuaHRtbCIgbGFiZWw9Im9yZy5lY2xpcHNlLndzdC54bWwueHBhdGgudWkudmlld3MuRWRpdE5hbWVzcGFjZVByZWZpeERpYWxvZyIvPgotICAgICAgICAgPHRvcGljIGhyZWY9ImRvYy9odG1sL29yZy5lY2xpcHNlLndzdC54bWwueHBhdGgudWkudmlld3MuWFBhdGhOYXZpZ2F0b3IuaHRtbCIgbGFiZWw9Im9yZy5lY2xpcHNlLndzdC54bWwueHBhdGgudWkudmlld3MuWFBhdGhOYXZpZ2F0b3IiLz4KLSAgICAgICAgIDx0b3BpYyBocmVmPSJkb2MvaHRtbC9vcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLnVpLnZpZXdzLlhQYXRoTmF2aWdhdG9yLlhQYXRoQWN0aW9uLmh0bWwiIGxhYmVsPSJvcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLnVpLnZpZXdzLlhQYXRoTmF2aWdhdG9yLlhQYXRoQWN0aW9uIi8+Ci0gICAgICAgICA8dG9waWMgaHJlZj0iZG9jL2h0bWwvb3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aS52aWV3cy5YUGF0aE5hdmlnYXRvci5SZWZyZXNoQWN0aW9uLmh0bWwiIGxhYmVsPSJvcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLnVpLnZpZXdzLlhQYXRoTmF2aWdhdG9yLlJlZnJlc2hBY3Rpb24iLz4KLSAgICAgICAgIDx0b3BpYyBocmVmPSJkb2MvaHRtbC9vcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLnVpLnZpZXdzLlhQYXRoTmF2aWdhdG9yLlNob3dJblNvdXJjZUFjdGlvbi5odG1sIiBsYWJlbD0ib3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aS52aWV3cy5YUGF0aE5hdmlnYXRvci5TaG93SW5Tb3VyY2VBY3Rpb24iLz4KLSAgICAgICAgIDx0b3BpYyBocmVmPSJkb2MvaHRtbC9vcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLnVpLnZpZXdzLlhQYXRoTmF2aWdhdG9yLlhNTEVkaXRvcnNDb250ZW50UHJvdmlkZXIuaHRtbCIgbGFiZWw9Im9yZy5lY2xpcHNlLndzdC54bWwueHBhdGgudWkudmlld3MuWFBhdGhOYXZpZ2F0b3IuWE1MRWRpdG9yc0NvbnRlbnRQcm92aWRlciIvPgotICAgICAgICAgPHRvcGljIGhyZWY9ImRvYy9odG1sL29yZy5lY2xpcHNlLndzdC54bWwueHBhdGgudWkudmlld3MuWFBhdGhOYXZpZ2F0b3IuRWRpdG9yUmVmZXJlbmNlTGFiZWxQcm92aWRlci5odG1sIiBsYWJlbD0ib3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aS52aWV3cy5YUGF0aE5hdmlnYXRvci5FZGl0b3JSZWZlcmVuY2VMYWJlbFByb3ZpZGVyIi8+Ci0gICAgICAgICA8dG9waWMgaHJlZj0iZG9jL2h0bWwvb3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aS52aWV3cy5YUGF0aE5hdmlnYXRvci5YUGF0aEFjdGlvbi5odG1sIiBsYWJlbD0ib3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aS52aWV3cy5YUGF0aE5hdmlnYXRvci5YUGF0aEFjdGlvbiIvPgotICAgICAgICAgPHRvcGljIGhyZWY9ImRvYy9odG1sL29yZy5lY2xpcHNlLndzdC54bWwueHBhdGgudWkudmlld3MuWFBhdGhOYXZpZ2F0b3IuUmVmcmVzaEFjdGlvbi5odG1sIiBsYWJlbD0ib3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aS52aWV3cy5YUGF0aE5hdmlnYXRvci5SZWZyZXNoQWN0aW9uIi8+Ci0gICAgICAgICA8dG9waWMgaHJlZj0iZG9jL2h0bWwvb3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aS52aWV3cy5YUGF0aE5hdmlnYXRvci5TaG93SW5Tb3VyY2VBY3Rpb24uaHRtbCIgbGFiZWw9Im9yZy5lY2xpcHNlLndzdC54bWwueHBhdGgudWkudmlld3MuWFBhdGhOYXZpZ2F0b3IuU2hvd0luU291cmNlQWN0aW9uIi8+Ci0gICAgICAgICA8dG9waWMgaHJlZj0iZG9jL2h0bWwvb3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aS52aWV3cy5YUGF0aE5hdmlnYXRvci5YTUxFZGl0b3JzQ29udGVudFByb3ZpZGVyLmh0bWwiIGxhYmVsPSJvcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLnVpLnZpZXdzLlhQYXRoTmF2aWdhdG9yLlhNTEVkaXRvcnNDb250ZW50UHJvdmlkZXIiLz4KLSAgICAgICAgIDx0b3BpYyBocmVmPSJkb2MvaHRtbC9vcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLnVpLnZpZXdzLlhQYXRoTmF2aWdhdG9yLkVkaXRvclJlZmVyZW5jZUxhYmVsUHJvdmlkZXIuaHRtbCIgbGFiZWw9Im9yZy5lY2xpcHNlLndzdC54bWwueHBhdGgudWkudmlld3MuWFBhdGhOYXZpZ2F0b3IuRWRpdG9yUmVmZXJlbmNlTGFiZWxQcm92aWRlciIvPgotICAgICAgPC90b3BpYz4KLSAgICAgIDx0b3BpYyBsYWJlbD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlIj4KLSAgICAgICAgIDx0b3BpYyBocmVmPSJkb2MvaHRtbC9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuTWVzc2FnZXMuaHRtbCIgbGFiZWw9Im9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5NZXNzYWdlcyIvPgotICAgICAgICAgPHRvcGljIGhyZWY9ImRvYy9odG1sL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS5WYWxpZGF0aW9uUHJlZmVyZW5jZXMuaHRtbCIgbGFiZWw9Im9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5WYWxpZGF0aW9uUHJlZmVyZW5jZXMiLz4KLSAgICAgICAgIDx0b3BpYyBocmVmPSJkb2MvaHRtbC9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuWFNMQ29yZS5odG1sIiBsYWJlbD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLlhTTENvcmUiLz4KLSAgICAgIDwvdG9waWM+Ci0gICAgICA8dG9waWMgbGFiZWw9Im9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5yZXNvbHZlciI+Ci0gICAgICAgICA8dG9waWMgaHJlZj0iZG9jL2h0bWwvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLnJlc29sdmVyLlJlc29sdmVyRXh0ZW5zaW9uLmh0bWwiIGxhYmVsPSJvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUucmVzb2x2ZXIuUmVzb2x2ZXJFeHRlbnNpb24iLz4KLSAgICAgICAgIDx0b3BpYyBocmVmPSJkb2MvaHRtbC9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUucmVzb2x2ZXIuWFNMVmVyc2lvbkhhbmRsZXIuaHRtbCIgbGFiZWw9Im9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5yZXNvbHZlci5YU0xWZXJzaW9uSGFuZGxlciIvPgotICAgICAgPC90b3BpYz4KLSAgICAgIDx0b3BpYyBsYWJlbD0ib3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi5kZWJ1Z2dlciI+Ci0gICAgICAgICA8dG9waWMgaHJlZj0iZG9jL2h0bWwvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi5kZWJ1Z2dlci5YYWxhbkRlYnVnZ2VyLmh0bWwiIGxhYmVsPSJvcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLmRlYnVnZ2VyLlhhbGFuRGVidWdnZXIiLz4KLSAgICAgICAgIDx0b3BpYyBocmVmPSJkb2MvaHRtbC9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLmRlYnVnZ2VyLlhhbGFuUHJpbnRUcmFjZUxpc3RlbmVyLmh0bWwiIGxhYmVsPSJvcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLmRlYnVnZ2VyLlhhbGFuUHJpbnRUcmFjZUxpc3RlbmVyIi8+Ci0gICAgICAgICA8dG9waWMgaHJlZj0iZG9jL2h0bWwvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi5kZWJ1Z2dlci5YYWxhblJvb3RTdHlsZUZyYW1lLmh0bWwiIGxhYmVsPSJvcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLmRlYnVnZ2VyLlhhbGFuUm9vdFN0eWxlRnJhbWUiLz4KLSAgICAgICAgIDx0b3BpYyBocmVmPSJkb2MvaHRtbC9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLmRlYnVnZ2VyLlhhbGFuU3R5bGVGcmFtZS5odG1sIiBsYWJlbD0ib3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi5kZWJ1Z2dlci5YYWxhblN0eWxlRnJhbWUiLz4KLSAgICAgICAgIDx0b3BpYyBocmVmPSJkb2MvaHRtbC9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLmRlYnVnZ2VyLlhhbGFuVHJhY2VMaXN0ZW5lci5odG1sIiBsYWJlbD0ib3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi5kZWJ1Z2dlci5YYWxhblRyYWNlTGlzdGVuZXIiLz4KLSAgICAgICAgIDx0b3BpYyBocmVmPSJkb2MvaHRtbC9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLmRlYnVnZ2VyLlhhbGFuVmFyaWFibGUuaHRtbCIgbGFiZWw9Im9yZy5lY2xpcHNlLndzdC54c2wueGFsYW4uZGVidWdnZXIuWGFsYW5WYXJpYWJsZSIvPgotICAgICAgPC90b3BpYz4KLSAgIDwvdG9waWM+Ci0gICA8dG9waWMgbGFiZWw9IkV4dGVuc2lvbiBQb2ludHMiPgotICAgICA8dG9waWMgbGFiZWw9IkpBWFAgRGVidWdnZXIiPgotICAgICAgPHRvcGljIGhyZWY9ImRvYy9odG1sL2V4dGVuc2lvbl9wb2ludC9vcmdfZWNsaXBzZV93c3RfeHNsX2pheHBfbGF1bmNoaW5nX2RlYnVnZ2VyLmh0bWwiIGxhYmVsPSJvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLmRlYnVnZ2VyIj4KLSAgICAgIDwvdG9waWM+Ci0gICA8L3RvcGljPgotICAgPHRvcGljIGxhYmVsPSJKQVhQIExhdW5jaGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0iZG9jL2h0bWwvZXh0ZW5zaW9uX3BvaW50L29yZ19lY2xpcHNlX3dzdF94c2xfamF4cF9sYXVuY2hpbmdfaW52b2tlLmh0bWwiIGxhYmVsPSJvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLmludm9rZSI+Ci0gICAgICA8L3RvcGljPgotICAgICAgPHRvcGljIGhyZWY9ImRvYy9odG1sL2V4dGVuc2lvbl9wb2ludC9vcmdfZWNsaXBzZV93c3RfeHNsX2pheHBfbGF1bmNoaW5nX3Byb2Nlc3Nvci5odG1sIiBsYWJlbD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5wcm9jZXNzb3IiPgotICAgICAgPC90b3BpYz4KLSAgICAgIDx0b3BpYyBocmVmPSJkb2MvaHRtbC9leHRlbnNpb25fcG9pbnQvb3JnX2VjbGlwc2Vfd3N0X3hzbF9qYXhwX2xhdW5jaGluZ19wcm9jZXNzb3JUeXBlLmh0bWwiIGxhYmVsPSJvcmcuZWNsaXBzZS53c3QueHNsLmpheHAucHJvY2Vzc29yVHlwZSI+Ci0gICAgICA8L3RvcGljPgotICAgPC90b3BpYz4gICAgICAKLSAgIDwvdG9waWM+Ci08L3RvYz4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbi90b2NFeHRlbnNpb24ueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uL3RvY0V4dGVuc2lvbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzODA5ZjguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLnNkay5kb2N1bWVudGF0aW9uL3RvY0V4dGVuc2lvbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHRvYyBsYWJlbD0iRXh0ZW5zaW9uIFBvaW50cy4iPgotICAgPHRvcGljIGxhYmVsPSJKQVhQIERlYnVnZ2VyIj4KLSAgICAgIDx0b3BpYyBocmVmPSJkb2MvaHRtbC9leHRlbnNpb25fcG9pbnQvb3JnX2VjbGlwc2Vfd3N0X3hzbF9qYXhwX2xhdW5jaGluZ19kZWJ1Z2dlci5odG1sIiBsYWJlbD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5kZWJ1Z2dlciI+Ci0gICAgICA8L3RvcGljPgotICAgPC90b3BpYz4KLSAgIDx0b3BpYyBsYWJlbD0iSkFYUCBMYXVuY2hpbmciPgotICAgICAgPHRvcGljIGhyZWY9ImRvYy9odG1sL2V4dGVuc2lvbl9wb2ludC9vcmdfZWNsaXBzZV93c3RfeHNsX2pheHBfbGF1bmNoaW5nX2ludm9rZS5odG1sIiBsYWJlbD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5pbnZva2UiPgotICAgICAgPC90b3BpYz4KLSAgICAgIDx0b3BpYyBocmVmPSJkb2MvaHRtbC9leHRlbnNpb25fcG9pbnQvb3JnX2VjbGlwc2Vfd3N0X3hzbF9qYXhwX2xhdW5jaGluZ19wcm9jZXNzb3IuaHRtbCIgbGFiZWw9Im9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcucHJvY2Vzc29yIj4KLSAgICAgIDwvdG9waWM+Ci0gICAgICA8dG9waWMgaHJlZj0iZG9jL2h0bWwvZXh0ZW5zaW9uX3BvaW50L29yZ19lY2xpcHNlX3dzdF94c2xfamF4cF9sYXVuY2hpbmdfcHJvY2Vzc29yVHlwZS5odG1sIiBsYWJlbD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLnByb2Nlc3NvclR5cGUiPgotICAgICAgPC90b3BpYz4KLSAgIDwvdG9waWM+Ci08L3RvYz4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFlZTYxZC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLSAgICA8bmFtZT5vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmU8L25hbWU+Ci0gICAgPGNvbW1lbnQ+PC9jb21tZW50PgotICAgIDxwcm9qZWN0cz48L3Byb2plY3RzPgotICAgIDxidWlsZFNwZWM+Ci0gICAgICAgIDxidWlsZENvbW1hbmQ+Ci0gICAgICAgICAgICA8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0gICAgICAgICAgICA8YXJndW1lbnRzPjwvYXJndW1lbnRzPgotICAgICAgICA8L2J1aWxkQ29tbWFuZD4KLSAgICA8L2J1aWxkU3BlYz4KLSAgICA8bmF0dXJlcz4KLSAgICAgICAgPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotICAgIDwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NTBkZjEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1N1biBEZWMgMTYgMTY6NTc6NTcgRVNUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRkODU2OC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSNGcmkgSmFuIDA0IDA5OjA0OjQzIEVTVCAyMDA4Ci1jb21waWxlcnMuaW5jb21wYXRpYmxlLWVudmlyb25tZW50PTEKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAubWlzc2luZy1idW5kbGUtY2xhc3NwYXRoLWVudHJpZXM9MAotY29tcGlsZXJzLnAubWlzc2luZy1wYWNrYWdlcz0yCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0xCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0xCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxYjAyMTMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDY2Mjc3Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVhTTCBUb29scyAoSW5jdWJhdGluZykKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1YU0xUIEVkaXRvciwgdmFsaWRhdG9yLCBsYXVuY2hpbmcgYW5kIGRlYnVnZ2luZyBzdXBwb3J0Ci0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwOCBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpLFxuXAotRGF2aWQgQ2FydmVyIChTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwpIGFuZCBvdGhlcnMgMjAwOC5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51aylcblwKLSAgICBEYXZpZCBDYXJ2ZXIgKFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCAtIGh0dHA6Ly93d3cuc3RhcnN0YW5kYXJkLm9yZylcblwKLSAgICBKZXNwZXIgTW9sbGVyIChOaW5lQ29uc3VsdCAtIGh0dHA6Ly93d3cubmluZWNvbnN1bHQuZGspXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMDcyNDAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjAuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QueHNsIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcy8iLz4KLSAgICAgIDxkaXNjb3ZlcnkgbGFiZWw9IldlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBVcGRhdGVzIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzIi8+Ci0gICA8L3VybD4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2wuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2wueGFsYW4iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueHNsLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUueGFsYW4iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2wuZG9jIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmFwYWNoZS5jb21tb25zLmp4cGF0aCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwueHBhdGguY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUueG1sLnNlcmlhbGl6ZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuYXBhY2hlLmJjZWwiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJqYXZhX2N1cC5ydW50aW1lIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5zYXhvbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2wiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWciCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueHNsLmpheHAuZGVidWcudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmFwYWNoZS5sb2c0aiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwueHBhdGgyLnByb2Nlc3NvciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwM2U2NjUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L0E+KQotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L0E+KQotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0gIAotICA8TEk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvQT4pIDwvTEk+Ci0gIAotICA8bGk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRhNWE0MC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT13dHBfcHJvZDMyLnBuZwotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKG5vdCB0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KLQotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODM5MGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JmMWJhNy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPVdUUCBYU0wgU291cmNlXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpLCBEYXZpZCBDYXJ2ZXIgKFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbClcblwKLWFuZCBvdGhlcnMgMjAwOC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBhNTc1Yy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotCi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLCBhYm91dC5pbmksIGFib3V0Lm1hcHBpbmdzLCBhYm91dC5wcm9wZXJ0aWVzLCB3dHBfcHJvZDMyLnBuZywgcGx1Z2luLnByb3BlcnRpZXMsIHBsdWdpbi54bWwsIHNyYy8qKiwgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMzQxY2EuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1wbHVnaW5OYW1lPVdUUCBYU0wgU291cmNlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLmdpZiBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVmYjQ0YS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5wbmcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmY2VhYjMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjQ5ZTlmLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPVwKLWVwbC12MTAuaHRtbCxcCi1lY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLWZlYXR1cmUueG1sLFwKLWZlYXR1cmUucHJvcGVydGllcyxcCi1saWNlbnNlLmh0bWwKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjJhZDI5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFkOTVmZi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9WFNMIFRvb2xzIERldmVsb3BlciBSZXNvdXJjZXMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1Tb3VyY2UgY29kZSBXVFAgWFNMLgotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDggRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSxcblwKLURhdmlkIENhcnZlciAoU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsKSBhbmQgb3RoZXJzIDIwMDguXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWspXG5cCi0gICAgRGF2aWQgQ2FydmVyIChTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwgLSBodHRwOi8vd3d3LnN0YXJzdGFuZGFyZC5vcmcpXG5cCi0gICAgSmVzcGVyIE1vbGxlciAoTmluZUNvbnN1bHQgLSBodHRwOi8vd3d3Lm5pbmVjb25zdWx0LmRrKVxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSwgMjAwOFxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVjNGE0OC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+SnVuZSAwNiwgMjAwNzwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLSAgPExJPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYTVhNDAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9d3RwX3Byb2QzMi5wbmcKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgzOTBhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3Yzk4YjEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9V1RQIFhTTCBTb3VyY2VcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCksIERhdmlkIENhcnZlciAoU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsKVxuXAotYW5kIG90aGVycyAyMDA4LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGE1NzVjLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0KLWJpbi5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsIGFib3V0LmluaSwgYWJvdXQubWFwcGluZ3MsIGFib3V0LnByb3BlcnRpZXMsIHd0cF9wcm9kMzIucG5nLCBwbHVnaW4ucHJvcGVydGllcywgcGx1Z2luLnhtbCwgc3JjLyoqLCBNRVRBLUlORi8KLXNvdXJjZVBsdWdpbiA9IHRydWUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIzNDFjYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLXBsdWdpbk5hbWU9V1RQIFhTTCBTb3VyY2UKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIuZ2lmIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWZiNDRhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLnBuZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZjZWFiMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsX3Nkay5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbF9zZGsuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE1NTRlNC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsX3Nkay5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnhzbF9zZGsuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2xfc2RrLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbF9zZGsuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NTBkZjEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbF9zZGsuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNTdW4gRGVjIDE2IDE2OjU3OjU3IEVTVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2xfc2RrLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2xfc2RrLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRkODU2OC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsX3Nkay5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jRnJpIEphbiAwNCAwOTowNDo0MyBFU1QgMjAwOAotY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0xCi1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLm1pc3NpbmctYnVuZGxlLWNsYXNzcGF0aC1lbnRyaWVzPTAKLWNvbXBpbGVycy5wLm1pc3NpbmctcGFja2FnZXM9MgotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MQotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MQotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwM2NiNzYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbF9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCi0KLWdlbmVyYXRlLmZlYXR1cmVAb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlLnNvdXJjZT1vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2xfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2xfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsX3Nkay5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2xfc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2xfc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2xfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbF9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMDY5MTguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbF9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVhTTCBUb29scyBTREsgKEluY3ViYXRpbmcpCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249WFNMVCBFZGl0b3IsIHZhbGlkYXRvciwgbGF1bmNoaW5nIGFuZCBkZWJ1Z2dpbmcgc3VwcG9ydAotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDggRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSxcblwKLURhdmlkIENhcnZlciAoU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsKSBhbmQgb3RoZXJzIDIwMDguXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWspXG5cCi0gICAgRGF2aWQgQ2FydmVyIChTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwgLSBodHRwOi8vd3d3LnN0YXJzdGFuZGFyZC5vcmcpXG5cCi0gICAgSmVzcGVyIE1vbGxlciAoTmluZUNvbnN1bHQgLSBodHRwOi8vd3d3Lm5pbmVjb25zdWx0LmRrKVxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbF9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2xfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ZGU3ODAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbF9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2xfc2RrLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS4wLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICAgICA8ZGlzY292ZXJ5IGxhYmVsPSJXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgVXBkYXRlcyIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcyIvPgotICAgPC91cmw+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS5zb3VyY2UiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5zZGsuZG9jdW1lbnRhdGlvbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbF9zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsX3Nkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAzZTY2NS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsX3Nkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L0E+KQotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L0E+KQotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0gIAotICA8TEk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvQT4pIDwvTEk+Ci0gIAotICA8bGk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+Cg==